Name: series-workflowx7knp Phase: Failed StartedAt: 2026-09-12 08:51:06 +0000 UTC FinishedAt: 2026-09-12 09:09:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx7knp[0] Phase: Succeeded StartedAt: 2026-09-12 08:51:06 +0000 UTC FinishedAt: 2026-09-12 09:09:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx7knp[0].run-triage Phase: Succeeded StartedAt: 2026-09-12 08:51:06 +0000 UTC FinishedAt: 2026-09-12 09:09:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjZjc5ZDA5NDQxNGE2ZTYzMjk2ZWQzM2EzM2Y2YjlkNzgzMmRhNGJjXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXG5pbmRleCBiNWE1MWIwZWY5NDQwLi5mZjk1NjVkM2ZmYTU5IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L0tjb25maWdcbkBAIC0zOCw2ICYjNDM7MzgsNyBAQCBjb25maWcgQVJNNjRcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUXG4gXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbiYjNDM7XHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbiBcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlRcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuQEAgLTI5Myw2ICYjNDM7MjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7XG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxuJiM0MztcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuaW5kZXggYjdjYzExZTRmYmZhNi4uNjI2NjBiZjUyMGE4ZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5AQCAtMzEwLDUgJiM0MzszMTAsNiBAQCBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCYjMzQ7XG4mIzQzO3NvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wmIzM0O1xuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuaW5kZXggYmU0NmYxZTFkYzc3Zi4uMTk2YTY1MGNjZjAyNSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbkBAIC0zOSwzICYjNDM7MzksNCBAQCBvYmoteVx0XHRcdFx0JiM0Mzs9IHNhbXN1bmcvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSBzbWNjYy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQmIzQzOz0geGlsaW54L1xuJiM0MztvYmoteVx0XHRcdFx0JiM0Mzs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5AQCAtMCwwICYjNDM7MSwyNiBAQFxuJiM0MztcbiYjNDM7Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXG4mIzQzO1x0Ym9vbFxuJiM0MztcbiYjNDM7Y29uZmlnIEFSTV9STU1fUk1JXG4mIzQzO1x0Ym9vbCBcJiMzNDtSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XCYjMzQ7XG4mIzQzO1x0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTVxuJiM0MztcdGRlZmF1bHQgeVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0XG4mIzQzO1x0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxuJiM0MztcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cbiYjNDM7XG4mIzQzO1x0ICBUaGUgUk1NIHJ1bnMgYXQgRUwyIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtXG4mIzQzO1x0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxuJiM0MztcdCAgbWFuYWdlIGFuZCBydW4gcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhlIFJNTSBjYW5cbiYjNDM7XHQgIGFsc28gYWN0IGFzIGEgVFNNLCBhcyBkZWZpbmVkIGJ5IHRoZSBQQ0llIFRESVNQIGFuZCBjYW4gbWFuYWdlIHRoZVxuJiM0MztcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXG4mIzQzO1xuJiM0MztcdCAgVGhpcyBvcHRpb24gYnVpbGRzIHRoZSBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGFcbiYjNDM7XHQgIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmUgaXQsIG1hbmFnZSBkZWxlZ2F0ZWQgbWVtb3J5IGFuZCBlbmFibGVcbiYjNDM7XHQgIFJlYWxtIGd1ZXN0cy5cbiYjNDM7XG4mIzQzO1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbiYjNDM7XHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSwyIEBAXG4mIzQzO1xuJiM0MztvYmotJChDT05GSUdfQVJNX1JNTV9STUkpXHQ9IHJtaS5vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNTgzZTFhY2E5YjE1YVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICYjNDM7MSw5OTkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xuJiM0MztcbiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXHQyXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdIF9fcm9fYWZ0ZXJfaW5pdDtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXG4mIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXG4mIzQzOyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbiYjNDM7ICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxuJiM0MzsgKlxuJiM0MzsgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxuJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbiYjNDM7ICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4mIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9jYXRlZ29yeSlcbiYjNDM7XHRcdCpvdXRfY2F0ZWdvcnkgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfc3RhdGUpXG4mIzQzO1x0XHQqb3V0X3N0YXRlID0gcmVncy5hMjtcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXG4mIzQzOyAqIEBzdGFydDogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcbiYjNDM7ICpcdFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcbiYjNDM7ICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW3N0YXJ0LCBvdXRfdG9wKVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncHRfaW5mbyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9ncHRfcGFyX3N0YXRlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUFRfSU5GTywgc3RhcnQsIGVuZCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuJiM0MztcdGlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSlcbiYjNDM7XHRcdCpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBSTUlfU1VDQ0VTUztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXG4mIzQzOyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIGFyZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0ZFQVRVUkVTLCBpbmRleFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2YXJncyk7XG4mIzQzO1x0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dClcbiYjNDM7XHRcdCpvdXQgPSBhcmdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYXJncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU1cbiYjNDM7ICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcbiYjNDM7ICpcbiYjNDM7ICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3JtbV9jb25maWdfc2V0KHVuc2lnbmVkIGxvbmcgY2ZnX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTihpbmRleCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuJiM0MztcdFx0XHQgdW5zaWduZWQgbG9uZyBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsIFx1MDAyNm91dF90b3ApO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdFx0LyogQnVnZ3kgUk1NID8gTGV0IHRoZSBjYWxsZXIgbGVhayB0aGUgcGFnZXMgKi9cbiYjNDM7XHRcdFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcdTAwM2M9IHBoeXMpKVxuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4mIzQzO1x0XHRcdC8qIEJ1Z2d5IFJNTSA/ICovXG4mIzQzO1x0XHRcdGlmIChXQVJOX09OKG91dF90b3AgXHUwMDNjPSBwaHlzKSkge1xuJiM0MztcdFx0XHRcdHJtaV91bmRlbGVnYXRlX3JhbmdlKHRvcCAtIHNpemUsIHNpemUpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0cGh5cyA9IG91dF90b3A7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfcGh5cylcbiYjNDM7XHRcdCpvdXRfcGh5cyA9IHBoeXM7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvbnZlcnQgdGhlIFJtaUFkZHJCbG9ja1NpemUgdG8gYWN0dWFsIHNpemUuIFRoaXMgaXMgdXNlZCBpbiBSbWlEb25hdGVSZXFcbiYjNDM7ICogYW5kIFJtaUFkZHJSYW5nZURlc2MqLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyh1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5XG4mIzQzOyAqXHRcdCAgICBiZSBwYXJ0aWFsbHkgY29uc3VtZWQgYnkgUk1NLlxuJiM0MzsgKlxuJiM0MzsgKiBAZW50cnk6IFJNSV9BRERSX1JBTkdFIGRlc2NyaXB0b3JcbiYjNDM7ICogQGNvbnN1bWVkX3NpemU6IFBhZ2UgYWxpZ25lZCBzaXplIGNvbnN1bWVkIGJ5IHRoZSBSTU0gZnJvbSB0aGUgYWRkcmVzcyByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogSWYgdGhlIHN0YXRlIG9mIHRoZSBhZGRyZXNzIGlzIERFTEVHQVRFRCwgdW5kZWxlZ2F0ZSBpdCBiYWNrLCBiZWZvcmUgZnJlZWluZy5cbiYjNDM7ICogTGVha3MgdGhlIG1lbW9yeSBpZiB3ZSBjYW5ub3QgdW5kZWxlZ2F0ZSB0aGUgcmFuZ2UuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBmcmVlX2FkZHJfcmFuZ2UodW5zaWduZWQgbG9uZyBlbnRyeSwgdW5zaWduZWQgbG9uZyBjb25zdW1lZF9zaXplKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUoZW50cnkpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKSAqIGNvdW50O1xuJiM0MztcbiYjNDM7XHRXQVJOX09OKCFQQUdFX0FMSUdORUQocGh5cykgfHwgIVBBR0VfQUxJR05FRChjb25zdW1lZF9zaXplKSk7XG4mIzQzO1xuJiM0MztcdC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBmb3IgcGFydGlhbGx5IGNvbnN1bWVkIGVudHJ5ICovXG4mIzQzO1x0cGh5cyAmIzQzOz0gY29uc3VtZWRfc2l6ZTtcbiYjNDM7XHRzaXplIC09IGNvbnN1bWVkX3NpemU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4mIzM5O3RcbiYjNDM7XHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIFdBUk5fT04ocm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSkpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KHBoeXMpLCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xuJiM0MztcdFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxuJiM0MztcdCAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvclxuJiM0MztcdCAqL1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4mIzQzO1x0XHQvKiBVbmRlbGVnYXRlIGZhaWxlZDogbGVhayB0aGUgcGFnZSAqL1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBjb3VudClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbiYjNDM7XHRcdHJldHVybiAtRU9WRVJGTE9XO1xuJiM0MztcbiYjNDM7XHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT1NQQztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuJiM0MztcdFx0XHRcdCBnZnBfdCBnZnApXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJsb2NrX3NpemUgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0dm9pZCAqdmlydDtcbiYjNDM7XHRwaHlzX2FkZHJfdCBwaHlzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxuJiM0MztcdCAqIHBvd2VyIG9mIDJcbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLCAxLFxuJiM0MztcdFx0XHQgIDAsIG91dF9yZWdzKTtcbiYjNDM7XHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIChzaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSkpXG4mIzQzO1x0XHRkb25hdGVkX2dyYW51bGVzID0gKHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuJiM0MztcbiYjNDM7XHRkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuJiM0MztcbiYjNDM7XHQvKiBBbGwgZ3JhbnVsZXMgY29uc3VtZWQgYnkgdGhlIFJNTSAqL1xuJiM0MztcdGlmIChkb25hdGVkX3NpemUgPT0gc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdC8qIE5vIGdyYW51bGVzIHdlcmUgY29uc3VtZWQgYnkgdGhlIFJNTSwgY2FjaGUgdGhlbSAqL1xuJiM0MztcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcbiYjNDM7XHRcdHNyby1cdTAwM2VhZGRyX2NvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogVGhlIGdyYW51bGVzIHdlcmUgcGFydGlhbGx5IGNvbnN1bWVkLCByZWNsYWltIHRoZSB1bnVzZWQgb25lcy4gKi9cbiYjNDM7XHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0sIGRvbmF0ZWRfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY29uc3VtZWRfYmxvY2tzO1xuJiM0MztcdGludCBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbiYjNDM7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4mIzQzO1xuJiM0MztcdFx0aWYgKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUoZW50cnkpID09IGJsb2NrX3NpemVfZmxkIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xuJiM0MztcdFx0XHRhZGRyX2xpc3Rfc3RhcnQtLTtcbiYjNDM7XHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXG4mIzQzO1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4mIzQzO1x0XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0aS0tO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGZvdW5kIFx1MDAzYyBjb3VudCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyX3JhbmdlO1xuJiM0MztcdFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KGJsb2NrX3NpemUsIGdmcCk7XG4mIzQzO1x0XHRwaHlzX2FkZHJfdCBwaHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmICghdmlydClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTtcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgY291bnQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0ZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIFJNTSBzaG91bGRuJiMzOTt0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuJiM0MztcdCAqIGp1c3QgaW4gY2FzZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX2Jsb2NrKSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBjb3VudCAqIGdyYW51bGVzX3Blcl9ibG9jaztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXG4mIzQzO1x0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gYmxvY2stc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XG4mIzQzO1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIGJsb2Nrcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF9ibG9ja3MgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX2Jsb2NrO1xuJiM0MztcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSBibG9jayBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxuJiM0MztcdFx0ICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3RcbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XG4mIzQzO1x0XHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGNvbnN1bWVkX2Jsb2Nrc107XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XG4mIzQzO1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHRmcmVlX2FkZHJfcmFuZ2UoZW50cnksIGRvbmF0ZWRfc2l6ZSk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhpcyBibG9jayBpcyBub3cgZnVsbHkgJiMzOTtjb25zdW1lZCYjMzk7IChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4mIzQzO1x0XHQgKiBmcmVlZClcbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Y29uc3VtZWRfYmxvY2tzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgYmxvY2tzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IGNvbnN1bWVkX2Jsb2NrczsgaSBcdTAwM2MgY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX2Jsb2Nrc10gPVxuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfYmxvY2tzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHJlZ3MsIGdmcCk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdHJlZ3MsIGdmcCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSkpXG4mIzQzO1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbiYjNDM7XG4mIzQzO1x0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcbiYjNDM7XHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSxcbiYjNDM7XHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZVxuJiM0MztcdCAgKiBpbnB1dCBwYXJhbWV0ZXJzIHdlcmUgaW52YWxpZC5cbiYjNDM7XHQgICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cdTAwM2VhMSBcdTAwM2UgY2FwYWNpdHkpKVxuJiM0MztcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdC8qIEhhbmRsZSB0aGUgd29yc2UgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTihzcm8tXHUwMDNlYWRkcl9jb3VudCBcdTAwM2MgMCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IFJNSV9NQVhfQUREUl9MSVNUO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0ZnJlZV9hZGRyX3JhbmdlKHNyby1cdTAwM2VhZGRyX2xpc3RbaV0sIDApO1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuJiM0MztcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKHJlZ3MpO1xuJiM0MztcbiYjNDM7XHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuJiM0MztcdFx0XHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWUuXG4mIzQzO1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuJiM0MztcdFx0XHQgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFjYW5fY2FuY2VsKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlXG4mIzQzO1x0XHRcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxuJiM0MztcdFx0XHQgKiBpbiBnb2luZyBpbiBsb29wcy5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuJiM0MztcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApID09IFJNSV9PUF9DQU5fQ0FOQ0VMO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0ZGVmYXVsdDpcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuJiM0MztcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4mIzQzO1x0XHRcdC8qIElmIHdlIGhhdmUgYWxyZWFkeSBjYW5jZWxsZWQsIGRvbiYjMzk7dCByZXRyeSB0aGlzICovXG4mIzQzO1x0XHRcdGlmIChjYW5jZWxsZWQpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4mIzQzO1x0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpO1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xuJiM0MztcdFx0U01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqL1xuJiM0MztcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlcyk7XG4mIzQzO1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1xuJiM0MztcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4mIzQzO1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4mIzQzO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuJiM0MztcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcXG5cJiMzNDssIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuJiM0MztcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTtcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xuJiM0MztcbiYjNDM7XHRzd2l0Y2ggKFBBR0VfU0laRSkge1xuJiM0MztcdGNhc2UgU1pfNEs6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjtcbiYjNDM7XHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl8xNks6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzE2S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFNaXzY0SzpcbiYjNDM7XHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbiYjNDM7XHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRCVUlMRF9CVUcoKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcdTAwMjYgZ3JhbnVsZV9mZWF0dXJlKSkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1JNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIFBBR0VfU0laRSBcdTAwM2VcdTAwM2UgMTApO1xuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWNvbmZpZykge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJNTSBjb25maWdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb25cbiYjNDM7XHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxuJiM0MztcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuJiM0MztcdCAqIFBBR0VfU0laRVNcbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gY29uZmlnIHNldCBmYWlsZWQgKCVkKVxcblwmIzM0OywgcmV0KTtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuJiM0MztcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4mIzQzO1x0XHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcbiYjNDM7XHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4mIzQzO1x0XHRcdHByX2VycihcJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuJiM0MzsgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuJiM0MztcbiYjNDM7XHRsMGdwdF9zeiA9IDFVTCBcdTAwM2NcdTAwM2MgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4mIzQzO1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuJiM0MztcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xuJiM0MztcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRzdGFydCwgbmV4dCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3RhcnQgPSBuZXh0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQoc3RhcnQsIGVuZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuJiM0MztcdFx0aWYgKG1lbWJsb2NrX2lzX25vbWFwKHIpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHN0YXJ0ID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3Bmbik7XG4mIzQzO1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiAmIzQzOyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuJiM0MztcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuJiM0MztcdC5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllcixcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJiMzOTt0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuJiM0MztcdHJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogQWN0aXZhdGUgdGhlIFJNTSAqL1xuJiM0MztcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8pO1xuJiM0MztcdGlmICghc3JvKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1JNTSBhY3RpdmF0ZSBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9pbml0X21ldGFkYXRhKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihcdTAwMjZybWlfbWVtb3J5X25iKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgY29uZmlndXJlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7b3V0X2RlYWN0aXZhdGU6XG4mIzQzO1x0V0FSTl9PTihybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fREVBQ1RJVkFURSkpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuJiM0MzsgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4mIzQzOyAqL1xuJiM0MztzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmQ3ZWY3ZTgyYjI0NlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxuQEAgLTAsMCAmIzQzOzEsNTQwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1Zy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbiYjNDM7XG4mIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4mIzQzO1x0aW50IGFkZHJfY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcm1pX3NtY2NjX2ludm9rZTogSW52b2tlIHRoZSBSTUkgY2FsbCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGluIEByZWdzX291dFxuJiM0MzsgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXG4mIzQzOyAqIEByZWdzX291dDogT3VwdHB1dCByZXN1bHRzIGZyb20gdGhlIGNhbGwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyBhcmdzID0gKnJlZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgxKSB7XG4mIzQzO1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZhcmdzLCByZWdzKTtcbiYjNDM7XHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApO1xuJiM0MztcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNwdV9yZWxheCgpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleCk7XG4mIzQzO1xuJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcbiYjNDM7aW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVzZXR0aW5nIHRoZSBhZGRyX2NvdW50IGlzIHN1ZmZpY2llbnQgdG8gaWdub3JlIHRoZSBhZGRyX2xpc3QgY29udGVudHMuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcdFx0XHRcdFxcXG4mIzQzO1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XHRcdFx0XHRcXFxuJiM0MztcdF9fc3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1x0XHRcdFx0XHRcdFxcXG4mIzQzO1x0X19zcm8tXHUwMDNlcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKXsgX19WQV9BUkdTX18gfTtcdFxcXG4mIzQzO1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIG1hcHBpbmcgYXQgcHJvdGVjdGVkIElQQSwgY29weWluZyBjb250ZW50c1xuJiM0MzsgKlx0XHRcdCAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGUgbWFwcGVkIGluIHRoZSBndWVzdFxuJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4mIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZSB3aXRoIGNvbnRlbnRzXG4mIzQzOyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcbiYjNDM7ICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuJiM0MztcdFx0XHRcdFx0IHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSByYW5nZSB3aXRoIHVua25vd24gY29udGVudHNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkgYXQgYSBwcm90ZWN0ZWRcbiYjNDM7ICpcdFx0XHQgIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuJiM0MzsgKlxuJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcHNjaV9jb21wbGV0ZSh1bnNpZ25lZCBsb25nIGNhbGxpbmdfcmVjLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKlxuJiM0MzsgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlLCBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGVkLCBhbGxvd2luZ1xuJiM0MzsgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHRcbiYjNDM7ICpcbiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fdGVybWluYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4mIzQzOyAqXG4mIzQzOyAqIERlc3Ryb3lzIGEgcmVhbG0sIGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgcmVhbG0gbXVzdCBiZSBkZXN0cm95ZWQgZmlyc3QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19jcmVhdGUoKSAtIENyZWF0ZSBhIFJFQ1xuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiBSRUMgcGFyYW1ldGVyc1xuJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBSRUMgdXNpbmcgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3QgcmVjX3BhcmFtcyBwb2ludGVkXG4mIzQzOyAqIHRvIGJ5IEBwYXJhbXMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHJlYyxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4mIzQzO1x0c3JvLVx1MDAzZXJlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xuJiM0MztcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbiYjNDM7XHR9O1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0cm1pX3Nyb19mcmVlKHNybyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JFQ19FTlRFUiwgcmVjLCBydW5fcHRyLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4mIzQzO1x0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICAgbG9uZyBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3J0dClcbiYjNDM7XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXG4mIzQzOyAqXG4mIzQzOyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAmIzM5O2hvbW9nZW5lb3VzJiMzOTsgdGhlIFJUVCBjYW4gYmVcbiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbiYjNDM7XHRcdFx0XHRsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nICpvdXRfcnR0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfRk9MRCwgcmQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfcnR0KVxuJiM0MztcdFx0Km91dF9ydHQgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X21hcCgpIC0gTWFwIHVucHJvdGVjdGVkIGdyYW51bGVzIGludG8gYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiBtYXBwZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9zZXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgYW4gcnVubmluZyByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbiYjNDM7ICpcbiYjNDM7ICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQVxuJiM0MzsgKiByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfcmFuZ2UpXG4mIzQzO1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRpZiAob3V0X2NvdW50KVxuJiM0MztcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4mIzQzO1xuJiM0MztcdHJldHVybiBSTUlfU1VDQ0VTUztcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIxNGQ2MjI4ZGZjMjJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICYjNDM7MSw0OTcgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuJiM0MzsgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZF9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbiYjNDM7XHRBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbiYjNDM7XHRcdFx0ICAgKGZ1bmMpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2YpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxODYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FXHRcdFNNQ19STUlfQ0FMTCgweDAxZjApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OXHQwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAyNiAweEZGRkYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0tcdFx0R0VOTUFTSyg3LCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1x0XHRHRU5NQVNLKDE1LCA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0R0VOTUFTSyg5LCA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHRCSVQoMTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fTUVNUkVRX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KVx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTXHRcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUkVBTE1cdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1x0XHRcdDNcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUXHRcdFx0NFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXHRcdDVcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfREVWSUNFXHRcdDZcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFx0XHQ3XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXHRcdDhcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfRFBUXHRcdFx0OVxuJiM0MzsjZGVmaW5lIFJNSV9CVVNZXHRcdFx0MTBcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR0xPQkFMXHRcdDExXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXHRcdDEyXG4mIzQzOyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcdFx0XHQxM1xuJiM0MzsjZGVmaW5lIFJNSV9CTE9DS0VEXHRcdFx0MTRcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUXHRcdFx0MTVcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVx0XHQxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfS0VFUF9HT0lOR1x0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEVcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX09QX0NBTl9DQU5DRUxcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0tcdFx0R0VOTUFTSygxOCwgMTcpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1x0XHRCSVQoMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0JMT0NLX1NJWkUocmVxKVx0RklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1VOREVMRUdBVEVEXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTkRJVElPTkFMXHRcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJR1x0XHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfTk9ORVx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfTElTVFx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcdEdFTk1BU0soNjMsIDYyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0R0VOTUFTSyg1MSwgUEFHRV9TSElGVClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKHIpXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSlcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKHIpXHRcdCgocikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURShyKVx0XHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgKHIpKVxuJiM0MztcbiYjNDM7ZW51bSBybWlfcmlwYXMge1xuJiM0MztcdFJNSV9FTVBUWSA9IDAsXG4mIzQzO1x0Uk1JX1JBTSA9IDEsXG4mIzQzO1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4mIzQzO1x0Uk1JX0RFViA9IDMsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJPQVNaXHRcdFx0R0VOTUFTSyg0MCwgMzMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURVx0QklUKDMyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTXHRcdEdFTk1BU0soMzEsIDI3KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VXHRcdFx0QklUKDI2KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRcdEdFTk1BU0soMjUsIDIwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQU1x0XHRcdEdFTk1BU0soMTksIDE0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0XHRCSVQoOSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0XHRCSVQoOClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyU1pcdFx0XHRHRU5NQVNLKDcsIDApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdFx0R0VOTUFTSygxNiwgMTQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0XHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcdFx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdFx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0XHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQlx0XHRCSVQoMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soMTQsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTk9OX1RFRV9TVFJFQU1cdFx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WREVWX0tST1VcdFx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QREVWX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSyg3LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXHRcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVVx0XHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdFx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVx0XHRcdEJJVCgwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXHRCSVQoNilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcdEdFTk1BU0soMywgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcdFx0R0VOTUFTSyg2MywgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0hcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FXHRcdFx0M1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFXHRcdDRcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcdDFcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUkVTRVJWRUQgICAgICAgICAgIDBVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9DUkVBVEVEICAgICAgIDNVXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBOb3RlIG1hbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzbWFsbGVyIHRoYW4gdTY0IGJ1dCBhbGwgZmllbGRzIGhhdmUgdTY0XG4mIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3Qgcm1tX2NvbmZpZyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCB0cmFja2luZ19yZWdpb25fc2l6ZTtcbiYjNDM7XHRcdFx0dTY0IHJtaV9ncmFudWxlX3NpemU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggc2l6ZXJbU1pfNEtdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcdFx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBXHRcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWVx0XHRHRU5NQVNLKDYsIDUpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVx0XHRHRU5NQVNLKDgsIDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XHRcdFx0MlxuJiM0MztcbiYjNDM7c3RydWN0IHJlYWxtX3BhcmFtcyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBmbGFnczA7XG4mIzQzO1x0XHRcdHU2NCBzMnN6O1xuJiM0MztcdFx0XHR1NjQgc3ZlX3ZsO1xuJiM0MztcdFx0XHR1NjQgbnVtX2JwcztcbiYjNDM7XHRcdFx0dTY0IG51bV93cHM7XG4mIzQzO1x0XHRcdHU2NCBwbXVfbnVtX2N0cnM7XG4mIzQzO1x0XHRcdHU2NCBoYXNoX2FsZ287XG4mIzQzO1x0XHRcdHU2NCBudW1fYXV4X3BsYW5lcztcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDQwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NDAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBycHZbNjRdO1xuJiM0MztcdFx0XHR1NjQgYXRzX3BsYW5lO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4NDAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg4MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBwYWRkaW5nMjtcbiYjNDM7XHRcdFx0dTY0IHJ0dF9iYXNlO1xuJiM0MztcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgcnR0X251bV9zdGFydDtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMTtcbiYjNDM7XHRcdFx0dTY0IG1heF9udW1fdmRldnM7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHg3MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweGYwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcGFkZGluZzRbMHg4MF07XG4mIzQzO1x0XHRcdHU2NCBhdXhfcnR0X2Jhc2VbM107XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVhbG1fcGFyYW1zKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgbnVtYmVyIG9mIEdQUnMgKHN0YXJ0aW5nIGZyb20gWDApIHRoYXQgYXJlXG4mIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBSRUNfQ1JFQVRFX05SX0dQUlNcdFx0OFxuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVCgwKVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHR1NjQgbXBpZHI7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgcGM7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX2VudGVyIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MDAwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDIwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHg2MDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUVx0XHRcdDB4MDJcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXHRcdDB4MDVcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1x0MHgwOFxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19leGl0IHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MDAwICovXG4mIzQzO1x0XHR1OCBleGl0X3JlYXNvbjtcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgxMDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBlc3I7XG4mIzQzO1x0XHRcdHU2NCBmYXI7XG4mIzQzO1x0XHRcdHU2NCBocGZhcjtcbiYjNDM7XHRcdFx0dTY0IHJ0dF90cmVlO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NDAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgY250cF9jdGw7XG4mIzQzO1x0XHRcdHU2NCBjbnRwX2N2YWw7XG4mIzQzO1x0XHRcdHU2NCBjbnR2X2N0bDtcbiYjNDM7XHRcdFx0dTY0IGNudHZfY3ZhbDtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NTAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgcmlwYXNfYmFzZTtcbiYjNDM7XHRcdFx0dTY0IHJpcGFzX3RvcDtcbiYjNDM7XHRcdFx0dTggcmlwYXNfdmFsdWU7XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc1WzB4Zl07XG4mIzQzO1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCBzMmFwX3RvcDtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMTtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMjtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9wYTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1MTYgaW1tO1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nN1sweDZdO1xuJiM0MztcdFx0XHR1NjQgcGxhbmU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzhbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDcwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc5WzB4Zl07XG4mIzQzO1x0XHRcdHU2NCB2c21tdTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMTBbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfcnVuIHtcbiYjNDM7XHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuJiM0MztcdHN0cnVjdCByZWNfZXhpdCBleGl0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQXHRcdEdFTk1BU0soMjIsIDE5KVxuJiM0MztcbiYjNDM7LyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbiYjNDM7XG4mIzQzOy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xuJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVx0XHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjZjc5ZDA5NDQxNGE2ZTYzMjk2ZWQzM2EzM2Y2YjlkNzgzMmRhNGJjCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0CiAJc2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFCiAJc2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTCiYjNDM7CXNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTQogCXNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFMKIAlzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0UKIAlzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKQEAgLTI5Myw2ICYjNDM7MjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSwKJiM0MzsJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKaW5kZXggYjdjYzExZTRmYmZhNi4uNjI2NjBiZjUyMGE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtMzEwLDUgJiM0MzszMTAsNiBAQCBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWcmIzM0OwomIzQzO3NvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnJiMzNDsKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggYmU0NmYxZTFkYzc3Zi4uMTk2YTY1MGNjZjAyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCkBAIC0zOSwzICYjNDM7MzksNCBAQCBvYmoteQkJCQkmIzQzOz0gc2Ftc3VuZy8KIG9iai15CQkJCSYjNDM7PSBzbWNjYy8KIG9iai15CQkJCSYjNDM7PSB0ZWdyYS8KIG9iai15CQkJCSYjNDM7PSB4aWxpbngvCiYjNDM7b2JqLXkJCQkJJiM0Mzs9IGFybV9ybW0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZwpAQCAtMCwwICYjNDM7MSwyNiBAQAomIzQzOwomIzQzO2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTQomIzQzOwlib29sCiYjNDM7CiYjNDM7Y29uZmlnIEFSTV9STU1fUk1JCiYjNDM7CWJvb2wgJiMzNDtSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0JiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTQomIzQzOwlkZWZhdWx0IHkKJiM0MzsJaGVscAomIzQzOwkgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0CiYjNDM7CSAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGUKJiM0MzsJICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLgomIzQzOwomIzQzOwkgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0KJiM0MzsJICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLAomIzQzOwkgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuCiYjNDM7CSAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlCiYjNDM7CSAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuCiYjNDM7CiYjNDM7CSAgVGhpcyBvcHRpb24gYnVpbGRzIHRoZSBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlCiYjNDM7CSAgUmVhbG0gZ3Vlc3RzLgomIzQzOwomIzQzOwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOgomIzQzOwkgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYQomIzQzOwkgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjY1MTcxOTg4ZmRjYWUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUKQEAgLTAsMCAmIzQzOzEsMiBAQAomIzQzOwomIzQzO29iai0kKENPTkZJR19BUk1fUk1NX1JNSSkJPSBybWkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjU4M2UxYWNhOWIxNWEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMKQEAgLTAsMCAmIzQzOzEsOTk5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NwdWZlYXR1cmUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtYmxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtb3J5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1ybWktY21kcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9tZW1vcnkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YXNtL3BndGFibGUtaHdkZWYuaCZndDsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzOwomIzQzOy8qIEN1cnJlbnRseSBvbmx5IHRoZSBmaXJzdCAyIHJlZ2lzdGVycyBhcmUgdXNlZCBieSBMaW51eCAqLwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UCTIKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXSBfX3JvX2FmdGVyX2luaXQ7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZQomIzQzOyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZQomIzQzOyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkCiYjNDM7ICoKJiM0MzsgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2UKJiM0MzsgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkCiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWYKJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb24KJiM0MzsgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvbgomIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeQomIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZQomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb24KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VULCBzdGFydCwgZW5kLAomIzQzOwl9OwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJcmV0dXJuIHJlZ3MuYTA7CiYjNDM7CiYjNDM7CWlmIChvdXRfY2F0ZWdvcnkpCiYjNDM7CQkqb3V0X2NhdGVnb3J5ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF9zdGF0ZSkKJiM0MzsJCSpvdXRfc3RhdGUgPSByZWdzLmEyOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIFJNSV9TVUNDRVNTOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi4KJiM0MzsgKiBAc3RhcnQ6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbgomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaAomIzQzOyAqCQl0aGUgR1BUIEBvdXRfZ3B0X3Bhcl9zdGF0ZSBpcyB2YWxpZAomIzQzOyAqIEBvdXRfZ3B0X3Bhcl9zdGF0ZTogU3RhdGUgb2YgdGhlIEdQVCBjb3ZlcmVkIGJ5IFtzdGFydCwgb3V0X3RvcCkKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1BUX0lORk8sIHN0YXJ0LCBlbmQsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzKTsKJiM0MzsJaWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQlyZXR1cm4gcmVncy5hMDsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CWlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSkKJiM0MzsJCSpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiBSTUlfU1VDQ0VTUzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXIKJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXgKJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9IHsKJiM0MzsJCVNNQ19STUlfRkVBVFVSRVMsIGluZGV4CiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDthcmdzKTsKJiM0MzsJaWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXQpCiYjNDM7CQkqb3V0ID0gYXJncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIGFyZ3MuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU0KJiM0MzsgKiBAY2ZnX3B0cjogUEEgb2YgYSBzdHJ1Y3Qgcm1tX2NvbmZpZwomIzQzOyAqCiYjNDM7ICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleCkKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OKGluZGV4ICZndDs9IFJNSV9GRUFUX1JFR19DT1VOVCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7CiYjNDM7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJCS8qIEJ1Z2d5IFJNTSA/IExldCB0aGUgY2FsbGVyIGxlYWsgdGhlIHBhZ2VzICovCiYjNDM7CQkJaWYgKFdBUk5fT04ob3V0X3RvcCAmbHQ7PSBwaHlzKSkKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKQomIzQzO3sKJiM0MzsJbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJCS8qIEJ1Z2d5IFJNTSA/ICovCiYjNDM7CQkJaWYgKFdBUk5fT04ob3V0X3RvcCAmbHQ7PSBwaHlzKSkgewomIzQzOwkJCQlybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQkJcGh5cyA9IG91dF90b3A7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChvdXRfcGh5cykKJiM0MzsJCSpvdXRfcGh5cyA9IHBoeXM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBSbWlBZGRyQmxvY2tTaXplIHRvIGFjdHVhbCBzaXplLiBUaGlzIGlzIHVzZWQgaW4gUm1pRG9uYXRlUmVxCiYjNDM7ICogYW5kIFJtaUFkZHJSYW5nZURlc2MqLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXModW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gYmxvY2tfc2l6ZV9mbGQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5CiYjNDM7ICoJCSAgICBiZSBwYXJ0aWFsbHkgY29uc3VtZWQgYnkgUk1NLgomIzQzOyAqCiYjNDM7ICogQGVudHJ5OiBSTUlfQUREUl9SQU5HRSBkZXNjcmlwdG9yCiYjNDM7ICogQGNvbnN1bWVkX3NpemU6IFBhZ2UgYWxpZ25lZCBzaXplIGNvbnN1bWVkIGJ5IHRoZSBSTU0gZnJvbSB0aGUgYWRkcmVzcyByYW5nZS4KJiM0MzsgKgomIzQzOyAqIElmIHRoZSBzdGF0ZSBvZiB0aGUgYWRkcmVzcyBpcyBERUxFR0FURUQsIHVuZGVsZWdhdGUgaXQgYmFjaywgYmVmb3JlIGZyZWVpbmcuCiYjNDM7ICogTGVha3MgdGhlIG1lbW9yeSBpZiB3ZSBjYW5ub3QgdW5kZWxlZ2F0ZSB0aGUgcmFuZ2UuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZnJlZV9hZGRyX3JhbmdlKHVuc2lnbmVkIGxvbmcgZW50cnksIHVuc2lnbmVkIGxvbmcgY29uc3VtZWRfc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpICogY291bnQ7CiYjNDM7CiYjNDM7CVdBUk5fT04oIVBBR0VfQUxJR05FRChwaHlzKSB8fCAhUEFHRV9BTElHTkVEKGNvbnN1bWVkX3NpemUpKTsKJiM0MzsKJiM0MzsJLyogQWRqdXN0IHRoZSBhZGRyZXNzIGFuZCBzaXplIGZvciBwYXJ0aWFsbHkgY29uc3VtZWQgZW50cnkgKi8KJiM0MzsJcGh5cyAmIzQzOz0gY29uc3VtZWRfc2l6ZTsKJiM0MzsJc2l6ZSAtPSBjb25zdW1lZF9zaXplOwomIzQzOwkvKgomIzQzOwkgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4mIzM5O3QKJiM0MzsJICogY2hhbmdlIHRoZW0gYmFjaywgbGVhayB0aGUgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQgJmFtcDsmYW1wOwomIzQzOwkgICAgV0FSTl9PTihybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplKSkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KHBoeXMpLCBzaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwkqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwkqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGUKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCSAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJKm91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHsKJiM0MzsJCVNNQ19STUlfT1BfTUVNX0RPTkFURSwgc3JvX2hhbmRsZSwgbGlzdF9hZGRyLCBsaXN0X2NvdW50LCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZQomIzQzOwkgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKJiM0MzsJICovCiYjNDM7CXJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfYWRkciwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CSpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXMpKSkgewomIzQzOwkJLyogVW5kZWxlZ2F0ZSBmYWlsZWQ6IGxlYWsgdGhlIHBhZ2UgKi8KJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gYmxvY2tfc2l6ZSAqIGNvdW50OwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlczsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemU7CiYjNDM7CWludCByZXQ7CiYjNDM7CXZvaWQgKnZpcnQ7CiYjNDM7CXBoeXNfYWRkcl90IHBoeXM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYQomIzQzOwkgKiBwb3dlciBvZiAyCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlICZhbXA7JmFtcDsKJiM0MzsJCSAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkgewomIzQzOwkJCXNyby0mZ3Q7YWRkcl9jb3VudC0tOwomIzQzOwkJCXN3YXAoc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSwKJiM0MzsJCQkgICAgIHNyby0mZ3Q7YWRkcl9saXN0W2ldKTsKJiM0MzsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7CiYjNDM7CWlmICghdmlydCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwlwaHlzID0gdmlydF90b19waHlzKHZpcnQpOwomIzQzOwomIzQzOwlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCXBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzOwomIzQzOwomIzQzOwkJaWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplLCAmYW1wO2RlbGVnYXRlZF9waHlzKSkgewomIzQzOwkJCWlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSkKJiM0MzsJCQkJZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBzaXplKTsKJiM0MzsJCQlyZXR1cm4gLUVOWElPOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWFkZHJfcmFuZ2UgPSBwaHlzICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSzsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGNvdW50KTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdID0gYWRkcl9yYW5nZTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwgMSwKJiM0MzsJCQkgIDAsIG91dF9yZWdzKTsKJiM0MzsJZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT04oZG9uYXRlZF9ncmFudWxlcyAmZ3Q7IChzaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQpKSkKJiM0MzsJCWRvbmF0ZWRfZ3JhbnVsZXMgPSAoc2l6ZSAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKJiM0MzsKJiM0MzsJZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKiBBbGwgZ3JhbnVsZXMgY29uc3VtZWQgYnkgdGhlIFJNTSAqLwomIzQzOwlpZiAoZG9uYXRlZF9zaXplID09IHNpemUpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJLyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovCiYjNDM7CWlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHsKJiM0MzsJCXNyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBUaGUgZ3JhbnVsZXMgd2VyZSBwYXJ0aWFsbHkgY29uc3VtZWQsIHJlY2xhaW0gdGhlIHVudXNlZCBvbmVzLiAqLwomIzQzOwlmcmVlX2FkZHJfcmFuZ2Uoc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgICAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlczsKJiM0MzsJdW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY29uc3VtZWRfYmxvY2tzOwomIzQzOwlpbnQgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGFkZHJfbGlzdF9zdGFydCAmYW1wOyZhbXA7IGZvdW5kICZsdDsgY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHsKJiM0MzsJCQlhZGRyX2xpc3Rfc3RhcnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CQkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwkJCWktLTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd2hpbGUgKGZvdW5kICZsdDsgY291bnQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJCXZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdChibG9ja19zaXplLCBnZnApOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJCWlmICghdmlydCkKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsCiYjNDM7CQkJCQkgICAgICAgJmFtcDtkZWxlZ2F0ZWRfcGh5cykpIHsKJiM0MzsJCQkJaWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKQomIzQzOwkJCQkJZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJCUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIDEpOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwkJc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50JiM0MzsmIzQzO10gPSBhZGRyX3JhbmdlOwomIzQzOwkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdKSwKJiM0MzsJCQkgIGNvdW50LCAwLCBvdXRfcmVncyk7CiYjNDM7CiYjNDM7CWRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXAKJiM0MzsJICoganVzdCBpbiBjYXNlLgomIzQzOwkgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzICZndDsgZm91bmQgKiBncmFudWxlc19wZXJfYmxvY2spKQomIzQzOwkJZG9uYXRlZF9ncmFudWxlcyA9IGNvdW50ICogZ3JhbnVsZXNfcGVyX2Jsb2NrOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlCiYjNDM7CSAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIGJsb2NrLXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldAomIzQzOwkgKiB0aGUgbnVtYmVyIG9mIChjb21wbGV0ZSkgY29uc3VtZWQgYmxvY2tzLgomIzQzOwkgKi8KJiM0MzsJY29uc3VtZWRfYmxvY2tzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl9ibG9jazsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfYmxvY2spIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBBIGJsb2NrIGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5CiYjNDM7CQkgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdAomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0KJiM0MzsJCQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfYmxvY2tzXTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0KJiM0MzsJCQkoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJCWZyZWVfYWRkcl9yYW5nZShlbnRyeSwgZG9uYXRlZF9zaXplKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGlzIGJsb2NrIGlzIG5vdyBmdWxseSAmIzM5O2NvbnN1bWVkJiMzOTsgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3IKJiM0MzsJCSAqIGZyZWVkKQomIzQzOwkJICovCiYjNDM7CQljb25zdW1lZF9ibG9ja3MmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEtlZXAganVzdCB0aGUgYmxvY2tzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovCiYjNDM7CWZvciAoaW50IGkgPSBjb25zdW1lZF9ibG9ja3M7IGkgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX2Jsb2Nrc10gPQomIzQzOwkJCXNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50IC09IGNvbnN1bWVkX2Jsb2NrczsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLAomIzQzOwkJCSAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncywKJiM0MzsJCQkgIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkgICAgIHJlZ3MsIGdmcCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLAomIzQzOwkJCQkJCXJlZ3MsIGdmcCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OwomIzQzOwomIzQzOwlpZiAocm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKSkKJiM0MzsJCXJtaV9zcm9fZnJlZShzcm8pOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwomIzQzOwlybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSwKJiM0MzsJCQkgICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwKJiM0MzsJCQkgICBjYXBhY2l0eSwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZQomIzQzOwkgICogaW5wdXQgcGFyYW1ldGVycyB3ZXJlIGludmFsaWQuCiYjNDM7CSAgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLSZndDthMSAmZ3Q7IGNhcGFjaXR5KSkKJiM0MzsJCW91dF9yZWdzLSZndDthMSA9IGNhcGFjaXR5OwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwkvKiBIYW5kbGUgdGhlIHdvcnNlICovCiYjNDM7CWlmIChXQVJOX09OKHNyby0mZ3Q7YWRkcl9jb3VudCAmbHQ7IDApKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTihzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlzcm8tJmd0O2FkZHJfY291bnQgPSBSTUlfTUFYX0FERFJfTElTVDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJZnJlZV9hZGRyX3JhbmdlKHNyby0mZ3Q7YWRkcl9saXN0W2ldLCAwKTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ID0gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSAmYW1wO3Nyby0mZ3Q7cmVnczsKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlOwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKHJlZ3MpOwomIzQzOwomIzQzOwlzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CXdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgPT0gUk1JX0lOQ09NUExFVEUpIHsKJiM0MzsJCWJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLSZndDthMCkgPT0gUk1JX09QX0NBTl9DQU5DRUw7CiYjNDM7CQlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtJmd0O2EyLCByZWdzLAomIzQzOwkJCQkJICAgICBnZnApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOgomIzQzOwkJCXJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQlyZXQgPSBXQVJOX09OX09OQ0UoMSk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYQomIzQzOwkJCSAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbiYjMzk7dCBiZSBhbiBpc3N1ZS4KJiM0MzsJCQkgKiBIb3dldmVyLCBpZiB3ZSBlbmNvdW50ZXIgYSByYW5kb20gZmFpbHVyZSAoZS5nLiwKJiM0MzsJCQkgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpCiYjNDM7CQkJCXJldHVybiByZXQ7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlCiYjNDM7CQkJICogdG8gYW4gZXJyb3IgaW4gTUVNUkVRLCB0aGVuIHRoZXJlIGlzIG5vIHBvaW50CiYjNDM7CQkJICogaW4gZ29pbmcgaW4gbG9vcHMuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShjYW5jZWxsZWQpKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWNhbmNlbGxlZCA9IHRydWU7CiYjNDM7CiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgIT0gUk1JX0lOQ09NUExFVEUpKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjYW5jZWxsZWQpCiYjNDM7CQlyZXR1cm4gLUVDQU5DRUxFRDsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlZ3MtJmd0O2EwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7CiYjNDM7CiYjNDM7LyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi8KJiM0Mztsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKQomIzQzO3sKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UocmVncyk7CiYjNDM7CiYjNDM7CXNyb19oYW5kbGUgPSByZWdzLSZndDthMTsKJiM0MzsJd2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKSA9PSBSTUlfSU5DT01QTEVURSkgewomIzQzOwkJYm9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtJmd0O2EwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCVdBUk5fT05fT05DRSgxKTsKJiM0MzsJCQlpZiAoIWNhbl9jYW5jZWwpCiYjNDM7CQkJCXJldHVybiByZWdzLSZndDthMDsKJiM0MzsJCQkvKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBkb24mIzM5O3QgcmV0cnkgdGhpcyAqLwomIzQzOwkJCWlmIChjYW5jZWxsZWQpCiYjNDM7CQkJCXJldHVybiAtRUNBTkNFTEVEOwomIzQzOwkJCXJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7CiYjNDM7CQkJY2FuY2VsbGVkID0gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOwomIzQzOwl1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sCiYjNDM7CQkJCQkJICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwl1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZXMgPSB7CiYjNDM7CQlTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJLyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqLwomIzQzOwlpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3Jlcyk7CiYjNDM7CWlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwl2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpOwomIzQzOwl2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwICE9IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQl1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjsKJiM0MzsKJiM0MzsJCWhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTsKJiM0MzsJCWhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTsKJiM0MzsKJiM0MzsJCXByX2VycigmIzM0O1Vuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcbiYjMzQ7LAomIzQzOwkJICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsCiYjNDM7CQkgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsCiYjNDM7CQkgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcbiYjMzQ7LCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZCkKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFNpbmNlIHdlJiMzOTt2ZSBuZWdvdGlhdGVkIGEgY29tcGF0aWJsZSB2ZXJzaW9uIHRoZXNlIGZlYXR1cmUgcmVnaXN0ZXJzCiYjNDM7CSAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlCiYjNDM7CSAqLwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCAmYW1wO3JtaV9mZWF0X3JlZ19jYWNoZVtpXSkpKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9mZWF0dXJlOwomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTsKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CXN0cnVjdCBybW1fY29uZmlnICpjb25maWc7CiYjNDM7CiYjNDM7CXN3aXRjaCAoUEFHRV9TSVpFKSB7CiYjNDM7CWNhc2UgU1pfNEs6CiYjNDM7CQlncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfMTZLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCOwomIzQzOwkJZ3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfNjRLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV82NEtCOwomIzQzOwkJZ3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlCVUlMRF9CVUcoKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIShybWlfZmVhdF9yZWcoMSkgJmFtcDsgZ3JhbnVsZV9mZWF0dXJlKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGRvZXMgbm90IHN1cHBvcnQgJWx1S0IgZ3JhbnVsZXNcbiYjMzQ7LAomIzQzOwkJICAgICAgIFBBR0VfU0laRSAmZ3Q7Jmd0OyAxMCk7CiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFjb25maWcpIHsKJiM0MzsJCXByX2VycigmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJNTSBjb25maWdcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uCiYjNDM7CSAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuCiYjNDM7CSAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlcgomIzQzOwkgKiBQQUdFX1NJWkVTCiYjNDM7CSAqLwomIzQzOwljb25maWctJmd0O3RyYWNraW5nX3JlZ2lvbl9zaXplID0gMDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcbiYjMzQ7LCByZXQpOwomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS4KJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDsKJiM0MzsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCAmYW1wO2NhdGVnb3J5LCAmYW1wO3N0YXRlLCAmYW1wO25leHQpOwomIzQzOwkJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCWlmIChzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fAomIzQzOwkJICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7CiYjNDM7CQkJLyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovCiYjNDM7CQkJcHJfZXJyKCYjMzQ7R3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbiYjMzk7dCBmaW5lL2NvbnZlbnRpb25hbDogJWxseC0lbHhcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBzdGFydCwgbmV4dCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CQl9CiYjNDM7CQlzdGFydCA9IG5leHQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdAomIzQzOyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGwwZ3B0X3N6OwomIzQzOwl1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTsKJiM0MzsKJiM0MzsJbDBncHRfc3ogPSAxVUwgJmx0OyZsdDsgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osCiYjNDM7CQkJCQkgIHJtaV9mZWF0X3JlZygxKSkpOwomIzQzOwlzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTsKJiM0MzsJZW5kID0gQUxJR04oZW5kLCBsMGdwdF9zeik7CiYjNDM7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJbG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgJmFtcDtuZXh0LCAmYW1wO3Bhcl9zdGF0ZSk7CiYjNDM7CiYjNDM7CQlpZiAocmV0ICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJaWYgKHBhcl9zdGF0ZSAhPSBSTUlfR1BUX1BBUl9QTEFUKSB7CiYjNDM7CQkJcHJfZXJyKCYjMzQ7R1BUIGZvciB0aGUgcmVnaW9uIGlzIG5vdCBtYW5hZ2VkIGJ5IGZpcm13YXJlICVsbHgtJWx4XG4mIzM0OywKJiM0MzsJCQkJc3RhcnQsIG5leHQpOwomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwkJfQomIzQzOwkJc3RhcnQgPSBuZXh0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcoc3RhcnQsIGVuZCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlpbnQgcmV0OwomIzQzOwomIzQzOwkJLyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovCiYjNDM7CQlpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsJCWVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJcmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJaWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKQomIzQzOwkJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzOwomIzQzOwlzdGFydCA9IFBGTl9QSFlTKGFyZy0mZ3Q7c3RhcnRfcGZuKTsKJiM0MzsJZW5kID0gUEZOX1BIWVMoYXJnLSZndDtzdGFydF9wZm4gJiM0MzsgYXJnLSZndDtucl9wYWdlcyk7CiYjNDM7CXJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0gewomIzQzOwkubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsCiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChpc19ybWlfYXZhaWxhYmxlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKJiM0MzsKJiM0MzsJLyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbiYjMzk7dCBhZ3JlZSBvbiBhIHZlcnNpb24gKi8KJiM0MzsJcmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfY29uZmlndXJlKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkvKiBBY3RpdmF0ZSB0aGUgUk1NICovCiYjNDM7CXNybyA9IGttYWxsb2Nfb2JqKCpzcm8pOwomIzQzOwlpZiAoIXNybykKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSByZXQgJmx0OyAwID8gcmV0IDogLUVOWElPOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKCZhbXA7cm1pX21lbW9yeV9uYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dF9kZWFjdGl2YXRlOwomIzQzOwomIzQzOwlhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTsKJiM0MzsJcHJfaW5mbygmIzM0O1JNSSBjb25maWd1cmVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO291dF9kZWFjdGl2YXRlOgomIzQzOwlXQVJOX09OKHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNCiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmUKJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suCiYjNDM7ICovCiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmZkN2VmN2U4MmIyNDYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCkBAIC0wLDAgJiM0MzsxLDU0MCBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfCiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IXwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcm0tc21jY2Mtcm1pLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJvY2Vzc29yLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90eXBlcy5oJmd0OwomIzQzOwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1QJMjU2CiYjNDM7CiYjNDM7c3RydWN0IHJtaV9zcm9fc3RhdGUgewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7CiYjNDM7CWludCBhZGRyX2NvdW50OwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07CiYjNDM7fTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIHJtaV9zbWNjY19pbnZva2U6IEludm9rZSB0aGUgUk1JIGNhbGwgYW5kIHJldHVybiB0aGUgcmVzdWx0cyBpbiBAcmVnc19vdXQKJiM0MzsgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uCiYjNDM7ICogQHJlZ3Nfb3V0OiBPdXB0cHV0IHJlc3VsdHMgZnJvbSB0aGUgY2FsbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyBhcmdzID0gKnJlZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdHVzOwomIzQzOwomIzQzOwl3aGlsZSAoMSkgewomIzQzOwkJYXJtX3NtY2NjXzFfMl9pbnZva2UoJmFtcDthcmdzLCByZWdzKTsKJiM0MzsJCXN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKTsKJiM0MzsJCWlmIChzdGF0dXMgIT0gUk1JX0JVU1kgJmFtcDsmYW1wOyBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljcHVfcmVsYXgoKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGluZGV4KTsKJiM0MzsKJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCSAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpOwomIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpOwomIzQzO2ludCBybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpOwomIzQzOwomIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTsKJiM0Mztsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlc2V0dGluZyB0aGUgYWRkcl9jb3VudCBpcyBzdWZmaWNpZW50IHRvIGlnbm9yZSB0aGUgYWRkcl9saXN0IGNvbnRlbnRzLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoewkJCQlcCiYjNDM7CXN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pOwkJCQlcCiYjNDM7CV9fc3JvLSZndDthZGRyX2NvdW50ID0gMDsJCQkJCQlcCiYjNDM7CV9fc3JvLSZndDtyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpeyBfX1ZBX0FSR1NfXyB9OwlcCiYjNDM7CWxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTsJCVwKJiM0MzsJcm1pX3Nyb19mcmVlKF9fc3JvKTsJCQkJCQlcCiYjNDM7CV9fcmV0OwkJCQkJCQkJXAomIzQzO30pCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHMKJiM0MzsgKgkJCSAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QKJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0CiYjNDM7ICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlIHdpdGggY29udGVudHMKJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZwomIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYywKJiM0MzsJCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHJhbmdlIHdpdGggdW5rbm93biBjb250ZW50cwomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5IGF0IGEgcHJvdGVjdGVkCiYjNDM7ICoJCQkgIElQQSByYW5nZQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWQKJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZQomIzQzOyAqIEBvdXRfY291bnQ6IE51bWJlciBvZiBlbnRyaWVzIGluIG91dHB1dCBhZGRyZXNzIGxpc3QKJiM0MzsgKgomIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJCWlmIChvdXRfcmFuZ2UpCiYjNDM7CQkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CQlpZiAob3V0X2NvdW50KQomIzQzOwkJCSpvdXRfY291bnQgPSByZWdzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZAomIzQzOyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDCiYjNDM7ICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3QKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYywKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKgomIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUsIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZWQsIGFsbG93aW5nCiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzKTsKJiM0MzsJcmV0dXJuIHJlZ3MuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0CiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dAomIzQzOyAqCiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWQKJiM0MzsgKiB0byBieSBAcGFyYW1zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyBwYXJhbXMsCiYjNDM7CQkJCSAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgPSAwOwomIzQzOwlzcm8tJmd0O3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXMKJiM0MzsJfTsKJiM0MzsJcmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3JvLCBHRlBfS0VSTkVMKTsKJiM0MzsJcm1pX3Nyb19mcmVlKHNybyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfZGVzdHJveSgpIC0gRGVzdHJveSBhIFJFQwomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQwomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9jcmVhdGUoKSAtIENyZWF0ZXMgYW4gUlRUCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcnR0OiBQQSBvZiB0aGUgdGFyZ2V0IFJUVAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKgomIzQzOyAqIENyZWF0ZXMgYW4gUlRUIChSZWFsbSBUcmFuc2xhdGlvbiBUYWJsZSkgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlCiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBydHQsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYW4gUlRUCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFQKJiM0MzsgKiBAbGV2ZWw6IFJUVCBsZXZlbAomIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWQKJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeQomIzQzOyAqIGF0IHdoaWNoIHRoZSBSVFQgd2FsayB0ZXJtaW5hdGVkLgomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGUKJiM0MzsgKiB0YWJsZSBhcmUgaW4gQVNTSUdORUQgb3IgVEFCTEUgc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGlwYSwKJiM0MzsJCQkJICAgbG9uZyBsZXZlbCwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlpZiAob3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiBSTUlfU1VDQ0VTUzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVAomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWQKJiM0MzsgKgomIzQzOyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAmIzM5O2hvbW9nZW5lb3VzJiMzOTsgdGhlIFJUVCBjYW4gYmUKJiM0MzsgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsCiYjNDM7CQkJCWxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0CiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZAomIzQzOyAqCiYjNDM7ICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQQomIzQzOyAqIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2UKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWQKJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZQomIzQzOyAqIEBvdXRfY291bnQ6IE51bWJlciBvZiBlbnRyaWVzIGluIG91dHB1dCBhZGRyZXNzIGxpc3QKJiM0MzsgKgomIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUykKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwlpZiAob3V0X3JhbmdlKQomIzQzOwkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CWlmIChvdXRfY291bnQpCiYjNDM7CQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIFJNSV9TVUNDRVNTOwomIzQzO30KJiM0MzsKJiM0MzsjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMjE0ZDYyMjhkZmMyMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCkBAIC0wLDAgJiM0MzsxLDQ5NyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqCiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvcgomIzQzOyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDM6CiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0My8KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRmaWVsZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zaXplcy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vcGFnZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpCQkJCVwKJiM0MzsJQVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsCQlcCiYjNDM7CQkJICAgQVJNX1NNQ0NDX1NNQ182NCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsCVwKJiM0MzsJCQkgICAoZnVuYykpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT04JCQkJU01DX1JNSV9DQUxMKDB4MDE1MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQJCVNNQ19STUlfQ0FMTCgweDAxNTMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE1NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE1OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNTkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTVhKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNWIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUgkJCVNNQ19STUlfQ0FMTCgweDAxNWMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTVkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZCQkJU01DX1JNSV9DQUxMKDB4MDE2MSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURQkJU01DX1JNSV9DQUxMKDB4MDE2MykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURQkJCVNNQ19STUlfQ0FMTCgweDAxNjQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTCQkJU01DX1JNSV9DQUxMKDB4MDE2NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTY2KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9TRVRfUklQQVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTZhKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE2YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVQJCQlTTUNfUk1JX0NBTEwoMHgwMTZlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZCQlTTUNfUk1JX0NBTEwoMHgwMTZmKQomIzQzOyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNICVNNQ19STUlfQ0FMTCgweDAxNzApCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlQJCQlTTUNfUk1JX0NBTEwoMHgwMTc0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0NPTU1VTklDQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTc1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNzYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNzcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3OCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0gJCVNNQ19STUlfQ0FMTCgweDAxN2EpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWQkJCVNNQ19STUlfQ0FMTCgweDAxN2IpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUAkJCVNNQ19STUlfQ0FMTCgweDAxN2MpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3ZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3ZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xECQkJU01DX1JNSV9DQUxMKDB4MDE3ZikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxODUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxODYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE4NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE4OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxOGEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9TRVRfUzJBUAkJCVNNQ19STUlfQ0FMTCgweDAxOGIpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlQJU01DX1JNSV9DQUxMKDB4MDFkMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTCQlTTUNfUk1JX0NBTEwoMHgwMWQxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0sJCQlTTUNfUk1JX0NBTEwoMHgwMWQyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUCQkJU01DX1JNSV9DQUxMKDB4MDFkMykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFCQlTTUNfUk1JX0NBTEwoMHgwMWQ2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAxZDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEUJCVNNQ19STUlfQ0FMTCgweDAxZDgpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURQkJU01DX1JNSV9DQUxMKDB4MDFkYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWQkJU01DX1JNSV9DQUxMKDB4MDFkYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFkZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFlMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQJCVNNQ19STUlfQ0FMTCgweDAxZTEpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUCQlTTUNfUk1JX0NBTEwoMHgwMWUzKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVQJCQlTTUNfUk1JX0NBTEwoMHgwMWVlKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FCQlTTUNfUk1JX0NBTEwoMHgwMWYwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFCQlTTUNfUk1JX0NBTEwoMHgwMWYxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUJU01DX1JNSV9DQUxMKDB4MDFmMikKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZjMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFmNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWY5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMjAwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjAxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjAyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRQkJCVNNQ19STUlfQ0FMTCgweDAyMDMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1QJCVNNQ19STUlfQ0FMTCgweDAyMDQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1QJCVNNQ19STUlfQ0FMTCgweDAyMDUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjA2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0UJCVNNQ19STUlfQ0FMTCgweDAyMDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjA4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTQkJCVNNQ19STUlfQ0FMTCgweDAyMDkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NBTkNFTAkJCVNNQ19STUlfQ0FMTCgweDAyMGEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTCQkJU01DX1JNSV9DQUxMKDB4MDIwYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAyMGMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9DT01QTEVURQkJU01DX1JNSV9DQUxMKDB4MDIwZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GTwkJCVNNQ19STUlfQ0FMTCgweDAyMGUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDIwZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fSU5GTwkJU01DX1JNSV9DQUxMKDB4MDIxMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0lORk8JCQlTTUNfUk1JX0NBTEwoMHgwMjExKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OCTIKJiM0MzsjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTgkwCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHZlcnNpb24pICgodmVyc2lvbikgJmd0OyZndDsgMTYpCiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgJmFtcDsgMHhGRkZGKQomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgJmx0OyZsdDsgMTYpIHwgKG1pbm9yKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0sJCUdFTk1BU0soNywgMCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTSwkJR0VOTUFTSygxNSwgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0sJCUdFTk1BU0soOSwgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLCUJJVCgxMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTCQkJMAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUCQkJMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNCQkJMgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQwkJCTMKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFQJCQk0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRAkJNQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRQkJNgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVgJCTcKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVAkJOAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVAkJCTkKJiM0MzsjZGVmaW5lIFJNSV9CVVNZCQkJMTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUwJCTExCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkcJCTEyCiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURQkJCTEzCiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRAkJCTE0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUCQkJMTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFCQkxNgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcJCTAKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QCQkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEUJCTEKJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU0JCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9PUF9DQU5OT1RfQ0FOQ0VMCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLCQlHRU5NQVNLKDE4LCAxNykKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0sJCUJJVCgxNikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTSwkJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLCUdFTk1BU0soMSwgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEUocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfQ09OVElHX01BU0ssIHJlcSkKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFKHJlcSkJRklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTAkJMgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJRwkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUdFTk1BU0soNjMsIDYyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCUdFTk1BU0soNTEsIFBBR0VfU0hJRlQpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLCUdFTk1BU0soUEFHRV9TSElGVCAtIDEsIDIpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShyKQlGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChyKQkJRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSkKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocikJCSgocikgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUocikJCUZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCAocikpCiYjNDM7CiYjNDM7ZW51bSBybWlfcmlwYXMgewomIzQzOwlSTUlfRU1QVFkgPSAwLAomIzQzOwlSTUlfUkFNID0gMSwKJiM0MzsJUk1JX0RFU1RST1lFRCA9IDIsCiYjNDM7CVJNSV9ERVYgPSAzLAomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UCTAKJiM0MzsjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlQJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMk9BU1oJCQlHRU5NQVNLKDQwLCAzMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEUJQklUKDMyKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlMJCUdFTk1BU0soMzEsIDI3KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVUJCQlCSVQoMjYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFMJCQlHRU5NQVNLKDI1LCAyMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQUwkJCUdFTk1BU0soMTksIDE0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkwJCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFCQkJQklUKDkpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTIJCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWgkJCUdFTk1BU0soNywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTCQkJR0VOTUFTSygxNiwgMTQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1oJCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVIJCUdFTk1BU0soOSwgNikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyCQlCSVQoNSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0CQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2CQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQgkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0IJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0IJCUJJVCgwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVIJR0VOTUFTSygxNCwgMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNCQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUERFVl9NQVhfVkRFVlNfT1JERVIJR0VOTUFTSyg3LCA0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFMJCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVUJCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09ICQkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBCQkJQklUKDApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUCUJJVCg2KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkUJCUdFTk1BU0soNSwgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTCUdFTk1BU0soMywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UCQlHRU5NQVNLKDYzLCAwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwJCTAKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0gJCTEKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSAkJMgomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FCQkJMwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX1JFU0VSVkVECQkJMAomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkUJCQkxCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORQkJCTIKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19DT0FSU0UJCQkzCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFCQk0CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQgkwCiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0IJMQomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVQomIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVCiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlUKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NAomIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJtbV9jb25maWcgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7CiYjNDM7CQkJdTY0IHJtaV9ncmFudWxlX3NpemU7CiYjNDM7CQl9OwomIzQzOwkJdTggc2l6ZXJbU1pfNEtdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRQkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVUJCUJJVCgyKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREEJCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1kJCUdFTk1BU0soNiwgNSkKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1kJCUdFTk1BU0soOCwgNykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTYJCQkwCiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyCQkJMQomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NAkJCTIKJiM0MzsKJiM0MztzdHJ1Y3QgcmVhbG1fcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGZsYWdzMDsKJiM0MzsJCQl1NjQgczJzejsKJiM0MzsJCQl1NjQgc3ZlX3ZsOwomIzQzOwkJCXU2NCBudW1fYnBzOwomIzQzOwkJCXU2NCBudW1fd3BzOwomIzQzOwkJCXU2NCBwbXVfbnVtX2N0cnM7CiYjNDM7CQkJdTY0IGhhc2hfYWxnbzsKJiM0MzsJCQl1NjQgbnVtX2F1eF9wbGFuZXM7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzBbMHg0MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NDAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHJwdls2NF07CiYjNDM7CQkJdTY0IGF0c19wbGFuZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMVsweDQwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg4MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHBhZGRpbmcyOwomIzQzOwkJCXU2NCBydHRfYmFzZTsKJiM0MzsJCQlzNjQgcnR0X2xldmVsX3N0YXJ0OwomIzQzOwkJCXU2NCBydHRfbnVtX3N0YXJ0OwomIzQzOwkJCXU2NCBmbGFnczE7CiYjNDM7CQkJdTY0IG1heF9udW1fdmRldnM7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzNbMHg3MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4ZjAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHBhZGRpbmc0WzB4ODBdOwomIzQzOwkJCXU2NCBhdXhfcnR0X2Jhc2VbM107CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzVbMHgxMDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZQomIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTCQk4CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEUJQklUKDApCiYjNDM7CiYjNDM7c3RydWN0IHJlY19wYXJhbXMgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJdTY0IGZsYWdzOwomIzQzOwkJdTggcGFkZGluZzBbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MTAwICovCiYjNDM7CQl1NjQgbXBpZHI7CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBwYzsKJiM0MzsJCXU4IHBhZGRpbmcyWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDMwMCAqLwomIzQzOwkJdTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTsKJiM0MzsJCXU4IHBhZGRpbmczWzB4ZDAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPCUJJVCgwKQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfSU5KRUNUX1NFQQlCSVQoMSkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFCUJJVCg0KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRQlCSVQoNSkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0UJQklUKDYpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMAkJQklUKDcpCiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUlVOX0dQUlMJCQkzMQomIzQzOwomIzQzO3N0cnVjdCByZWNfZW50ZXIgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1NjQgZmxhZ3M7CiYjNDM7CQl1OCBwYWRkaW5nMFsweDIwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMVsweDYwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TWU5DCQkJMHgwMAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRCQkJMHgwMQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfRklRCQkJMHgwMgomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUFNDSQkJCTB4MDMKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRQkJMHgwNAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMCQkweDA1CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1IJCQkweDA2CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRQkJMHgwNwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HCTB4MDgKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkQJCTB4MGEKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX2V4aXQgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1OCBleGl0X3JlYXNvbjsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgZXNyOwomIzQzOwkJCXU2NCBmYXI7CiYjNDM7CQkJdTY0IGhwZmFyOwomIzQzOwkJCXU2NCBydHRfdHJlZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU4IHBhZGRpbmczWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDQwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgY250cF9jdGw7CiYjNDM7CQkJdTY0IGNudHBfY3ZhbDsKJiM0MzsJCQl1NjQgY250dl9jdGw7CiYjNDM7CQkJdTY0IGNudHZfY3ZhbDsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg1MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHJpcGFzX2Jhc2U7CiYjNDM7CQkJdTY0IHJpcGFzX3RvcDsKJiM0MzsJCQl1OCByaXBhc192YWx1ZTsKJiM0MzsJCQl1OCBwYWRkaW5nNVsweGZdOwomIzQzOwkJCXU2NCBzMmFwX2Jhc2U7CiYjNDM7CQkJdTY0IHMyYXBfdG9wOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzE7CiYjNDM7CQkJdTY0IHZkZXZfaWRfMjsKJiM0MzsJCQl1NjQgZGV2X21lbV9iYXNlOwomIzQzOwkJCXU2NCBkZXZfbWVtX3RvcDsKJiM0MzsJCQl1NjQgZGV2X21lbV9wYTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg2MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTE2IGltbTsKJiM0MzsJCQl1OCBwYWRkaW5nN1sweDZdOwomIzQzOwkJCXU2NCBwbGFuZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nOFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg3MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTggcG11X292Zl9zdGF0dXM7CiYjNDM7CQkJdTggcGFkZGluZzlbMHhmXTsKJiM0MzsJCQl1NjQgdnNtbXU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzEwWzB4MTAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspOwomIzQzOwomIzQzO3N0cnVjdCByZWNfcnVuIHsKJiM0MzsJc3RydWN0IHJlY19lbnRlciBlbnRlcjsKJiM0MzsJc3RydWN0IHJlY19leGl0IGV4aXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqLwomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlQJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSCUdFTk1BU0soMTgsIDE2KQomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAJCUdFTk1BU0soMjIsIDE5KQomIzQzOwomIzQzOy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRQlHRU5NQVNLKDEsIDApCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlQJR0VOTUFTSygxNSwgMikKJiM0MzsKJiM0MzsvKiBTMkFQIERpcmVjdCBFbmNvZGluZ3MsIHVzZWQgaW4gUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAgKi8KJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURQkJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQUQJCQlCSVQoMSkKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MzM3CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNTM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqCgpPa2F5LCBzbyB0aGUgaW5pdGlhbCBwcm9tcHQgYXNrcyBtZSB0byBldmFsdWF0ZSB0aGlzIHBhdGNoIHNlcmllcyBmb3Igc3l6a2FsbGVyIGZ1enppbmcgcG90ZW50aWFsIG9uIGFtZDY0LiBTdHJhaWdodCBhd2F5LCB0aGUgbWVudGlvbiBvZiBgYW1kNjRgIHNldHMgb2ZmIGFsYXJtIGJlbGxzLiBJIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bCBoZXJlLgoKVGhlIGZpcnN0IHRoaW5nIEkgZGlkIHdhcyByZS1leGFtaW5lIHRoZSBgVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRgIGluc3RydWN0aW9uLgoKVGhlIHByb3ZpZGVkIHBhdGNoIHRvdWNoZXMgYSBmZXcga2V5IGFyZWFzLCB0aGUgZmlyc3QgYmVpbmcgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgKHNlbGVjdHMgYEFSQ0hfU1VQUE9SVFNfUk1NYCksIGFuZCBgZHJpdmVycy9maXJtd2FyZWAgd2hpY2ggaW5jbHVkZXMgYW4gYGFybV9ybW1gIHN1YmRpcmVjdG9yeSB3aXRoIEtjb25maWcgYW5kIE1ha2VmaWxlIGNvbmZpZ3VyYXRpb25zIGZvciBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmdW5jdGlvbmFsaXR5LiBJdCYjMzk7cyBvYnZpb3VzbHkgYWltaW5nIGF0IEFSTTY0IGFyY2hpdGVjdHVyZSwgZ2l2ZW4gdGhlIGZpbGUgbmFtZXMgYW5kIHRoZSBpbmNsdXNpb24gb2YgYGFyY2gvYXJtNjRgIGNvbmZpZ3VyYXRpb25zLiBNeSBpbml0aWFsIGludHVpdGlvbiBpcyBzY3JlYW1pbmcgKndyb25nIGFyY2hpdGVjdHVyZSEqLgoKVGhlIHJlYWwgcXVlc3Rpb24sIHRoZSBjcml0aWNhbCBvbmUsIGlzIHdoZXRoZXIgdGhpcyBgQ09ORklHX0FSTV9STU1fUk1JYCBmZWF0dXJlLCB0aGF0JiMzOTtzIGRlZXBseSB0aWVkIHRvIEFSTTY0IFJNSSBzdXBwb3J0LCBpcyBldmVuIGJ1aWxkYWJsZSwgbGV0IGFsb25lIHJlYWNoYWJsZSwgb24gYW4gYW1kNjQgc3lzdGVtLiBUaGUgcGF0Y2ggc2VyaWVzIGhhcyBgS2NvbmZpZ2AgZmlsZXMgdGhhdCByZXZlYWwgYSBkZXBlbmRlbmN5IGNoYWluLiBgQVJNX1JNTV9STUlgIGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc2VsZWN0ZWQgKm9ubHkqIHdpdGhpbiB0aGUgYEFSTTY0YCBjb25maWd1cmF0aW9uIGluIGBhcmNoL2FybTY0L0tjb25maWdgLgoKTm93LCBJJiMzOTttIGNoZWNraW5nLCBqdXN0IHRvIGJlIHN1cmUsIHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBvciBgQVJNX1JNTV9STUlgIGlzICpuZXZlciogc29tZWhvdyBkZWZpbmVkIG9yIHNlbGVjdGVkIG9uIGFuIHg4Ni9hbWQ2NCBjb25maWd1cmF0aW9uLiBJJiMzOTttIGdvaW5nIHRvIHF1aWNrbHkgZ3JlcCB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSB0byBiZSAxMDAlIHBvc2l0aXZlLiBUaGlzIGlzIGltcG9ydGFudCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpcyBldmVuICpyZWxldmFudCogdG8gZnV6emluZyBhIHN5c3RlbSBvbiBhbiBhbWQ2NCBhcmNoaXRlY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QVJDSF9TVVBQT1JUU19STU0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XG4tLVxuYXJjaC9hcm02NC9LY29uZmlnLTQwLVx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG5hcmNoL2FybTY0L0tjb25maWc6NDE6XHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc6Mjpjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTMtXHRib29sXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc9NT1jb25maWcgQVJNX1JNTV9STUlcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXHRib29sIFwmIzM0O1JlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcJiMzNDtcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjc6XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVx0ZGVmYXVsdCB5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk1NjcKCQkJCQkJCW91dHB1dDogMTM0CgkJCQkJCQl0aG91Z2h0czogMTIwMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIGBybWkuY2AgZmlsZSwgaW5jbHVkZXMgYW55IEFSTTY0LXNwZWNpZmljIGhlYWRlcnMuIExvb2tzIGxpa2Ugd2UgaGF2ZTogYCZsdDthc20vbWVtb3J5LmgmZ3Q7YCwgYCZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0O2AsIHRoZSBgQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVGAgbWFjcm8sIHRoZSBgcmVhZF9zYW5pdGlzZWRfZnRyX3JlZ2AgZnVuY3Rpb24gY2FsbCAod2hpY2ggZGVhbHMgd2l0aCB0aGUgc3lzdGVtIHJlZ2lzdGVyKSwgYW5kIGZ1bmN0aW9ucy9zdHJ1Y3R1cmVzIGxpa2UgYGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZGAsIGBhcm1fc21jY2NfMV8yX3JlZ3NgLCBhbmQgYGFybV9zbWNjY18xXzJfaW52b2tlYC4gWWVwLCBkZWZpbml0ZWx5IEFSTTY0LXNwZWNpZmljIHN0dWZmLgoKTm93LCBsZXQmIzM5O3MgcmVmZXIgdG8gdGhlIGluc3RydWN0aW9ucy4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlbGV2YW50IGNvbmRpdGlvbiBoZXJlIGlzICYjMzQ7Q29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLCYjMzQ7IGFuZCBvdXIgdGFyZ2V0IGlzIGNsZWFybHkgYW1kNjQuCgpUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgLyBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1NL1JNSSkuIEl0IHRvdWNoZXMgZmlsZXMgbGlrZSBgYXJjaC9hcm02NC9LY29uZmlnYCwgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AsIHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL2AgZGlyZWN0b3J5LCBhbmQgcmVsYXRlZCBoZWFkZXJzLiBJIGtub3cgdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG9ubHkgc2VsZWN0ZWQgaWYgYGNvbmZpZyBBUk02NGAgaXMgc2V0LiBBbHNvLCBgQVJNX1JNTV9STUlgIGlzIGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19STU1gLiBDb25zZXF1ZW50bHksIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzICpuZXZlciogZW5hYmxlZCBvbiBhbWQ2NCAoeDg2XzY0KS4gRXZlbiBpZiBpdCAqY291bGQqIGJlIGVuYWJsZWQgc29tZWhvdywgdGhlIHByZXNlbmNlIG9mIHRob3NlIEFSTTY0LXNwZWNpZmljIHN5bWJvbHMgY29uZmlybXMgdGhlIGNvZGUmIzM5O3MgdW5yZWFjaGFiaWxpdHkgb24gYW1kNjQuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzd2VlcCBvZiB0aGUgY2hhbmdlZCBmaWxlcyB0byB2ZXJpZnkgdGhhdC4gSSYjMzk7bGwgbWFrZSBzdXJlIGVhY2ggaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCgoxLiAgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgLSBBUk02NCBvbmx5LgoyLiAgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AgLSBBUk02NCBvbmx5LgozLiAgYGRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ2AgLSBzb3VyY2VzIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ2AuCjQuICBgZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZWAgLSBhZGRzIGBvYmoteSAmIzQzOz0gYXJtX3JtbS9gLgo1LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCAtIGRlZmluZXMgYEFSQ0hfU1VQUE9SVFNfUk1NYCAobm90IHNlbGVjdGVkIGJ5IHg4NikgYW5kIGBBUk1fUk1NX1JNSWAgKGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCkuIE9uIGFtZDY0LCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG4sIHNvIGBBUk1fUk1NX1JNSWAgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBlbmFibGVkLgo2LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAgLSBjb21waWxlcyBgcm1pLm9gIG9ubHkgaWYgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgc2V0Lgo3LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AgLSBjb21waWxlZCBvbmx5IGlmIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIHNldC4KOC4gIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCAtIGhlYWRlciBub3QgdXNlZCBvbiBhbWQ2NC4KOS4gIGBpbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaGAgLSBoZWFkZXIgbm90IHVzZWQgb24gYW1kNjQuCgpPa2F5LCBhbmQgSSYjMzk7bGwgcXVpY2tseSBjaGVjayBpZiBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tYCBldmVuIGNvbXBpbGVzIG9uIGFtZDY0LiBTaW5jZSBgQ09ORklHX0FSTV9STU1fUk1JYCBpcyBub3Qgc2V0LCB0aGUgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAgZ2VuZXJhdGVzIG5vIG9iamVjdHMuIEl0JiMzOTtzIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSBvbiBhbWQ2NC4KClNvLCBhbGwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlbHkgZm9yIEFSTTY0LiBJdCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgJiMzNDtVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6ICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiYjMzQ7CgpUaGVyZWZvcmU6CgoqICAgYFdvcnRoRnV6emluZyA9IGZhbHNlYAoqICAgYEVuYWJsZUNvbmZpZ3MgPSBbXWAKKiAgIGBGb2N1c1N5bWJvbHMgPSBbXWAKKiAgIGBSZWFzb25pbmcgPSBDb25jaXNlIGV4cGxhbmF0aW9uOiBUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGlzIHBhdGNoIGFkZHMgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgc3VwcG9ydCBleGNsdXNpdmUgdG8gYXJtNjQgYXJjaGl0ZWN0dXJlIChDT05GSUdfQVJNX1JNTV9STUkgZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSwgd2hpY2ggaXMgb25seSBzZWxlY3RlZCBieSBBUk02NCkuIFRodXMsIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5gCgpDaGVja2luZzoKVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQuClBhdGNoOiBBUk0gUk1NL1JNSSBzdXBwb3J0LgpDcml0ZXJpYSBjaGVjazoKLSBXb3J0aEZ1enppbmc9ZmFsc2Ugd2hlbiAmIzM0O0NvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OwotIEZvY3VzU3ltYm9sczogW10KLSBFbmFibGVDb25maWdzOiBbXQotIFJlYXNvbmluZzoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyMi4zNDUyNDAwNjlaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTEyNDM0NDExNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyMi4zNDUyNDc0NDlaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyMTcwOTQyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGNmNzlkMDk0NDE0YTZlNjMyOTZlZDMzYTMzZjZiOWQ3ODMyZGE0YmNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxcbiBcXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcXG4rXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcXG4rXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc2Ftc3VuZy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS94aWxpbngvS2NvbmZpZ1xcXCJcXG4rc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xcXCJcXG4gXFxuIGVuZG1lbnVcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxuQEAgLTAsMCArMSwyNiBAQFxcbitcXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGJvb2xcXG4rXFxuK2NvbmZpZyBBUk1fUk1NX1JNSVxcbitcXHRib29sIFxcXCJSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGRlZmF1bHQgeVxcbitcXHRoZWxwXFxuK1xcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcXG4rXFx0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxcbitcXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXFxuK1xcbitcXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cXG4rXFx0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxcbitcXHQgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuXFxuK1xcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXFxuK1xcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXFxuK1xcbitcXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxcbitcXHQgIFJlYWxtIGd1ZXN0cy5cXG4rXFxuK1xcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XFxuK1xcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcXHQ9IHJtaS5vXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNTgzZTFhY2E5YjE1YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcXG5AQCAtMCwwICsxLDk5OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1ibG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXFx1MDAzZVxcbitcXG4rc3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcXG4rXFxuKy8qIEN1cnJlbnRseSBvbmx5IHRoZSBmaXJzdCAyIHJlZ2lzdGVycyBhcmUgdXNlZCBieSBMaW51eCAqL1xcbisjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVFxcdDJcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF0gX19yb19hZnRlcl9pbml0O1xcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlc1xcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXFxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxcbisgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZFxcbisgKlxcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcXG4rICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXFxuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxcbisgKlxcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XFxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCxcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZWdzLmEwO1xcbitcXG4rXFx0aWYgKG91dF9jYXRlZ29yeSlcXG4rXFx0XFx0Km91dF9jYXRlZ29yeSA9IHJlZ3MuYTE7XFxuK1xcdGlmIChvdXRfc3RhdGUpXFxuK1xcdFxcdCpvdXRfc3RhdGUgPSByZWdzLmEyO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEzO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKlxcbisgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXFxuKyAqIEBzdGFydDogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcXG4rICpcXHRcXHR0aGUgR1BUIEBvdXRfZ3B0X3Bhcl9zdGF0ZSBpcyB2YWxpZFxcbisgKiBAb3V0X2dwdF9wYXJfc3RhdGU6IFN0YXRlIG9mIHRoZSBHUFQgY292ZXJlZCBieSBbc3RhcnQsIG91dF90b3ApXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSlcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfR1BUX0lORk8sIHN0YXJ0LCBlbmQsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZWdzLmEwO1xcbitcXG4rXFx0aWYgKG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFx0aWYgKG91dF9ncHRfcGFyX3N0YXRlKVxcbitcXHRcXHQqb3V0X2dwdF9wYXJfc3RhdGUgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXJcXG4rICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIGFyZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfRkVBVFVSRVMsIGluZGV4XFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZhcmdzKTtcXG4rXFx0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0KVxcbitcXHRcXHQqb3V0ID0gYXJncy5hMTtcXG4rXFxuK1xcdHJldHVybiBhcmdzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxcbisgKiBAY2ZnX3B0cjogUEEgb2YgYSBzdHJ1Y3Qgcm1tX2NvbmZpZ1xcbisgKlxcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0cixcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT04oaW5kZXggXFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2luZGV4XTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xcbitcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0bG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXG4rXFx0XFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRcXHQvKiBCdWdneSBSTU0gPyBMZXQgdGhlIGNhbGxlciBsZWFrIHRoZSBwYWdlcyAqL1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTihvdXRfdG9wIFxcdTAwM2M9IHBoeXMpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7XFxuK1xcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXFxuK3tcXG4rXFx0bG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZShwaHlzLCB0b3AsIFxcdTAwMjZvdXRfdG9wKTtcXG4rXFxuK1xcdFxcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0XFx0LyogQnVnZ3kgUk1NID8gKi9cXG4rXFx0XFx0XFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcXHUwMDNjPSBwaHlzKSkge1xcbitcXHRcXHRcXHRcXHRybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG91dF9waHlzKVxcbitcXHRcXHQqb3V0X3BoeXMgPSBwaHlzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4rLypcXG4rICogQ29udmVydCB0aGUgUm1pQWRkckJsb2NrU2l6ZSB0byBhY3R1YWwgc2l6ZS4gVGhpcyBpcyB1c2VkIGluIFJtaURvbmF0ZVJlcVxcbisgKiBhbmQgUm1pQWRkclJhbmdlRGVzYyouXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQpXFxuK3tcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5XFxuKyAqXFx0XFx0ICAgIGJlIHBhcnRpYWxseSBjb25zdW1lZCBieSBSTU0uXFxuKyAqXFxuKyAqIEBlbnRyeTogUk1JX0FERFJfUkFOR0UgZGVzY3JpcHRvclxcbisgKiBAY29uc3VtZWRfc2l6ZTogUGFnZSBhbGlnbmVkIHNpemUgY29uc3VtZWQgYnkgdGhlIFJNTSBmcm9tIHRoZSBhZGRyZXNzIHJhbmdlLlxcbisgKlxcbisgKiBJZiB0aGUgc3RhdGUgb2YgdGhlIGFkZHJlc3MgaXMgREVMRUdBVEVELCB1bmRlbGVnYXRlIGl0IGJhY2ssIGJlZm9yZSBmcmVlaW5nLlxcbisgKiBMZWFrcyB0aGUgbWVtb3J5IGlmIHdlIGNhbm5vdCB1bmRlbGVnYXRlIHRoZSByYW5nZS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGZyZWVfYWRkcl9yYW5nZSh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3NpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQgPSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCkgKiBjb3VudDtcXG4rXFxuK1xcdFdBUk5fT04oIVBBR0VfQUxJR05FRChwaHlzKSB8fCAhUEFHRV9BTElHTkVEKGNvbnN1bWVkX3NpemUpKTtcXG4rXFxuK1xcdC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBmb3IgcGFydGlhbGx5IGNvbnN1bWVkIGVudHJ5ICovXFxuK1xcdHBoeXMgKz0gY29uc3VtZWRfc2l6ZTtcXG4rXFx0c2l6ZSAtPSBjb25zdW1lZF9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4ndFxcbitcXHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgV0FSTl9PTihybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplKSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQocGh5cyksIHNpemUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcXG4rXFx0XFx0U01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX09QX0NBTkNFTCwgc3JvX2hhbmRsZVxcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcXG4rXFx0XFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxcbitcXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcXG4rXFx0ICovXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xcbitcXG4rc3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxcbit7XFxuK1xcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVxcdTAwM2VhZGRyX2NvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QpKVxcbitcXHRcXHRyZXR1cm4gLUVPVkVSRkxPVztcXG4rXFxuK1xcdGlmIChjb3VudCBcXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVxcdTAwM2VhZGRyX2NvdW50KVxcbitcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0IGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHNpemUgPSBibG9ja19zaXplICogY291bnQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZTtcXG4rXFx0aW50IHJldDtcXG4rXFx0dm9pZCAqdmlydDtcXG4rXFx0cGh5c19hZGRyX3QgcGh5cztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxcbitcXHQgKiBwb3dlciBvZiAyXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzcm8tXFx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcXG4rXFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0YWRkcl9yYW5nZSA9IHBoeXMgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgY291bnQpO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xcbitcXG4rb3V0OlxcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSksIDEsXFxuK1xcdFxcdFxcdCAgMCwgb3V0X3JlZ3MpO1xcbitcXHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXFx1MDAzZWExO1xcbitcXG4rXFx0aWYgKFdBUk5fT04oZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNlIChzaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpKSlcXG4rXFx0XFx0ZG9uYXRlZF9ncmFudWxlcyA9IChzaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbitcXG4rXFx0ZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0LyogQWxsIGdyYW51bGVzIGNvbnN1bWVkIGJ5IHRoZSBSTU0gKi9cXG4rXFx0aWYgKGRvbmF0ZWRfc2l6ZSA9PSBzaXplKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0LyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovXFxuK1xcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50Kys7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBUaGUgZ3JhbnVsZXMgd2VyZSBwYXJ0aWFsbHkgY29uc3VtZWQsIHJlY2xhaW0gdGhlIHVudXNlZCBvbmVzLiAqL1xcbitcXHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xcbitcXHR1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl9ibG9jayA9IGJsb2NrX3NpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb25zdW1lZF9ibG9ja3M7XFxuK1xcdGludCBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXFx1MDAyNlxcdTAwMjYgZm91bmQgXFx1MDAzYyBjb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFxuK1xcdFxcdGlmIChSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KSA9PSBibG9ja19zaXplX2ZsZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xcbitcXHRcXHRcXHRhZGRyX2xpc3Rfc3RhcnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFx0XFx0XFx0Zm91bmQrKztcXG4rXFx0XFx0XFx0aS0tO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3aGlsZSAoZm91bmQgXFx1MDAzYyBjb3VudCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdFxcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdChibG9ja19zaXplLCBnZnApO1xcbitcXHRcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbitcXG4rXFx0XFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XFxuK1xcbitcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0XFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XFxuK1xcbitcXHRcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4rXFx0XFx0XFx0XFx0XFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGRyX3JhbmdlID0gcGh5cyBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCAxKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnQrK10gPSBhZGRyX3JhbmdlO1xcbitcXHRcXHRmb3VuZCsrO1xcbitcXHR9XFxuK1xcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXFxuK1xcdFxcdFxcdCAgY291bnQsIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxcbitcXHQgKiBqdXN0IGluIGNhc2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl9ibG9jaykpXFxuK1xcdFxcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBjb3VudCAqIGdyYW51bGVzX3Blcl9ibG9jaztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcXG4rXFx0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gYmxvY2stc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XFxuK1xcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCBibG9ja3MuXFxuK1xcdCAqL1xcbitcXHRjb25zdW1lZF9ibG9ja3MgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX2Jsb2NrO1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBBIGJsb2NrIGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XFxuK1xcdFxcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XFxuK1xcdFxcdCAqL1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfYmxvY2tzXTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxcbitcXHRcXHRcXHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdFxcdGZyZWVfYWRkcl9yYW5nZShlbnRyeSwgZG9uYXRlZF9zaXplKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhpcyBibG9jayBpcyBub3cgZnVsbHkgJ2NvbnN1bWVkJyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxcbitcXHRcXHQgKiBmcmVlZClcXG4rXFx0XFx0ICovXFxuK1xcdFxcdGNvbnN1bWVkX2Jsb2NrcysrO1xcbitcXHR9XFxuK1xcbitcXHQvKiBLZWVwIGp1c3QgdGhlIGJsb2NrcyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXFxuK1xcdGZvciAoaW50IGkgPSBjb25zdW1lZF9ibG9ja3M7IGkgXFx1MDAzYyBjb3VudDsgaSsrKVxcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfYmxvY2tzXSA9XFxuK1xcdFxcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX2Jsb2NrcztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsXFxuK1xcdFxcdFxcdCAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICByZWdzLCBnZnApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRyZWdzLCBnZnApO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcXG4rXFxuK1xcdGlmIChybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpKVxcbitcXHRcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSxcXG4rXFx0XFx0XFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAgKiBSTUlfT1BfTUVNX1JFQ0xBSU0gYWx3YXlzIHJldHVybiBSTUlfSU5DT01QTEVURSwgZXhjZXB0IHdoZW4gdGhlXFxuK1xcdCAgKiBpbnB1dCBwYXJhbWV0ZXJzIHdlcmUgaW52YWxpZC5cXG4rXFx0ICAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKG91dF9yZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cXHUwMDNlYTEgXFx1MDAzZSBjYXBhY2l0eSkpXFxuK1xcdFxcdG91dF9yZWdzLVxcdTAwM2VhMSA9IGNhcGFjaXR5O1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdC8qIEhhbmRsZSB0aGUgd29yc2UgKi9cXG4rXFx0aWYgKFdBUk5fT04oc3JvLVxcdTAwM2VhZGRyX2NvdW50IFxcdTAwM2MgMCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmIChXQVJOX09OKHNyby1cXHUwMDNlYWRkcl9jb3VudCBcXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gUk1JX01BWF9BRERSX0xJU1Q7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKVxcbitcXHRcXHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV0sIDApO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFxcdTAwMjZzcm8tXFx1MDAzZXJlZ3M7XFxuK1xcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcXG4rXFx0XFx0aW50IHJldCA9IDA7XFxuK1xcbitcXHRcXHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXFx1MDAzZWEwKSkge1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XFxuK1xcdFxcdFxcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcXG4rXFx0XFx0XFx0XFx0XFx0cmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcXG4rXFx0XFx0XFx0cmV0ID0gcm1pX3Nyb19kb25hdGUoc3JvLCBzcm9faGFuZGxlLCByZWdzLVxcdTAwM2VhMiwgcmVncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBnZnApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxcbitcXHRcXHRcXHRyZXQgPSBybWlfc3JvX3JlY2xhaW0oc3JvLCBzcm9faGFuZGxlLCByZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChyZXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQWxsIG1lbW9yeSBkb25hdGluZyBTUk9zIG11c3QgYmUgY2FuY2VsbGFibGUuIFNvIGFcXG4rXFx0XFx0XFx0ICogZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbiBzaG91bGRuJ3QgYmUgYW4gaXNzdWUuXFxuK1xcdFxcdFxcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxcbitcXHRcXHRcXHQgKiBidWdneSBSTU0pLCBkb24ndCBsb29wIGZvcmV2ZXIsIGp1c3QgZ2l2ZSB1cC5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWNhbl9jYW5jZWwpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlXFxuK1xcdFxcdFxcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxcbitcXHRcXHRcXHQgKiBpbiBnb2luZyBpbiBsb29wcy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGNhbmNlbGxlZCA9IHRydWU7XFxuK1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXFx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUpO1xcbitcXG4rLyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi9cXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncylcXG4re1xcbitcXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xcbitcXHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUgPSByZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0aWYgKCFjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK1xcdFxcdFxcdC8qIElmIHdlIGhhdmUgYWxyZWFkeSBjYW5jZWxsZWQsIGRvbid0IHJldHJ5IHRoaXMgKi9cXG4rXFx0XFx0XFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcdFxcdFxcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGNhbmNlbGxlZCA9IHRydWU7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcXG4rXFxuK3N0YXRpYyBpbnQgcm1pX2NoZWNrX3ZlcnNpb24odm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xcbitcXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xcbitcXHRcXHRTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbixcXG4rXFx0fTtcXG4rXFxuK1xcdC8qIElmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbid0IGJlICovXFxuK1xcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZXMpO1xcbitcXHRpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0dmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTtcXG4rXFx0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XFxuK1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7XFxuK1xcdFxcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcXG4rXFxuK1xcdFxcdHByX2VycihcXFwiVW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHByX2luZm8oXFxcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcXFxuXFxcIiwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcXG4rXFx0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcXG4rXFx0ICovXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgUk1JX0ZFQVRfUkVHX0NPVU5UOyBpKyspIHtcXG4rXFx0XFx0aWYgKFdBUk5fT04ocm1pX2ZlYXR1cmVzKGksIFxcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7XFxuK1xcdGludCByZXQgPSAwO1xcbitcXHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xcbitcXG4rXFx0c3dpdGNoIChQQUdFX1NJWkUpIHtcXG4rXFx0Y2FzZSBTWl80SzpcXG4rXFx0XFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl8xNks6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcXG4rXFx0XFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl82NEs6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcXG4rXFx0XFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0QlVJTERfQlVHKCk7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcXHUwMDI2IGdyYW51bGVfZmVhdHVyZSkpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIFBBR0VfU0laRSBcXHUwMDNlXFx1MDAzZSAxMCk7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFjb25maWcpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSTU0gY29uZmlnXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFxuK1xcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxcbitcXHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxcbitcXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcXG4rXFx0ICogUEFHRV9TSVpFU1xcbitcXHQgKi9cXG4rXFx0Y29uZmlnLVxcdTAwM2V0cmFja2luZ19yZWdpb25fc2l6ZSA9IDA7XFxuK1xcbitcXHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcXFxcblxcXCIsIHJldCk7XFxuK1xcdFxcdHJldCA9IC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKlxcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcXG4rXFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcXHUwMDI2Y2F0ZWdvcnksIFxcdTAwMjZzdGF0ZSwgXFx1MDAyNm5leHQpO1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxcbitcXHRcXHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcXG4rXFx0XFx0XFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXFxuK1xcdFxcdFxcdHByX2VycihcXFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgPSBuZXh0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxcbisgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxcbisgKi9cXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcXG4rXFx0dW5zaWduZWQgbG9uZyBuZXh0LCBwYXJfc3RhdGU7XFxuK1xcbitcXHRsMGdwdF9zeiA9IDFVTCBcXHUwMDNjXFx1MDAzYyAoMzAgKyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxcbitcXHRcXHRcXHRcXHRcXHQgIHJtaV9mZWF0X3JlZygxKSkpO1xcbitcXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcXG4rXFx0ZW5kID0gQUxJR04oZW5kLCBsMGdwdF9zeik7XFxuK1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXFx1MDAyNm5leHQsIFxcdTAwMjZwYXJfc3RhdGUpO1xcbitcXG4rXFx0XFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRcXHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHUFQgZm9yIHRoZSByZWdpb24gaXMgbm90IG1hbmFnZWQgYnkgZmlybXdhcmUgJWxseC0lbHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdHN0YXJ0LCBuZXh0KTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgPSBuZXh0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcHJlcGFyZV9tZW1vcnkocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcoc3RhcnQsIGVuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxcbit7XFxuK1xcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XFxuK1xcdHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7XFxuK1xcbitcXHRmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHtcXG4rXFx0XFx0aW50IHJldDtcXG4rXFxuK1xcdFxcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xcbitcXHRcXHRpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0XFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTtcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGlmIChhY3Rpb24gIT0gTUVNX0dPSU5HX09OTElORSlcXG4rXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbitcXG4rXFx0c3RhcnQgPSBQRk5fUEhZUyhhcmctXFx1MDAzZXN0YXJ0X3Bmbik7XFxuK1xcdGVuZCA9IFBGTl9QSFlTKGFyZy1cXHUwMDNlc3RhcnRfcGZuICsgYXJnLVxcdTAwM2Vucl9wYWdlcyk7XFxuK1xcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcXG4rXFxuK1xcdHJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKHJldCk7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcm1pX21lbW9yeV9uYiA9IHtcXG4rXFx0Lm5vdGlmaWVyX2NhbGwgPSBybWlfbWVtb3J5X25vdGlmaWVyLFxcbit9O1xcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuK1xcbitcXHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJ3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXFxuK1xcdHJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0LyogQWN0aXZhdGUgdGhlIFJNTSAqL1xcbitcXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvKTtcXG4rXFx0aWYgKCFzcm8pXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSByZXQgXFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIG91dF9kZWFjdGl2YXRlO1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFxcdTAwMjZybWlfbWVtb3J5X25iKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcXG4rXFxuK1xcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xcbitcXHRwcl9pbmZvKFxcXCJSTUkgY29uZmlndXJlZFxcXFxuXFxcIik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK291dF9kZWFjdGl2YXRlOlxcbitcXHRXQVJOX09OKHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxcbisgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXFxuKyAqL1xcbitzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmQ3ZWY3ZTgyYjI0Nlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxuQEAgLTAsMCArMSw1NDAgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXFxuKyAqL1xcbitcXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xcbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rXFxuKyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1RcXHQyNTZcXG4rXFxuK3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xcbitcXHRpbnQgYWRkcl9jb3VudDtcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xcbit9O1xcbitcXG4rLypcXG4rICogcm1pX3NtY2NjX2ludm9rZTogSW52b2tlIHRoZSBSTUkgY2FsbCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGluIEByZWdzX291dFxcbisgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXFxuKyAqIEByZWdzX291dDogT3VwdHB1dCByZXN1bHRzIGZyb20gdGhlIGNhbGwuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9ICpyZWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXR1cztcXG4rXFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGFybV9zbWNjY18xXzJfaW52b2tlKFxcdTAwMjZhcmdzLCByZWdzKTtcXG4rXFx0XFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApO1xcbitcXHRcXHRpZiAoc3RhdHVzICE9IFJNSV9CVVNZIFxcdTAwMjZcXHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNwdV9yZWxheCgpO1xcbitcXHR9XFxuK31cXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcXG4raW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApO1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuK1xcbisvKlxcbisgKiBSZXNldHRpbmcgdGhlIGFkZHJfY291bnQgaXMgc3VmZmljaWVudCB0byBpZ25vcmUgdGhlIGFkZHJfbGlzdCBjb250ZW50cy5cXG4rICovXFxuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3Nyby1cXHUwMDNlYWRkcl9jb3VudCA9IDA7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3Nyby1cXHUwMDNlcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKXsgX19WQV9BUkdTX18gfTtcXHRcXFxcXFxuK1xcdGxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcXHRcXHRcXFxcXFxuK1xcdHJtaV9zcm9fZnJlZShfX3Nybyk7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3JldDtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK30pXFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHNcXG4rICpcXHRcXHRcXHQgICAgIGZyb20gYSBnaXZlbiBub24tc2VjdXJlIHNvdXJjZSBncmFudWxlLlxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIEBkYXRhIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxcbisgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGUgd2l0aCBjb250ZW50c1xcbisgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXFxuKyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgZmxhZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHJhbmdlIHdpdGggdW5rbm93biBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeSBhdCBhIHByb3RlY3RlZFxcbisgKlxcdFxcdFxcdCAgSVBBIHJhbmdlXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcXG4rICpcXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cyxcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXHRyZXR1cm4gcmVncy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKlxcbisgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlLCBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGVkLCBhbGxvd2luZ1xcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxcbisgKlxcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XFxuKyAqXFxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxcbisgKlxcbisgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHQgICBTTUNfUk1JX1JFQUxNX0RFU1RST1ksIHJkKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxcbisgKiB0byBieSBAcGFyYW1zLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQgPSAwO1xcbitcXHRzcm8tXFx1MDAzZXJlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xcbitcXHR9O1xcbitcXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xcbitcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlXFxuKyAqXFxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcXG4rICpcXG4rICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcXG4rICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgaXBhLCBsb25nIGxldmVsKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfQ1JFQVRFLCByZCwgcnR0LCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcbitcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXFxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcXG4rICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIHRvcCBJUEEgb2Ygbm9uLWxpdmUgUlRUIGVudHJpZXMsIGZyb20gZW50cnlcXG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGFuIFJUVC4gVGhlIFJUVCBtdXN0IGJlIG5vbi1saXZlLCBpLmUuIG5vbmUgb2YgdGhlIGVudHJpZXMgaW4gdGhlXFxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0XFx0ICAgbG9uZyBsZXZlbCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRpZiAob3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXFxuKyAqXFxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXFxuKyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXFxuK1xcdFxcdFxcdFxcdGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF9ydHQpXFxuK1xcdFxcdCpvdXRfcnR0ID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcXG4rICpcXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X21hcCgpIC0gTWFwIHVucHJvdGVjdGVkIGdyYW51bGVzIGludG8gYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiBtYXBwZWRcXG4rICpcXG4rICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0XFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxcbisgKlxcbisgKiBDb21wbGV0ZXMgYSByZXF1ZXN0IG1hZGUgYnkgdGhlIHJlYWxtIHRvIGNoYW5nZSB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBXFxuKyAqIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2VcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxcbisgKlxcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcbitcXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XFxuK31cXG4rXFxuKyNlbmRpZlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMTRkNjIyOGRmYzIyXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxuQEAgLTAsMCArMSw0OTcgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICpcXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxcbisgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRmaWVsZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wYWdlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXFx0XFx0XFxcXFxcbitcXHRcXHRcXHQgICBBUk1fU01DQ0NfU01DXzY0LFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgKGZ1bmMpKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cXHRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTUwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTcpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTkpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YilcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWMpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjEpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjMpXFxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NClcXG4rI2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmUpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcXG4rI2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0hcXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc4KVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2IpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2YpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODUpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NilcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NylcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODgpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODkpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxOGEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThiKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDIpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjEpXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcXHRTTUNfUk1JX0NBTEwoMHgwMWYyKVxcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjMpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY1KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmIpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDApXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMilcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDgpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDkpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGMpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBkKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGUpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMClcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0R0VOTUFTSyg3LCAwKVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1xcdFxcdEdFTk1BU0soMTUsIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdEdFTk1BU0soOSwgOClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTS1xcdEJJVCgxMClcXG4rXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXFx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXFxuK1xcbisjZGVmaW5lIFJNSV9TVUNDRVNTXFx0XFx0XFx0MFxcbisjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVBTE1cXHRcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1xcdFxcdFxcdDNcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUXFx0XFx0XFx0NFxcbisjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXFx0XFx0NVxcbisjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcXHRcXHQ2XFxuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcXHRcXHQ3XFxuKyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXFx0XFx0OFxcbisjZGVmaW5lIFJNSV9FUlJPUl9EUFRcXHRcXHRcXHQ5XFxuKyNkZWZpbmUgUk1JX0JVU1lcXHRcXHRcXHQxMFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcXHRcXHQxMVxcbisjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1xcdFxcdDEyXFxuKyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcXHRcXHRcXHQxM1xcbisjZGVmaW5lIFJNSV9CTE9DS0VEXFx0XFx0XFx0MTRcXG4rI2RlZmluZSBSTUlfRVJST1JfR1BUXFx0XFx0XFx0MTVcXG4rI2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVxcdFxcdDE2XFxuK1xcbisjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVxcdFxcdDFcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTFxcdFxcdDFcXG4rXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXFx0XFx0R0VOTUFTSygxOCwgMTcpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1xcdFxcdEJJVCgxNilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0tcXHRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLXFx0R0VOTUFTSygxLCAwKVxcbitcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRShyZXEpXFx0RklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fQ09OVElHXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXFx0R0VOTUFTSyg2MywgNjIpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXFx0R0VOTUFTSyg1MSwgUEFHRV9TSElGVClcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXFx0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0tcXHRHRU5NQVNLKDEsIDApXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUocilcXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcXHRcXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgKHIpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocilcXHRcXHQoKHIpIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKHIpXFx0XFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIChyKSlcXG4rXFxuK2VudW0gcm1pX3JpcGFzIHtcXG4rXFx0Uk1JX0VNUFRZID0gMCxcXG4rXFx0Uk1JX1JBTSA9IDEsXFxuK1xcdFJNSV9ERVNUUk9ZRUQgPSAyLFxcbitcXHRSTUlfREVWID0gMyxcXG4rfTtcXG4rXFxuKyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFxcdDBcXG4rI2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXFx0MVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlxcdFxcdFxcdEdFTk1BU0soNDAsIDMzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEVcXHRCSVQoMzIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRcXHRHRU5NQVNLKDMxLCAyNylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVxcdFxcdFxcdEJJVCgyNilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcXHRcXHRcXHRHRU5NQVNLKDI1LCAyMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFNcXHRcXHRcXHRHRU5NQVNLKDE5LCAxNClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTFxcdFxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXFx0XFx0XFx0QklUKDkpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyXFx0XFx0XFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXFx0XFx0XFx0R0VOTUFTSyg3LCAwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1xcdFxcdFxcdEdFTk1BU0soMTYsIDE0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlxcdFxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVJcXHRcXHRHRU5NQVNLKDksIDYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcXHRcXHRCSVQoNSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFxcdFxcdEJJVCg0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2XFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcXHRcXHRCSVQoMClcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVJcXHRHRU5NQVNLKDE0LCAxMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXFx0XFx0QklUKDkpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WREVWX0tST1VcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXFx0XFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVVxcdFxcdFxcdEJJVCgyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXFx0XFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVxcdFxcdFxcdEJJVCgwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXFx0QklUKDYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcXHRcXHRHRU5NQVNLKDUsIDQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcXHRHRU5NQVNLKDMsIDApXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXFx0XFx0R0VOTUFTSyg2MywgMClcXG4rXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FXFx0XFx0XFx0M1xcbitcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcXHRcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcXHRcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVxcdFxcdFxcdDNcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFXFx0XFx0NFxcbitcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlxcdDBcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcXHQxXFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXFx0MlxcbitcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9QTEFUICAgICAgICAgICAgICAgMVVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcXG4rXFxuKy8qXFxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcXG4rICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cXG4rICovXFxuK3N0cnVjdCBybW1fY29uZmlnIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xcbitcXHRcXHRcXHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggc2l6ZXJbU1pfNEtdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcXG4rXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcXHRcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXFx0XFx0R0VOTUFTSyg2LCA1KVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcXHRcXHRHRU5NQVNLKDgsIDcpXFxuK1xcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XFx0XFx0XFx0MlxcbitcXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczA7XFxuK1xcdFxcdFxcdHU2NCBzMnN6O1xcbitcXHRcXHRcXHR1NjQgc3ZlX3ZsO1xcbitcXHRcXHRcXHR1NjQgbnVtX2JwcztcXG4rXFx0XFx0XFx0dTY0IG51bV93cHM7XFxuK1xcdFxcdFxcdHU2NCBwbXVfbnVtX2N0cnM7XFxuK1xcdFxcdFxcdHU2NCBoYXNoX2FsZ287XFxuK1xcdFxcdFxcdHU2NCBudW1fYXV4X3BsYW5lcztcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NDAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHJwdls2NF07XFxuK1xcdFxcdFxcdHU2NCBhdHNfcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxWzB4NDAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDgwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcGFkZGluZzI7XFxuK1xcdFxcdFxcdHU2NCBydHRfYmFzZTtcXG4rXFx0XFx0XFx0czY0IHJ0dF9sZXZlbF9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IHJ0dF9udW1fc3RhcnQ7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczE7XFxuK1xcdFxcdFxcdHU2NCBtYXhfbnVtX3ZkZXZzO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDcwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHhmMDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzRbMHg4MF07XFxuK1xcdFxcdFxcdHU2NCBhdXhfcnR0X2Jhc2VbM107XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc1WzB4MTAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcXG4rXFxuKy8qXFxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcXG4rICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXFxuKyAqL1xcbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1xcdFxcdDhcXG4rXFxuKyNkZWZpbmUgUkVDX1BBUkFNU19GTEFHX1JVTk5BQkxFXFx0QklUKDApXFxuK1xcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHU2NCBmbGFncztcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHU2NCBtcGlkcjtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBwYztcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4ZDAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XFxuK1xcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cXHRCSVQoMClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXFx0QklUKDEpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXFx0QklUKDQpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVxcdEJJVCg1KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcXHRCSVQoNilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFxcdFxcdEJJVCg3KVxcbitcXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcXHRcXHRcXHQzMVxcbitcXG4rc3RydWN0IHJlY19lbnRlciB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTY0IGZsYWdzO1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDIwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHg2MDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19lbnRlcikgPT0gU1pfMkspO1xcbitcXG4rI2RlZmluZSBSTUlfRVhJVF9TWU5DXFx0XFx0XFx0MHgwMFxcbisjZGVmaW5lIFJNSV9FWElUX0lSUVxcdFxcdFxcdDB4MDFcXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcXHRcXHRcXHQweDAyXFxuKyNkZWZpbmUgUk1JX0VYSVRfUFNDSVxcdFxcdFxcdDB4MDNcXG4rI2RlZmluZSBSTUlfRVhJVF9SSVBBU19DSEFOR0VcXHRcXHQweDA0XFxuKyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXFx0XFx0MHgwNVxcbisjZGVmaW5lIFJNSV9FWElUX1NFUlJPUlxcdFxcdFxcdDB4MDZcXG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVxcdFxcdDB4MDdcXG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcXHQweDA4XFxuKyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORFxcdFxcdDB4MGFcXG4rXFxuK3N0cnVjdCByZWNfZXhpdCB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTggZXhpdF9yZWFzb247XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDEwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgZXNyO1xcbitcXHRcXHRcXHR1NjQgZmFyO1xcbitcXHRcXHRcXHR1NjQgaHBmYXI7XFxuK1xcdFxcdFxcdHU2NCBydHRfdHJlZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmcyWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDMwMCAqL1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGNudHBfY3RsO1xcbitcXHRcXHRcXHR1NjQgY250cF9jdmFsO1xcbitcXHRcXHRcXHR1NjQgY250dl9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N2YWw7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc0WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDUwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHJpcGFzX3RvcDtcXG4rXFx0XFx0XFx0dTggcmlwYXNfdmFsdWU7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc1WzB4Zl07XFxuK1xcdFxcdFxcdHU2NCBzMmFwX2Jhc2U7XFxuK1xcdFxcdFxcdHU2NCBzMmFwX3RvcDtcXG4rXFx0XFx0XFx0dTY0IHZkZXZfaWRfMTtcXG4rXFx0XFx0XFx0dTY0IHZkZXZfaWRfMjtcXG4rXFx0XFx0XFx0dTY0IGRldl9tZW1fYmFzZTtcXG4rXFx0XFx0XFx0dTY0IGRldl9tZW1fdG9wO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9wYTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzZbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NjAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHUxNiBpbW07XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc3WzB4Nl07XFxuK1xcdFxcdFxcdHU2NCBwbGFuZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzhbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NzAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHBtdV9vdmZfc3RhdHVzO1xcbitcXHRcXHRcXHR1OCBwYWRkaW5nOVsweGZdO1xcbitcXHRcXHRcXHR1NjQgdnNtbXU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxMFsweDEwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcXG4rXFxuK3N0cnVjdCByZWNfcnVuIHtcXG4rXFx0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcXG4rXFx0c3RydWN0IHJlY19leGl0IGV4aXQ7XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xcbitcXG4rLyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXFx0R0VOTUFTSygxOCwgMTYpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcXHRcXHRHRU5NQVNLKDIyLCAxOSlcXG4rXFxuKy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXFx0R0VOTUFTSygxNSwgMilcXG4rXFxuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVxcdFxcdFxcdEJJVCgwKVxcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXFx0XFx0XFx0QklUKDEpXFxuK1xcbisjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDA5OjA5OjIyLjg2Nzc2Mzg5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxNDYwMTgwNzM1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2Y3OWQwOTQ0MTRhNmU2MzI5NmVkMzNhMzNmNmI5ZDc4MzJkYTRiY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDA5OjA5OjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXG5pbmRleCBiNWE1MWIwZWY5NDQwLi5mZjk1NjVkM2ZmYTU5IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcbkBAIC0zOCw2ICszOCw3IEBAIGNvbmZpZyBBUk02NFxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HU1xuK1x0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0VcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5pbmRleCAzMjEwMmMzOTEyZmE3Li5lOGIyOTk4M2IwMDIxIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG4rKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbkBAIC0yOTMsNiArMjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7XG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxuK1x0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX1ZJU0lCTEUsIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfRElUX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5pbmRleCBiN2NjMTFlNGZiZmE2Li42MjY2MGJmNTIwYThkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMTAsNSArMzEwLDYgQEAgc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCJcbitzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wiXG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcdFx0XHRcdCs9IHNhbXN1bmcvXG4gb2JqLXlcdFx0XHRcdCs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQrPSB0ZWdyYS9cbiBvYmoteVx0XHRcdFx0Kz0geGlsaW54L1xuK29iai15XHRcdFx0XHQrPSBhcm1fcm1tL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xuQEAgLTAsMCArMSwyNiBAQFxuK1xuK2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuK1x0Ym9vbFxuK1xuK2NvbmZpZyBBUk1fUk1NX1JNSVxuK1x0Ym9vbCBcIlJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcIlxuK1x0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTVxuK1x0ZGVmYXVsdCB5XG4rXHRoZWxwXG4rXHQgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0XG4rXHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXG4rXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXG4rXG4rXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cbitcdCAgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSxcbitcdCAgbWFuYWdlIGFuZCBydW4gcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhlIFJNTSBjYW5cbitcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXG4rXHQgIFBDSSBJREUgc2V0dXAgZm9yIHNlY3VyaW5nIHRoZSBQQ0llIGxpbmtzLlxuK1xuK1x0ICBUaGlzIG9wdGlvbiBidWlsZHMgdGhlIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCB1c2VkIGJ5IEtWTSB0byBkZXRlY3QgYVxuK1x0ICBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlXG4rXHQgIFJlYWxtIGd1ZXN0cy5cbitcbitcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XG4rXHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuK1x0ICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgKzEsMiBAQFxuK1xuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcdD0gcm1pLm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41ODNlMWFjYTliMTVhXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbkBAIC0wLDAgKzEsOTk5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1ZmVhdHVyZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXJtaS1jbWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcdTAwM2Nhc20vbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4rXG4rc3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbitcbisvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cbisjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVFx0MlxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdIF9fcm9fYWZ0ZXJfaW5pdDtcbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXG4rICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbisgKlxuKyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXG4rICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuKyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxuKyAqXG4rICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbisgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvblxuKyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeVxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb25cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfY2F0ZWdvcnksXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmVncy5hMDtcbitcbitcdGlmIChvdXRfY2F0ZWdvcnkpXG4rXHRcdCpvdXRfY2F0ZWdvcnkgPSByZWdzLmExO1xuK1x0aWYgKG91dF9zdGF0ZSlcbitcdFx0Km91dF9zdGF0ZSA9IHJlZ3MuYTI7XG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuK31cbitcbisvKlxuKyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi5cbisgKiBAc3RhcnQ6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaFxuKyAqXHRcdHRoZSBHUFQgQG91dF9ncHRfcGFyX3N0YXRlIGlzIHZhbGlkXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW3N0YXJ0LCBvdXRfdG9wKVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3B0X2luZm8odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX0dQVF9JTkZPLCBzdGFydCwgZW5kLFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4rXHRpZiAocmVncy5hMCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0cmV0dXJuIHJlZ3MuYTA7XG4rXG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0aWYgKG91dF9ncHRfcGFyX3N0YXRlKVxuK1x0XHQqb3V0X2dwdF9wYXJfc3RhdGUgPSByZWdzLmEyO1xuK1xuK1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuK31cbitcbisvKipcbisgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9IHtcbitcdFx0U01DX1JNSV9GRUFUVVJFUywgaW5kZXhcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNmFyZ3MpO1xuK1x0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dClcbitcdFx0Km91dCA9IGFyZ3MuYTE7XG4rXG4rXHRyZXR1cm4gYXJncy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4rICpcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4rXG4rXHRyZXR1cm4gcmVncy5hMDtcbit9XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleClcbit7XG4rXHRpZiAoV0FSTl9PTihpbmRleCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0XHQvKiBCdWdneSBSTU0gPyBMZXQgdGhlIGNhbGxlciBsZWFrIHRoZSBwYWdlcyAqL1xuK1x0XHRcdGlmIChXQVJOX09OKG91dF90b3AgXHUwMDNjPSBwaHlzKSlcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXG4re1xuK1x0bG9uZyByZXQgPSAwO1xuK1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcbitcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbitcbitcdHdoaWxlIChwaHlzIFx1MDAzYyB0b3ApIHtcbitcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbitcbitcdFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuK1x0XHRcdC8qIEJ1Z2d5IFJNTSA/ICovXG4rXHRcdFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcdTAwM2M9IHBoeXMpKSB7XG4rXHRcdFx0XHRybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTtcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0fVxuK1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAob3V0X3BoeXMpXG4rXHRcdCpvdXRfcGh5cyA9IHBoeXM7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xuK1xuKy8qXG4rICogQ29udmVydCB0aGUgUm1pQWRkckJsb2NrU2l6ZSB0byBhY3R1YWwgc2l6ZS4gVGhpcyBpcyB1c2VkIGluIFJtaURvbmF0ZVJlcVxuKyAqIGFuZCBSbWlBZGRyUmFuZ2VEZXNjKi5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQpXG4re1xuK1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xuK31cbitcbisvKlxuKyAqIGZyZWVfYWRkcl9yYW5nZTogRnJlZSBtZW1vcnkgZGVzY3JpYmVkIGJ5IHRoZSBhZGRyZXNzIHJhbmdlIGVudHJ5LCB3aGljaCBtYXlcbisgKlx0XHQgICAgYmUgcGFydGlhbGx5IGNvbnN1bWVkIGJ5IFJNTS5cbisgKlxuKyAqIEBlbnRyeTogUk1JX0FERFJfUkFOR0UgZGVzY3JpcHRvclxuKyAqIEBjb25zdW1lZF9zaXplOiBQYWdlIGFsaWduZWQgc2l6ZSBjb25zdW1lZCBieSB0aGUgUk1NIGZyb20gdGhlIGFkZHJlc3MgcmFuZ2UuXG4rICpcbisgKiBJZiB0aGUgc3RhdGUgb2YgdGhlIGFkZHJlc3MgaXMgREVMRUdBVEVELCB1bmRlbGVnYXRlIGl0IGJhY2ssIGJlZm9yZSBmcmVlaW5nLlxuKyAqIExlYWtzIHRoZSBtZW1vcnkgaWYgd2UgY2Fubm90IHVuZGVsZWdhdGUgdGhlIHJhbmdlLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGZyZWVfYWRkcl9yYW5nZSh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3NpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpICogY291bnQ7XG4rXG4rXHRXQVJOX09OKCFQQUdFX0FMSUdORUQocGh5cykgfHwgIVBBR0VfQUxJR05FRChjb25zdW1lZF9zaXplKSk7XG4rXG4rXHQvKiBBZGp1c3QgdGhlIGFkZHJlc3MgYW5kIHNpemUgZm9yIHBhcnRpYWxseSBjb25zdW1lZCBlbnRyeSAqL1xuK1x0cGh5cyArPSBjb25zdW1lZF9zaXplO1xuK1x0c2l6ZSAtPSBjb25zdW1lZF9zaXplO1xuK1x0LypcbitcdCAqIFVuZGVsZWdhdGUgdGhlIHBhZ2VzIGJhY2sgaWYgcmVxdWlyZWQuIElmIHdlIGNhbid0XG4rXHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cbitcdCAqL1xuK1x0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEIFx1MDAyNlx1MDAyNlxuK1x0ICAgIFdBUk5fT04ocm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSkpKVxuK1x0XHRyZXR1cm47XG4rXHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChwaHlzKSwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4rXHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXG4rXHR9O1xuK1xuK1x0LypcbitcdCAqIFRoZSBvdXRwdXQgZG9uYXRlZCBjb3VudCAoYTEpIGlzIGFsd2F5cyB2YWxpZCwgaXJyZXNwZWN0aXZlXG4rXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcbitcdCAqL1xuK1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fcmVjbGFpbSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4rXHRcdFNNQ19STUlfT1BfTUVNX1JFQ0xBSU0sIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xuK31cbitcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBjb3VudClcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4rXHRcdHJldHVybiAtRU9WRVJGTE9XO1xuK1xuK1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuK1x0XHRyZXR1cm4gLUVOT1NQQztcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbitcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbitcdFx0XHRcdCBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJsb2NrX3NpemUgKiBjb3VudDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcztcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplO1xuK1x0aW50IHJldDtcbitcdHZvaWQgKnZpcnQ7XG4rXHRwaHlzX2FkZHJfdCBwaHlzO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxuK1x0ICogcG93ZXIgb2YgMlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuK1x0XHRcdHNyby1cdTAwM2VhZGRyX2NvdW50LS07XG4rXHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSxcbitcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuK1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBnZnApO1xuK1x0aWYgKCF2aXJ0KVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4rXG4rXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbitcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuK1x0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBzaXplKTtcbitcdFx0XHRyZXR1cm4gLUVOWElPO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgYmxvY2tfc2l6ZV9mbGQpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4rXG4rb3V0OlxuK1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbitcdFx0XHQgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksIDEsXG4rXHRcdFx0ICAwLCBvdXRfcmVncyk7XG4rXHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4rXG4rXHRpZiAoV0FSTl9PTihkb25hdGVkX2dyYW51bGVzIFx1MDAzZSAoc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkpKVxuK1x0XHRkb25hdGVkX2dyYW51bGVzID0gKHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuK1xuK1x0ZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdC8qIEFsbCBncmFudWxlcyBjb25zdW1lZCBieSB0aGUgUk1NICovXG4rXHRpZiAoZG9uYXRlZF9zaXplID09IHNpemUpXG4rXHRcdHJldHVybiAwO1xuK1x0LyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovXG4rXHRpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7XG4rXHRcdHNyby1cdTAwM2VhZGRyX2NvdW50Kys7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogVGhlIGdyYW51bGVzIHdlcmUgcGFydGlhbGx5IGNvbnN1bWVkLCByZWNsYWltIHRoZSB1bnVzZWQgb25lcy4gKi9cbitcdGZyZWVfYWRkcl9yYW5nZShzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbitcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbitcdFx0XHRcdCAgICBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgZm91bmQgPSAwO1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xuK1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dW5zaWduZWQgbG9uZyBjb25zdW1lZF9ibG9ja3M7XG4rXHRpbnQgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXG4rXHRcdGlmIChSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KSA9PSBibG9ja19zaXplX2ZsZCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4rXHRcdFx0YWRkcl9saXN0X3N0YXJ0LS07XG4rXHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXG4rXHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbitcdFx0XHRmb3VuZCsrO1xuK1x0XHRcdGktLTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcbitcdFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KGJsb2NrX3NpemUsIGdmcCk7XG4rXHRcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRcdGlmICghdmlydClcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBibG9ja19zaXplLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgYmxvY2tfc2l6ZSk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOWElPO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1x0XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCsrXSA9IGFkZHJfcmFuZ2U7XG4rXHRcdGZvdW5kKys7XG4rXHR9XG4rXG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4rXHRcdFx0ICBjb3VudCwgMCwgb3V0X3JlZ3MpO1xuK1xuK1x0ZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuK1x0ICoganVzdCBpbiBjYXNlLlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX2Jsb2NrKSlcbitcdFx0ZG9uYXRlZF9ncmFudWxlcyA9IGNvdW50ICogZ3JhbnVsZXNfcGVyX2Jsb2NrO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbitcdCAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIGJsb2NrLXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuK1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIGJsb2Nrcy5cbitcdCAqL1xuK1x0Y29uc3VtZWRfYmxvY2tzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl9ibG9jaztcbitcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSB7XG4rXHRcdC8qXG4rXHRcdCAqIEEgYmxvY2sgaGFzIGJlZW4gcGFydGlhbGx5IGNvbnN1bWVkLCB0aGUgc3RhcnQgaXMgb3duZWQgYnlcbitcdFx0ICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3RcbitcdFx0ICovXG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPVxuK1x0XHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfYmxvY2tzXTtcbitcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuK1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdFx0ZnJlZV9hZGRyX3JhbmdlKGVudHJ5LCBkb25hdGVkX3NpemUpO1xuK1x0XHQvKlxuK1x0XHQgKiBUaGlzIGJsb2NrIGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4rXHRcdCAqIGZyZWVkKVxuK1x0XHQgKi9cbitcdFx0Y29uc3VtZWRfYmxvY2tzKys7XG4rXHR9XG4rXG4rXHQvKiBLZWVwIGp1c3QgdGhlIGJsb2NrcyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXG4rXHRmb3IgKGludCBpID0gY29uc3VtZWRfYmxvY2tzOyBpIFx1MDAzYyBjb3VudDsgaSsrKVxuK1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGkgLSBjb25zdW1lZF9ibG9ja3NdID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfYmxvY2tzO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyxcbitcdFx0XHQgIGdmcF90IGdmcClcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSkpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpID09IFJNSV9PUF9NRU1fQ09OVElHKSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbitcbitcdGlmIChybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpKVxuK1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbitcbitcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuK1x0XHRcdCAgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksXG4rXHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbitcbitcdC8qXG4rXHQgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZVxuK1x0ICAqIGlucHV0IHBhcmFtZXRlcnMgd2VyZSBpbnZhbGlkLlxuK1x0ICAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXHUwMDNlYTEgXHUwMDNlIGNhcGFjaXR5KSlcbitcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVx1MDAzZWExO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0LyogSGFuZGxlIHRoZSB3b3JzZSAqL1xuK1x0aWYgKFdBUk5fT04oc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNjIDApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAoV0FSTl9PTihzcm8tXHUwMDNlYWRkcl9jb3VudCBcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QpKVxuK1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IFJNSV9NQVhfQUREUl9MSVNUO1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpKyspXG4rXHRcdGZyZWVfYWRkcl9yYW5nZShzcm8tXHUwMDNlYWRkcl9saXN0W2ldLCAwKTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcbitcbitsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXHUwMDI2c3JvLVx1MDAzZXJlZ3M7XG4rXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShyZWdzKTtcbitcbitcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuK1x0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XG4rXHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcbitcdFx0aW50IHJldCA9IDA7XG4rXG4rXHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOlxuK1x0XHRcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcbitcdFx0XHRcdFx0cmVncyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfRE9OQVRFOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbitcdFx0XHRcdFx0ICAgICBnZnApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4rXHRcdFx0cmV0ID0gcm1pX3Nyb19yZWNsYWltKHNybywgc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0cmV0ID0gV0FSTl9PTl9PTkNFKDEpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIEFsbCBtZW1vcnkgZG9uYXRpbmcgU1JPcyBtdXN0IGJlIGNhbmNlbGxhYmxlLiBTbyBhXG4rXHRcdFx0ICogZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbiBzaG91bGRuJ3QgYmUgYW4gaXNzdWUuXG4rXHRcdFx0ICogSG93ZXZlciwgaWYgd2UgZW5jb3VudGVyIGEgcmFuZG9tIGZhaWx1cmUgKGUuZy4sXG4rXHRcdFx0ICogYnVnZ3kgUk1NKSwgZG9uJ3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogSWYgd2UgaGF2ZSBhbHJlYWR5IGNhbmNlbGxlZCwgYW5kIGNhbWUgYmFjayBoZXJlIGR1ZVxuK1x0XHRcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxuK1x0XHRcdCAqIGluIGdvaW5nIGluIGxvb3BzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbitcbitcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApICE9IFJNSV9JTkNPTVBMRVRFKSlcbitcdFx0XHRcdHJldHVybiByZXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChjYW5jZWxsZWQpXG4rXHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbitcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuK2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4re1xuK1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKHJlZ3MpO1xuK1xuK1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbitcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApID09IFJNSV9PUF9DQU5fQ0FOQ0VMO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4rXHRcdFx0XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbitcdFx0XHQvKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBkb24ndCByZXRyeSB0aGlzICovXG4rXHRcdFx0aWYgKGNhbmNlbGxlZClcbitcdFx0XHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKGNhbmNlbGxlZClcbitcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4rXG4rXHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcbitcbitzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4re1xuK1x0dW5zaWduZWQgc2hvcnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjtcbitcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0XHRcdFx0XHQgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xuK1x0XHRTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbixcbitcdH07XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVzKTtcbitcdGlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpXG4rXHRcdHJldHVybiAtRU5YSU87XG4rXG4rXHR2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpO1xuK1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbitcbitcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4rXG4rXHRcdGhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTtcbitcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuK1xuK1x0XHRwcl9lcnIoXCJVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCIsXG4rXHRcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxuK1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0XHRyZXR1cm4gLUVOWElPO1xuK1x0fVxuK1xuK1x0cHJfaW5mbyhcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcblwiLCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpXG4re1xuK1x0LypcbitcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcbitcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4rXHQgKi9cbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkrKykge1xuK1x0XHRpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTtcbitcdGludCByZXQgPSAwO1xuK1x0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcbitcbitcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XG4rXHRjYXNlIFNaXzRLOlxuK1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl8xNks6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xuK1x0XHRicmVhaztcbitcdGNhc2UgU1pfNjRLOlxuK1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XG4rXHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRCVUlMRF9CVUcoKTtcbitcdH1cbitcbitcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcdTAwMjYgZ3JhbnVsZV9mZWF0dXJlKSkge1xuK1x0XHRwcl9lcnIoXCJSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcblwiLFxuK1x0XHQgICAgICAgUEFHRV9TSVpFIFx1MDAzZVx1MDAzZSAxMCk7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWNvbmZpZykge1xuK1x0XHRwcl9lcnIoXCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSTU0gY29uZmlnXFxuXCIpO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcbitcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gZ3JhbnVsZV9zaXplO1xuK1xuK1x0LypcbitcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxuK1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbitcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuK1x0ICogUEFHRV9TSVpFU1xuK1x0ICovXG4rXHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuK1xuK1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcXG5cIiwgcmV0KTtcbitcdFx0cmV0ID0gLUVJTlZBTDtcbitcdH1cbitcbitcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLypcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuK1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4rXHRcdCAgICBjYXRlZ29yeSAhPSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTCkge1xuK1x0XHRcdC8qIFRPRE86IFNldCBncmFudWxlIHRyYWNraW5nIGluIHRoaXMgY2FzZSAqL1xuK1x0XHRcdHByX2VycihcIkdyYW51bGUgdHJhY2tpbmcgZm9yIHJlZ2lvbiBpc24ndCBmaW5lL2NvbnZlbnRpb25hbDogJWxseC0lbHhcXG5cIixcbitcdFx0XHQgICAgICAgc3RhcnQsIG5leHQpO1xuK1x0XHRcdHJldHVybiAtRU5PREVWO1xuK1x0XHR9XG4rXHRcdHN0YXJ0ID0gbmV4dDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNyZWF0aW5nIEwxIEdQVHMgeWV0LiBTbywgbWFrZSBzdXJlIHRoYXRcbisgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbDBncHRfc3o7XG4rXHR1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTtcbitcbitcdGwwZ3B0X3N6ID0gMVVMIFx1MDAzY1x1MDAzYyAoMzAgKyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxuK1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuK1x0c3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7XG4rXHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcbitcbitcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4rXHRcdGxvbmcgcmV0ID0gcm1pX2dwdF9pbmZvKHN0YXJ0LCBlbmQsIFx1MDAyNm5leHQsIFx1MDAyNnBhcl9zdGF0ZSk7XG4rXG4rXHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRcdGlmIChwYXJfc3RhdGUgIT0gUk1JX0dQVF9QQVJfUExBVCkge1xuK1x0XHRcdHByX2VycihcIkdQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwiLFxuK1x0XHRcdFx0c3RhcnQsIG5leHQpO1xuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1x0XHR9XG4rXHRcdHN0YXJ0ID0gbmV4dDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTtcbit9XG4rXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxuK3tcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1xuK1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdGludCByZXQ7XG4rXG4rXHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuK1x0XHRpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0XHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4rXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xuK1x0aW50IHJldDtcbitcbitcdGlmIChhY3Rpb24gIT0gTUVNX0dPSU5HX09OTElORSlcbitcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuK1xuK1x0c3RhcnQgPSBQRk5fUEhZUyhhcmctXHUwMDNlc3RhcnRfcGZuKTtcbitcdGVuZCA9IFBGTl9QSFlTKGFyZy1cdTAwM2VzdGFydF9wZm4gKyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuK1x0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuK1xuK1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuK1x0Lm5vdGlmaWVyX2NhbGwgPSBybWlfbWVtb3J5X25vdGlmaWVyLFxuK307XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGlzX3JtaV9hdmFpbGFibGUpO1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXG4re1xuK1x0aW50IHJldDtcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4rXG4rXHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJ3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4rXHRyZXQgPSBybWlfY2hlY2tfdmVyc2lvbigpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIEFjdGl2YXRlIHRoZSBSTU0gKi9cbitcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8pO1xuK1x0aWYgKCFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcblwiKTtcbitcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuK1x0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XG4rXG4rXHRyZXQgPSByZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoXHUwMDI2cm1pX21lbW9yeV9uYik7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuK1xuK1x0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XG4rXHRwcl9pbmZvKFwiUk1JIGNvbmZpZ3VyZWRcXG5cIik7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitvdXRfZGVhY3RpdmF0ZTpcbitcdFdBUk5fT04ocm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmZkN2VmN2U4MmIyNDZcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgKzEsNTQwIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rXG4rI2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4rXG4rc3RydWN0IHJtaV9zcm9fc3RhdGUge1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuK1x0aW50IGFkZHJfY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4rfTtcbitcbisvKlxuKyAqIHJtaV9zbWNjY19pbnZva2U6IEludm9rZSB0aGUgUk1JIGNhbGwgYW5kIHJldHVybiB0aGUgcmVzdWx0cyBpbiBAcmVnc19vdXRcbisgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXG4rICogQHJlZ3Nfb3V0OiBPdXB0cHV0IHJlc3VsdHMgZnJvbSB0aGUgY2FsbC5cbisgKi9cbitzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9ICpyZWdzO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZhcmdzLCByZWdzKTtcbitcdFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCk7XG4rXHRcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXHUwMDI2XHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcbitcdFx0XHRicmVhaztcbitcdFx0Y3B1X3JlbGF4KCk7XG4rXHR9XG4rfVxuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpO1xuK1xuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcbit9XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xuK1xuK2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcbitsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbitcbisvKlxuKyAqIFJlc2V0dGluZyB0aGUgYWRkcl9jb3VudCBpcyBzdWZmaWNpZW50IHRvIGlnbm9yZSB0aGUgYWRkcl9saXN0IGNvbnRlbnRzLlxuKyAqL1xuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1x0XHRcdFx0XFxcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1x0XHRcdFx0XFxcbitcdF9fc3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1x0XHRcdFx0XHRcdFxcXG4rXHRfX3Nyby1cdTAwM2VyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpeyBfX1ZBX0FSR1NfXyB9O1x0XFxcbitcdGxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcdFx0XFxcbitcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbitcdF9fcmV0O1x0XHRcdFx0XHRcdFx0XHRcXFxuK30pXG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHNcbisgKlx0XHRcdCAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcbisgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlIHdpdGggY29udGVudHNcbisgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxuKyAqXG4rICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZ1xuKyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbitcdH07XG4rXG4rXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSByYW5nZSB3aXRoIHVua25vd24gY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeSBhdCBhIHByb3RlY3RlZFxuKyAqXHRcdFx0ICBJUEEgcmFuZ2VcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4rXHRcdGlmIChvdXRfdG9wKVxuK1x0XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcdFx0aWYgKG91dF9yYW5nZSlcbitcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdFx0aWYgKG91dF9jb3VudClcbitcdFx0XHQqb3V0X2NvdW50ID0gcmVncy5hMztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuKyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcbisgKlxuKyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbitcdHJldHVybiByZWdzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSwgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlZCwgYWxsb3dpbmdcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCxcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuK1x0cmV0dXJuIHJlZ3MuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4rICpcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxuKyAqXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxuKyAqXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbisgKiB0byBieSBAcGFyYW1zLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRsb25nIHJldDtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbitcdHNyby1cdTAwM2VyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbitcdH07XG4rXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuK1x0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcbitcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbisgKlxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0cixcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuK1x0cmV0dXJuIHJlZ3MuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgIGxvbmcgbGV2ZWwsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKG91dF9ydHQpXG4rXHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTI7XG4rXG4rXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXG4rICpcbisgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJ2hvbW9nZW5lb3VzJyB0aGUgUlRUIGNhbiBiZVxuKyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3J0dClcbitcdFx0Km91dF9ydHQgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbisgKlxuKyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxuKyAqXG4rICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0XG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQVxuKyAqIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcdGlmIChvdXRfcmFuZ2UpXG4rXHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuK1x0aWYgKG91dF9jb3VudClcbitcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4rXG4rXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XG4rfVxuK1xuKyNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMTRkNjIyOGRmYzIyXG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxuQEAgLTAsMCArMSw0OTcgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbisgKlxuKyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuKyAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vZG9jdW1lbnRhdGlvbi9kZW4wMTM3LzItMGJldDMvXG4rICovXG4rXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0ZmllbGQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFx1MDAzY2FzbS9wYWdlLmhcdTAwM2VcbitcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbitcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFx0XHRcXFxuK1x0XHRcdCAgIEFSTV9TTUNDQ19TTUNfNjQsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbitcdFx0XHQgICAoZnVuYykpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXHRcdFNNQ19STUlfQ0FMTCgweDAxNTMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1NylcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OClcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVhKVxuKyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWIpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2MSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NClcbisjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY1KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OClcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmEpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmUpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRllcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcbisjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzQpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXHRcdFNNQ19STUlfQ0FMTCgweDAxN2EpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2MpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZilcbitcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE4NilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg3KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODkpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbitcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVFx0U01DX1JNSV9DQUxMKDB4MDFkMClcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDIpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQzKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkNilcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRkKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTApXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4rXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbitcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYxKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAwKVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcbisjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYylcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbisjZGVmaW5lIFNNQ19STUlfR1BUX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjExKVxuK1xuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4rI2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbitcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpIFx1MDAzY1x1MDAzYyAxNikgfCAobWlub3IpKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHRHRU5NQVNLKDcsIDApXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0R0VOTUFTSygxNSwgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0R0VOTUFTSyg5LCA4KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0tcdEJJVCgxMClcbitcbisjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVgocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KVx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXG4rXG4rI2RlZmluZSBSTUlfU1VDQ0VTU1x0XHRcdDBcbisjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFx0XHRcdDFcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVx0XHRcdDJcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUNcdFx0XHQzXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUXHRcdFx0NFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcdFx0NVxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVx0XHQ2XG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFx0XHQ3XG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcdFx0OFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFx0XHRcdDlcbisjZGVmaW5lIFJNSV9CVVNZXHRcdFx0MTBcbisjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcdFx0MTFcbisjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1x0XHQxMlxuKyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcdFx0XHQxM1xuKyNkZWZpbmUgUk1JX0JMT0NLRURcdFx0XHQxNFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dQVFx0XHRcdDE1XG4rI2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVx0XHQxNlxuK1xuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcdFx0MFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcdFx0MVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORVx0XHQwXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEVcdFx0MVxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfUkVDTEFJTVx0XHQyXG4rXG4rI2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFx0XHQwXG4rI2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0tcdFx0R0VOTUFTSygxOCwgMTcpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXHRcdEJJVCgxNilcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTS1x0XHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbitcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEUocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFKHJlcSlcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0JMT0NLX1NJWkVfTUFTSywgcmVxKVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRFx0XHQxXG4rI2RlZmluZSBSTUlfT1BfTUVNX0NPTkRJVElPTkFMXHRcdDJcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fTk9OX0NPTlRJR1x0XHQwXG4rI2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJR1x0XHQxXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcdEdFTk1BU0soNjMsIDYyKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXHRHRU5NQVNLKDUxLCBQQUdFX1NISUZUKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuK1xuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShyKVx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgKHIpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSlcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocilcdFx0KChyKSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIChyKSlcbitcbitlbnVtIHJtaV9yaXBhcyB7XG4rXHRSTUlfRU1QVFkgPSAwLFxuK1x0Uk1JX1JBTSA9IDEsXG4rXHRSTUlfREVTVFJPWUVEID0gMixcbitcdFJNSV9ERVYgPSAzLFxuK307XG4rXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXHQwXG4rI2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRcdEdFTk1BU0soNDAsIDMzKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURVx0QklUKDMyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdFx0R0VOTUFTSygzMSwgMjcpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRcdEJJVCgyNilcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRcdEdFTk1BU0soMjUsIDIwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdFx0R0VOTUFTSygxOSwgMTQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTFx0XHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0XHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMlx0XHRcdEJJVCg4KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdFx0R0VOTUFTSyg3LCAwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFNcdFx0XHRHRU5NQVNLKDE2LCAxNClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlx0XHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0XHRHRU5NQVNLKDksIDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMlx0XHRCSVQoNSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0XHRcdEJJVCg0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0JcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQlx0XHRCSVQoMClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDE0LCAxMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTk9OX1RFRV9TVFJFQU1cdFx0QklUKDkpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0XHRCSVQoOClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUERFVl9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soNywgNClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXHRcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXHRcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFx0XHRcdEJJVCgxKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVx0XHRcdEJJVCgwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1x0R0VOTUFTSygzLCAwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcdFx0R0VOTUFTSyg2MywgMClcbitcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMXHRcdDBcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0hcdFx0MVxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09IXHRcdDJcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfTk9ORVx0XHRcdDNcbitcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFx0XHRcdDBcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19OT05FXHRcdFx0MVxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXHRcdFx0M1xuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0lOVEVSTUVESUFURVx0XHQ0XG4rXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCXHQxXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbitcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVVxuKyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVVxuK1xuKy8qXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxuKyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuXG4rICovXG4rc3RydWN0IHJtbV9jb25maWcge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XG4rXHRcdFx0dTY0IHJtaV9ncmFudWxlX3NpemU7XG4rXHRcdH07XG4rXHRcdHU4IHNpemVyW1NaXzRLXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xuK1xuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXHRcdEJJVCgxKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXHRcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcdFx0XHRCSVQoMylcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcdFx0R0VOTUFTSyg2LCA1KVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVx0XHRHRU5NQVNLKDgsIDcpXG4rXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2XHRcdFx0MFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlx0XHRcdDFcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcdFx0XHQyXG4rXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XG4rXHR1bmlvbiB7IC8qIDB4MCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBmbGFnczA7XG4rXHRcdFx0dTY0IHMyc3o7XG4rXHRcdFx0dTY0IHN2ZV92bDtcbitcdFx0XHR1NjQgbnVtX2JwcztcbitcdFx0XHR1NjQgbnVtX3dwcztcbitcdFx0XHR1NjQgcG11X251bV9jdHJzO1xuK1x0XHRcdHU2NCBoYXNoX2FsZ287XG4rXHRcdFx0dTY0IG51bV9hdXhfcGxhbmVzO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMFsweDQwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU4IHJwdls2NF07XG4rXHRcdFx0dTY0IGF0c19wbGFuZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzFbMHg0MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg4MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgcGFkZGluZzI7XG4rXHRcdFx0dTY0IHJ0dF9iYXNlO1xuK1x0XHRcdHM2NCBydHRfbGV2ZWxfc3RhcnQ7XG4rXHRcdFx0dTY0IHJ0dF9udW1fc3RhcnQ7XG4rXHRcdFx0dTY0IGZsYWdzMTtcbitcdFx0XHR1NjQgbWF4X251bV92ZGV2cztcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzNbMHg3MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHhmMDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBwYWRkaW5nNFsweDgwXTtcbitcdFx0XHR1NjQgYXV4X3J0dF9iYXNlWzNdO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xuK1xuKy8qXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxuKyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLlxuKyAqL1xuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXHRcdDhcbitcbisjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUKDApXG4rXG4rc3RydWN0IHJlY19wYXJhbXMge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0dTY0IGZsYWdzO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHR1NjQgbXBpZHI7XG4rXHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MjAwICovXG4rXHRcdHU2NCBwYztcbitcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgzMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XG4rXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcdEJJVCgxKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcdFx0QklUKDIpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXHRCSVQoNClcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0VcdEJJVCg1KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFx0XHRCSVQoNylcbitcbisjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4rXG4rc3RydWN0IHJlY19lbnRlciB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgyMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzFbMHg2MDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbitcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcdFx0XHQweDAyXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFx0XHQweDA1XG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcdDB4MDhcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuK1xuK3N0cnVjdCByZWNfZXhpdCB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU4IGV4aXRfcmVhc29uO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBlc3I7XG4rXHRcdFx0dTY0IGZhcjtcbitcdFx0XHR1NjQgaHBmYXI7XG4rXHRcdFx0dTY0IHJ0dF90cmVlO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBjbnRwX2N0bDtcbitcdFx0XHR1NjQgY250cF9jdmFsO1xuK1x0XHRcdHU2NCBjbnR2X2N0bDtcbitcdFx0XHR1NjQgY250dl9jdmFsO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDUwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCByaXBhc19iYXNlO1xuK1x0XHRcdHU2NCByaXBhc190b3A7XG4rXHRcdFx0dTggcmlwYXNfdmFsdWU7XG4rXHRcdFx0dTggcGFkZGluZzVbMHhmXTtcbitcdFx0XHR1NjQgczJhcF9iYXNlO1xuK1x0XHRcdHU2NCBzMmFwX3RvcDtcbitcdFx0XHR1NjQgdmRldl9pZF8xO1xuK1x0XHRcdHU2NCB2ZGV2X2lkXzI7XG4rXHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbitcdFx0XHR1NjQgZGV2X21lbV90b3A7XG4rXHRcdFx0dTY0IGRldl9tZW1fcGE7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NjAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTE2IGltbTtcbitcdFx0XHR1OCBwYWRkaW5nN1sweDZdO1xuK1x0XHRcdHU2NCBwbGFuZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzhbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg3MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbitcdFx0XHR1OCBwYWRkaW5nOVsweGZdO1xuK1x0XHRcdHU2NCB2c21tdTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzEwWzB4MTAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbitcbitzdHJ1Y3QgcmVjX3J1biB7XG4rXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuK1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuK1xuKy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4rXG4rLyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4rXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4rXG4rI2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDk6MDk6MjIuODY3NzY2OTJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0NDgyNjI2NzkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIHRoZSBpbml0aWFsIHByb21wdCBhc2tzIG1lIHRvIGV2YWx1YXRlIHRoaXMgcGF0Y2ggc2VyaWVzIGZvciBzeXprYWxsZXIgZnV6emluZyBwb3RlbnRpYWwgb24gYW1kNjQuIFN0cmFpZ2h0IGF3YXksIHRoZSBtZW50aW9uIG9mIGBhbWQ2NGAgc2V0cyBvZmYgYWxhcm0gYmVsbHMuIEkgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGhlcmUuXG5cblRoZSBmaXJzdCB0aGluZyBJIGRpZCB3YXMgcmUtZXhhbWluZSB0aGUgYFRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0YCBpbnN0cnVjdGlvbi5cblxuVGhlIHByb3ZpZGVkIHBhdGNoIHRvdWNoZXMgYSBmZXcga2V5IGFyZWFzLCB0aGUgZmlyc3QgYmVpbmcgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgKHNlbGVjdHMgYEFSQ0hfU1VQUE9SVFNfUk1NYCksIGFuZCBgZHJpdmVycy9maXJtd2FyZWAgd2hpY2ggaW5jbHVkZXMgYW4gYGFybV9ybW1gIHN1YmRpcmVjdG9yeSB3aXRoIEtjb25maWcgYW5kIE1ha2VmaWxlIGNvbmZpZ3VyYXRpb25zIGZvciBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmdW5jdGlvbmFsaXR5LiBJdCdzIG9idmlvdXNseSBhaW1pbmcgYXQgQVJNNjQgYXJjaGl0ZWN0dXJlLCBnaXZlbiB0aGUgZmlsZSBuYW1lcyBhbmQgdGhlIGluY2x1c2lvbiBvZiBgYXJjaC9hcm02NGAgY29uZmlndXJhdGlvbnMuIE15IGluaXRpYWwgaW50dWl0aW9uIGlzIHNjcmVhbWluZyAqd3JvbmcgYXJjaGl0ZWN0dXJlISouXG5cblRoZSByZWFsIHF1ZXN0aW9uLCB0aGUgY3JpdGljYWwgb25lLCBpcyB3aGV0aGVyIHRoaXMgYENPTkZJR19BUk1fUk1NX1JNSWAgZmVhdHVyZSwgdGhhdCdzIGRlZXBseSB0aWVkIHRvIEFSTTY0IFJNSSBzdXBwb3J0LCBpcyBldmVuIGJ1aWxkYWJsZSwgbGV0IGFsb25lIHJlYWNoYWJsZSwgb24gYW4gYW1kNjQgc3lzdGVtLiBUaGUgcGF0Y2ggc2VyaWVzIGhhcyBgS2NvbmZpZ2AgZmlsZXMgdGhhdCByZXZlYWwgYSBkZXBlbmRlbmN5IGNoYWluLiBgQVJNX1JNTV9STUlgIGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc2VsZWN0ZWQgKm9ubHkqIHdpdGhpbiB0aGUgYEFSTTY0YCBjb25maWd1cmF0aW9uIGluIGBhcmNoL2FybTY0L0tjb25maWdgLlxuXG5Ob3csIEknbSBjaGVja2luZywganVzdCB0byBiZSBzdXJlLCB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgb3IgYEFSTV9STU1fUk1JYCBpcyAqbmV2ZXIqIHNvbWVob3cgZGVmaW5lZCBvciBzZWxlY3RlZCBvbiBhbiB4ODYvYW1kNjQgY29uZmlndXJhdGlvbi4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgZ3JlcCB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSB0byBiZSAxMDAlIHBvc2l0aXZlLiBUaGlzIGlzIGltcG9ydGFudCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpcyBldmVuICpyZWxldmFudCogdG8gZnV6emluZyBhIHN5c3RlbSBvbiBhbiBhbWQ2NCBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MzM3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTM0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDk6MDk6MjcuMzUwMzk4MDgxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MTczODA1NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQVJDSF9TVVBQT1JUU19STU1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XFxuLS1cXG5hcmNoL2FybTY0L0tjb25maWctNDAtXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuYXJjaC9hcm02NC9LY29uZmlnOjQxOlxcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjI6Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cXHRib29sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFxcXCJcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzo3OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyOS4yNjc3ODcyMTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4MjAxNzU2ODUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIFBhdGNoIEFwcGxpY2FiaWxpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIGBybWkuY2AgZmlsZSwgaW5jbHVkZXMgYW55IEFSTTY0LXNwZWNpZmljIGhlYWRlcnMuIExvb2tzIGxpa2Ugd2UgaGF2ZTogYFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZWAsIGBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlYCwgdGhlIGBBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUYCBtYWNybywgdGhlIGByZWFkX3Nhbml0aXNlZF9mdHJfcmVnYCBmdW5jdGlvbiBjYWxsICh3aGljaCBkZWFscyB3aXRoIHRoZSBzeXN0ZW0gcmVnaXN0ZXIpLCBhbmQgZnVuY3Rpb25zL3N0cnVjdHVyZXMgbGlrZSBgY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkYCwgYGFybV9zbWNjY18xXzJfcmVnc2AsIGFuZCBgYXJtX3NtY2NjXzFfMl9pbnZva2VgLiBZZXAsIGRlZmluaXRlbHkgQVJNNjQtc3BlY2lmaWMgc3R1ZmYuXG5cbk5vdywgbGV0J3MgcmVmZXIgdG8gdGhlIGluc3RydWN0aW9ucy4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlbGV2YW50IGNvbmRpdGlvbiBoZXJlIGlzIFwiQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLFwiIGFuZCBvdXIgdGFyZ2V0IGlzIGNsZWFybHkgYW1kNjQuXG5cblRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAvIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTU0vUk1JKS4gSXQgdG91Y2hlcyBmaWxlcyBsaWtlIGBhcmNoL2FybTY0L0tjb25maWdgLCBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCwgdGhlIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vYCBkaXJlY3RvcnksIGFuZCByZWxhdGVkIGhlYWRlcnMuIEkga25vdyB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgb25seSBzZWxlY3RlZCBpZiBgY29uZmlnIEFSTTY0YCBpcyBzZXQuIEFsc28sIGBBUk1fUk1NX1JNSWAgaXMgZGVwZW5kZW50IG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuIENvbnNlcXVlbnRseSwgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgKm5ldmVyKiBlbmFibGVkIG9uIGFtZDY0ICh4ODZfNjQpLiBFdmVuIGlmIGl0ICpjb3VsZCogYmUgZW5hYmxlZCBzb21laG93LCB0aGUgcHJlc2VuY2Ugb2YgdGhvc2UgQVJNNjQtc3BlY2lmaWMgc3ltYm9scyBjb25maXJtcyB0aGUgY29kZSdzIHVucmVhY2hhYmlsaXR5IG9uIGFtZDY0LlxuXG5MZXQncyBkbyBhIHF1aWNrIHN3ZWVwIG9mIHRoZSBjaGFuZ2VkIGZpbGVzIHRvIHZlcmlmeSB0aGF0LiBJJ2xsIG1ha2Ugc3VyZSBlYWNoIGlzIGNvbXBsZXRlbHkgdW5yZWxhdGVkLlxuXG4xLiAgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgLSBBUk02NCBvbmx5LlxuMi4gIGBhcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNgIC0gQVJNNjQgb25seS5cbjMuICBgZHJpdmVycy9maXJtd2FyZS9LY29uZmlnYCAtIHNvdXJjZXMgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYC5cbjQuICBgZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZWAgLSBhZGRzIGBvYmoteSArPSBhcm1fcm1tL2AuXG41LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCAtIGRlZmluZXMgYEFSQ0hfU1VQUE9SVFNfUk1NYCAobm90IHNlbGVjdGVkIGJ5IHg4NikgYW5kIGBBUk1fUk1NX1JNSWAgKGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCkuIE9uIGFtZDY0LCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG4sIHNvIGBBUk1fUk1NX1JNSWAgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBlbmFibGVkLlxuNi4gIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVgIC0gY29tcGlsZXMgYHJtaS5vYCBvbmx5IGlmIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIHNldC5cbjcuICBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jYCAtIGNvbXBpbGVkIG9ubHkgaWYgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgc2V0LlxuOC4gIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCAtIGhlYWRlciBub3QgdXNlZCBvbiBhbWQ2NC5cbjkuICBgaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhgIC0gaGVhZGVyIG5vdCB1c2VkIG9uIGFtZDY0LlxuXG5Pa2F5LCBhbmQgSSdsbCBxdWlja2x5IGNoZWNrIGlmIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW1gIGV2ZW4gY29tcGlsZXMgb24gYW1kNjQuIFNpbmNlIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIG5vdCBzZXQsIHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlYCBnZW5lcmF0ZXMgbm8gb2JqZWN0cy4gSXQncyBhbiBlbXB0eSBidWlsZCBkaXJlY3Rvcnkgb24gYW1kNjQuXG5cblNvLCBhbGwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlbHkgZm9yIEFSTTY0LiBJdCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgXCJVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6ICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlwiXG5cblRoZXJlZm9yZTpcblxuKiAgIGBXb3J0aEZ1enppbmcgPSBmYWxzZWBcbiogICBgRW5hYmxlQ29uZmlncyA9IFtdYFxuKiAgIGBGb2N1c1N5bWJvbHMgPSBbXWBcbiogICBgUmVhc29uaW5nID0gQ29uY2lzZSBleHBsYW5hdGlvbjogVGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhpcyBwYXRjaCBhZGRzIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHN1cHBvcnQgZXhjbHVzaXZlIHRvIGFybTY0IGFyY2hpdGVjdHVyZSAoQ09ORklHX0FSTV9STU1fUk1JIGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgYnkgQVJNNjQpLiBUaHVzLCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuYFxuXG5DaGVja2luZzpcblRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0LlxuUGF0Y2g6IEFSTSBSTU0vUk1JIHN1cHBvcnQuXG5Dcml0ZXJpYSBjaGVjazpcbi0gV29ydGhGdXp6aW5nPWZhbHNlIHdoZW4gXCJDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXCJcbi0gRm9jdXNTeW1ib2xzOiBbXVxuLSBFbmFibGVDb25maWdzOiBbXVxuLSBSZWFzb25pbmc6XG5cbiIsIklucHV0VG9rZW5zIjoyOTU2NywiT3V0cHV0VG9rZW5zIjoxMzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjAyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDA5OjA5OjM3LjQ2OTU0NzIyNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOTozNy40Njk1NzM1NzRaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowx7knp[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-12 08:51:06 +0000 UTC FinishedAt: 2026-09-12 09:09:39 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjZjc5ZDA5NDQxNGE2ZTYzMjk2ZWQzM2EzM2Y2YjlkNzgzMmRhNGJjXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXG5pbmRleCBiNWE1MWIwZWY5NDQwLi5mZjk1NjVkM2ZmYTU5IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L0tjb25maWdcbkBAIC0zOCw2ICYjNDM7MzgsNyBAQCBjb25maWcgQVJNNjRcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUXG4gXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbiYjNDM7XHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbiBcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlRcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuQEAgLTI5Myw2ICYjNDM7MjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7XG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxuJiM0MztcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuaW5kZXggYjdjYzExZTRmYmZhNi4uNjI2NjBiZjUyMGE4ZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5AQCAtMzEwLDUgJiM0MzszMTAsNiBAQCBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCYjMzQ7XG4mIzQzO3NvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wmIzM0O1xuIFxuIGVuZG1lbnVcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuaW5kZXggYmU0NmYxZTFkYzc3Zi4uMTk2YTY1MGNjZjAyNSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbkBAIC0zOSwzICYjNDM7MzksNCBAQCBvYmoteVx0XHRcdFx0JiM0Mzs9IHNhbXN1bmcvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSBzbWNjYy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQmIzQzOz0geGlsaW54L1xuJiM0MztvYmoteVx0XHRcdFx0JiM0Mzs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5AQCAtMCwwICYjNDM7MSwyNiBAQFxuJiM0MztcbiYjNDM7Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXG4mIzQzO1x0Ym9vbFxuJiM0MztcbiYjNDM7Y29uZmlnIEFSTV9STU1fUk1JXG4mIzQzO1x0Ym9vbCBcJiMzNDtSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XCYjMzQ7XG4mIzQzO1x0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTVxuJiM0MztcdGRlZmF1bHQgeVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0XG4mIzQzO1x0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxuJiM0MztcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cbiYjNDM7XG4mIzQzO1x0ICBUaGUgUk1NIHJ1bnMgYXQgRUwyIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtXG4mIzQzO1x0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxuJiM0MztcdCAgbWFuYWdlIGFuZCBydW4gcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhlIFJNTSBjYW5cbiYjNDM7XHQgIGFsc28gYWN0IGFzIGEgVFNNLCBhcyBkZWZpbmVkIGJ5IHRoZSBQQ0llIFRESVNQIGFuZCBjYW4gbWFuYWdlIHRoZVxuJiM0MztcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXG4mIzQzO1xuJiM0MztcdCAgVGhpcyBvcHRpb24gYnVpbGRzIHRoZSBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGFcbiYjNDM7XHQgIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmUgaXQsIG1hbmFnZSBkZWxlZ2F0ZWQgbWVtb3J5IGFuZCBlbmFibGVcbiYjNDM7XHQgIFJlYWxtIGd1ZXN0cy5cbiYjNDM7XG4mIzQzO1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbiYjNDM7XHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSwyIEBAXG4mIzQzO1xuJiM0MztvYmotJChDT05GSUdfQVJNX1JNTV9STUkpXHQ9IHJtaS5vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNTgzZTFhY2E5YjE1YVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jXG5AQCAtMCwwICYjNDM7MSw5OTkgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xuJiM0MztcbiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXHQyXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdIF9fcm9fYWZ0ZXJfaW5pdDtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlXG4mIzQzOyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXG4mIzQzOyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbiYjNDM7ICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxuJiM0MzsgKlxuJiM0MzsgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxuJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbiYjNDM7ICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XG4mIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxuJiM0MztcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7XG4mIzQzO1x0aWYgKG91dF9jYXRlZ29yeSlcbiYjNDM7XHRcdCpvdXRfY2F0ZWdvcnkgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfc3RhdGUpXG4mIzQzO1x0XHQqb3V0X3N0YXRlID0gcmVncy5hMjtcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXG4mIzQzOyAqIEBzdGFydDogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcbiYjNDM7ICpcdFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcbiYjNDM7ICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW3N0YXJ0LCBvdXRfdG9wKVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncHRfaW5mbyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9ncHRfcGFyX3N0YXRlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9HUFRfSU5GTywgc3RhcnQsIGVuZCxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuJiM0MztcdGlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSlcbiYjNDM7XHRcdCpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBSTUlfU1VDQ0VTUztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXG4mIzQzOyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIGFyZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0ZFQVRVUkVTLCBpbmRleFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2YXJncyk7XG4mIzQzO1x0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dClcbiYjNDM7XHRcdCpvdXQgPSBhcmdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYXJncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU1cbiYjNDM7ICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcbiYjNDM7ICpcbiYjNDM7ICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3JtbV9jb25maWdfc2V0KHVuc2lnbmVkIGxvbmcgY2ZnX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTihpbmRleCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuJiM0MztcdFx0XHQgdW5zaWduZWQgbG9uZyBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsIFx1MDAyNm91dF90b3ApO1xuJiM0MztcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdFx0LyogQnVnZ3kgUk1NID8gTGV0IHRoZSBjYWxsZXIgbGVhayB0aGUgcGFnZXMgKi9cbiYjNDM7XHRcdFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcdTAwM2M9IHBoeXMpKVxuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbiYjNDM7XG4mIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuJiM0Mzt7XG4mIzQzO1x0bG9uZyByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyAmIzQzOyBzaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuJiM0MztcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4mIzQzO1x0XHRcdC8qIEJ1Z2d5IFJNTSA/ICovXG4mIzQzO1x0XHRcdGlmIChXQVJOX09OKG91dF90b3AgXHUwMDNjPSBwaHlzKSkge1xuJiM0MztcdFx0XHRcdHJtaV91bmRlbGVnYXRlX3JhbmdlKHRvcCAtIHNpemUsIHNpemUpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0cGh5cyA9IG91dF90b3A7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfcGh5cylcbiYjNDM7XHRcdCpvdXRfcGh5cyA9IHBoeXM7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvbnZlcnQgdGhlIFJtaUFkZHJCbG9ja1NpemUgdG8gYWN0dWFsIHNpemUuIFRoaXMgaXMgdXNlZCBpbiBSbWlEb25hdGVSZXFcbiYjNDM7ICogYW5kIFJtaUFkZHJSYW5nZURlc2MqLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyh1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5XG4mIzQzOyAqXHRcdCAgICBiZSBwYXJ0aWFsbHkgY29uc3VtZWQgYnkgUk1NLlxuJiM0MzsgKlxuJiM0MzsgKiBAZW50cnk6IFJNSV9BRERSX1JBTkdFIGRlc2NyaXB0b3JcbiYjNDM7ICogQGNvbnN1bWVkX3NpemU6IFBhZ2UgYWxpZ25lZCBzaXplIGNvbnN1bWVkIGJ5IHRoZSBSTU0gZnJvbSB0aGUgYWRkcmVzcyByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogSWYgdGhlIHN0YXRlIG9mIHRoZSBhZGRyZXNzIGlzIERFTEVHQVRFRCwgdW5kZWxlZ2F0ZSBpdCBiYWNrLCBiZWZvcmUgZnJlZWluZy5cbiYjNDM7ICogTGVha3MgdGhlIG1lbW9yeSBpZiB3ZSBjYW5ub3QgdW5kZWxlZ2F0ZSB0aGUgcmFuZ2UuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBmcmVlX2FkZHJfcmFuZ2UodW5zaWduZWQgbG9uZyBlbnRyeSwgdW5zaWduZWQgbG9uZyBjb25zdW1lZF9zaXplKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUoZW50cnkpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKSAqIGNvdW50O1xuJiM0MztcbiYjNDM7XHRXQVJOX09OKCFQQUdFX0FMSUdORUQocGh5cykgfHwgIVBBR0VfQUxJR05FRChjb25zdW1lZF9zaXplKSk7XG4mIzQzO1xuJiM0MztcdC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBmb3IgcGFydGlhbGx5IGNvbnN1bWVkIGVudHJ5ICovXG4mIzQzO1x0cGh5cyAmIzQzOz0gY29uc3VtZWRfc2l6ZTtcbiYjNDM7XHRzaXplIC09IGNvbnN1bWVkX3NpemU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4mIzM5O3RcbiYjNDM7XHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIFdBUk5fT04ocm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSkpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KHBoeXMpLCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xuJiM0MztcdFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxuJiM0MztcdCAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvclxuJiM0MztcdCAqL1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4mIzQzO1x0XHQvKiBVbmRlbGVnYXRlIGZhaWxlZDogbGVhayB0aGUgcGFnZSAqL1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBjb3VudClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbiYjNDM7XHRcdHJldHVybiAtRU9WRVJGTE9XO1xuJiM0MztcbiYjNDM7XHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT1NQQztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuJiM0MztcdFx0XHRcdCBnZnBfdCBnZnApXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJsb2NrX3NpemUgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0dm9pZCAqdmlydDtcbiYjNDM7XHRwaHlzX2FkZHJfdCBwaHlzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxuJiM0MztcdCAqIHBvd2VyIG9mIDJcbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVx1MDAzZWFkZHJfbGlzdFtpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0pLCAxLFxuJiM0MztcdFx0XHQgIDAsIG91dF9yZWdzKTtcbiYjNDM7XHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIChzaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKSkpXG4mIzQzO1x0XHRkb25hdGVkX2dyYW51bGVzID0gKHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuJiM0MztcbiYjNDM7XHRkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuJiM0MztcbiYjNDM7XHQvKiBBbGwgZ3JhbnVsZXMgY29uc3VtZWQgYnkgdGhlIFJNTSAqL1xuJiM0MztcdGlmIChkb25hdGVkX3NpemUgPT0gc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdC8qIE5vIGdyYW51bGVzIHdlcmUgY29uc3VtZWQgYnkgdGhlIFJNTSwgY2FjaGUgdGhlbSAqL1xuJiM0MztcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcbiYjNDM7XHRcdHNyby1cdTAwM2VhZGRyX2NvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogVGhlIGdyYW51bGVzIHdlcmUgcGFydGlhbGx5IGNvbnN1bWVkLCByZWNsYWltIHRoZSB1bnVzZWQgb25lcy4gKi9cbiYjNDM7XHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0sIGRvbmF0ZWRfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY29uc3VtZWRfYmxvY2tzO1xuJiM0MztcdGludCBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbiYjNDM7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4mIzQzO1xuJiM0MztcdFx0aWYgKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUoZW50cnkpID09IGJsb2NrX3NpemVfZmxkIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xuJiM0MztcdFx0XHRhZGRyX2xpc3Rfc3RhcnQtLTtcbiYjNDM7XHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXG4mIzQzO1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4mIzQzO1x0XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0aS0tO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGZvdW5kIFx1MDAzYyBjb3VudCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyX3JhbmdlO1xuJiM0MztcdFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KGJsb2NrX3NpemUsIGdmcCk7XG4mIzQzO1x0XHRwaHlzX2FkZHJfdCBwaHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmICghdmlydClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTtcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgY291bnQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0ZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIFJNTSBzaG91bGRuJiMzOTt0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuJiM0MztcdCAqIGp1c3QgaW4gY2FzZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX2Jsb2NrKSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBjb3VudCAqIGdyYW51bGVzX3Blcl9ibG9jaztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXG4mIzQzO1x0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gYmxvY2stc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XG4mIzQzO1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIGJsb2Nrcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF9ibG9ja3MgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX2Jsb2NrO1xuJiM0MztcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSBibG9jayBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxuJiM0MztcdFx0ICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3RcbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XG4mIzQzO1x0XHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGNvbnN1bWVkX2Jsb2Nrc107XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XG4mIzQzO1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHRmcmVlX2FkZHJfcmFuZ2UoZW50cnksIGRvbmF0ZWRfc2l6ZSk7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGhpcyBibG9jayBpcyBub3cgZnVsbHkgJiMzOTtjb25zdW1lZCYjMzk7IChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4mIzQzO1x0XHQgKiBmcmVlZClcbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Y29uc3VtZWRfYmxvY2tzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgYmxvY2tzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IGNvbnN1bWVkX2Jsb2NrczsgaSBcdTAwM2MgY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX2Jsb2Nrc10gPVxuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfYmxvY2tzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHJlZ3MsIGdmcCk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdHJlZ3MsIGdmcCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSkpXG4mIzQzO1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbiYjNDM7XG4mIzQzO1x0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcbiYjNDM7XHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSxcbiYjNDM7XHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZVxuJiM0MztcdCAgKiBpbnB1dCBwYXJhbWV0ZXJzIHdlcmUgaW52YWxpZC5cbiYjNDM7XHQgICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cdTAwM2VhMSBcdTAwM2UgY2FwYWNpdHkpKVxuJiM0MztcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdC8qIEhhbmRsZSB0aGUgd29yc2UgKi9cbiYjNDM7XHRpZiAoV0FSTl9PTihzcm8tXHUwMDNlYWRkcl9jb3VudCBcdTAwM2MgMCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGlmIChXQVJOX09OKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IFJNSV9NQVhfQUREUl9MSVNUO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc3JvLVx1MDAzZWFkZHJfY291bnQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0ZnJlZV9hZGRyX3JhbmdlKHNyby1cdTAwM2VhZGRyX2xpc3RbaV0sIDApO1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuJiM0MztcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKHJlZ3MpO1xuJiM0MztcbiYjNDM7XHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuJiM0MztcdFx0XHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWUuXG4mIzQzO1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuJiM0MztcdFx0XHQgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFjYW5fY2FuY2VsKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlXG4mIzQzO1x0XHRcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxuJiM0MztcdFx0XHQgKiBpbiBnb2luZyBpbiBsb29wcy5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuJiM0MztcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApID09IFJNSV9PUF9DQU5fQ0FOQ0VMO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0ZGVmYXVsdDpcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuJiM0MztcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4mIzQzO1x0XHRcdC8qIElmIHdlIGhhdmUgYWxyZWFkeSBjYW5jZWxsZWQsIGRvbiYjMzk7dCByZXRyeSB0aGlzICovXG4mIzQzO1x0XHRcdGlmIChjYW5jZWxsZWQpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4mIzQzO1x0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpO1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xuJiM0MztcdFx0U01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqL1xuJiM0MztcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlcyk7XG4mIzQzO1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1xuJiM0MztcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4mIzQzO1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4mIzQzO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuJiM0MztcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuJiM0MztcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4mIzQzO1x0XHQgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcXG5cJiMzNDssIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuJiM0MztcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTtcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xuJiM0MztcbiYjNDM7XHRzd2l0Y2ggKFBBR0VfU0laRSkge1xuJiM0MztcdGNhc2UgU1pfNEs6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjtcbiYjNDM7XHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl8xNks6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzE2S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFNaXzY0SzpcbiYjNDM7XHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbiYjNDM7XHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRCVUlMRF9CVUcoKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcdTAwMjYgZ3JhbnVsZV9mZWF0dXJlKSkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1JNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIFBBR0VfU0laRSBcdTAwM2VcdTAwM2UgMTApO1xuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWNvbmZpZykge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJNTSBjb25maWdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjb25maWctXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGb3Igbm93IHdlIHNldCB0aGUgdHJhY2tpbmdfcmVnaW9uX3NpemUgdG8gMCB3aGljaCBpcyB0aGUgb25seSBvcHRpb25cbiYjNDM7XHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxuJiM0MztcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuJiM0MztcdCAqIFBBR0VfU0laRVNcbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gY29uZmlnIHNldCBmYWlsZWQgKCVkKVxcblwmIzM0OywgcmV0KTtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuJiM0MztcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4mIzQzO1x0XHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcbiYjNDM7XHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4mIzQzO1x0XHRcdHByX2VycihcJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuJiM0MzsgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuJiM0MztcbiYjNDM7XHRsMGdwdF9zeiA9IDFVTCBcdTAwM2NcdTAwM2MgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4mIzQzO1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuJiM0MztcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xuJiM0MztcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRzdGFydCwgbmV4dCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3RhcnQgPSBuZXh0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQoc3RhcnQsIGVuZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuJiM0MztcdFx0aWYgKG1lbWJsb2NrX2lzX25vbWFwKHIpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHN0YXJ0ID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3Bmbik7XG4mIzQzO1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiAmIzQzOyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuJiM0MztcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuJiM0MztcdC5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllcixcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJiMzOTt0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuJiM0MztcdHJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogQWN0aXZhdGUgdGhlIFJNTSAqL1xuJiM0MztcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8pO1xuJiM0MztcdGlmICghc3JvKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0cHJfZXJyKFwmIzM0O1JNTSBhY3RpdmF0ZSBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9pbml0X21ldGFkYXRhKCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihcdTAwMjZybWlfbWVtb3J5X25iKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XG4mIzQzO1x0cHJfaW5mbyhcJiMzNDtSTUkgY29uZmlndXJlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7b3V0X2RlYWN0aXZhdGU6XG4mIzQzO1x0V0FSTl9PTihybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fREVBQ1RJVkFURSkpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxuJiM0MzsgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxuJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4mIzQzOyAqL1xuJiM0MztzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmQ3ZWY3ZTgyYjI0NlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxuQEAgLTAsMCAmIzQzOzEsNTQwIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOy8qXG4mIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1Zy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbiYjNDM7XG4mIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4mIzQzO1x0aW50IGFkZHJfY291bnQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcm1pX3NtY2NjX2ludm9rZTogSW52b2tlIHRoZSBSTUkgY2FsbCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGluIEByZWdzX291dFxuJiM0MzsgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXG4mIzQzOyAqIEByZWdzX291dDogT3VwdHB1dCByZXN1bHRzIGZyb20gdGhlIGNhbGwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyBhcmdzID0gKnJlZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4mIzQzO1xuJiM0MztcdHdoaWxlICgxKSB7XG4mIzQzO1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZhcmdzLCByZWdzKTtcbiYjNDM7XHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApO1xuJiM0MztcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNwdV9yZWxheCgpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleCk7XG4mIzQzO1xuJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcbiYjNDM7aW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVzZXR0aW5nIHRoZSBhZGRyX2NvdW50IGlzIHN1ZmZpY2llbnQgdG8gaWdub3JlIHRoZSBhZGRyX2xpc3QgY29udGVudHMuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcdFx0XHRcdFxcXG4mIzQzO1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XHRcdFx0XHRcXFxuJiM0MztcdF9fc3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1x0XHRcdFx0XHRcdFxcXG4mIzQzO1x0X19zcm8tXHUwMDNlcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKXsgX19WQV9BUkdTX18gfTtcdFxcXG4mIzQzO1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIG1hcHBpbmcgYXQgcHJvdGVjdGVkIElQQSwgY29weWluZyBjb250ZW50c1xuJiM0MzsgKlx0XHRcdCAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBkYXRhOiBQQSBvZiB0aGUgdGFyZ2V0IGdyYW51bGUgbWFwcGVkIGluIHRoZSBndWVzdFxuJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4mIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZSB3aXRoIGNvbnRlbnRzXG4mIzQzOyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcbiYjNDM7ICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuJiM0MztcdFx0XHRcdFx0IHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGZsYWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSByYW5nZSB3aXRoIHVua25vd24gY29udGVudHNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkgYXQgYSBwcm90ZWN0ZWRcbiYjNDM7ICpcdFx0XHQgIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbiYjNDM7ICogQGZsYWdzOiBGbGFnc1xuJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuJiM0MzsgKiBAc3RhdHVzOiBTdGF0dXMgb2YgdGhlIFBTQ0kgcmVxdWVzdFxuJiM0MzsgKlxuJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcHNjaV9jb21wbGV0ZSh1bnNpZ25lZCBsb25nIGNhbGxpbmdfcmVjLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKlxuJiM0MzsgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlLCBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGVkLCBhbGxvd2luZ1xuJiM0MzsgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbiYjNDM7XHRyZXR1cm4gcmVncy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHRcbiYjNDM7ICpcbiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fdGVybWluYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUsIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4mIzQzOyAqXG4mIzQzOyAqIERlc3Ryb3lzIGEgcmVhbG0sIGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgcmVhbG0gbXVzdCBiZSBkZXN0cm95ZWQgZmlyc3QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlY19jcmVhdGUoKSAtIENyZWF0ZSBhIFJFQ1xuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiBSRUMgcGFyYW1ldGVyc1xuJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBSRUMgdXNpbmcgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3QgcmVjX3BhcmFtcyBwb2ludGVkXG4mIzQzOyAqIHRvIGJ5IEBwYXJhbXMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHJlYyxcbiYjNDM7XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4mIzQzO1x0c3JvLVx1MDAzZXJlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xuJiM0MztcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbiYjNDM7XHR9O1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0cm1pX3Nyb19mcmVlKHNybyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JFQ19FTlRFUiwgcmVjLCBydW5fcHRyLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4mIzQzO1x0cmV0dXJuIHJlZ3MuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICAgbG9uZyBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAob3V0X3J0dClcbiYjNDM7XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbiYjNDM7XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXG4mIzQzOyAqXG4mIzQzOyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAmIzM5O2hvbW9nZW5lb3VzJiMzOTsgdGhlIFJUVCBjYW4gYmVcbiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbiYjNDM7XHRcdFx0XHRsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nICpvdXRfcnR0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfRk9MRCwgcmQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfcnR0KVxuJiM0MztcdFx0Km91dF9ydHQgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X21hcCgpIC0gTWFwIHVucHJvdGVjdGVkIGdyYW51bGVzIGludG8gYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiBtYXBwZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9zZXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgYW4gcnVubmluZyByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdFxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbiYjNDM7ICpcbiYjNDM7ICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQVxuJiM0MzsgKiByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEBmbGFnczogRmxhZ3NcbiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcdGlmIChvdXRfcmFuZ2UpXG4mIzQzO1x0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRpZiAob3V0X2NvdW50KVxuJiM0MztcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4mIzQzO1xuJiM0MztcdHJldHVybiBSTUlfU1VDQ0VTUztcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjIxNGQ2MjI4ZGZjMjJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICYjNDM7MSw0OTcgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuJiM0MzsgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZF9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbiYjNDM7XHRBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbiYjNDM7XHRcdFx0ICAgKGZ1bmMpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2YpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxODYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FXHRcdFNNQ19STUlfQ0FMTCgweDAxZjApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OXHQwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAyNiAweEZGRkYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0tcdFx0R0VOTUFTSyg3LCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1x0XHRHRU5NQVNLKDE1LCA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0R0VOTUFTSyg5LCA4KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXHRCSVQoMTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fTUVNUkVRX01BU0ssIHJldClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KVx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTXHRcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUkVBTE1cdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1x0XHRcdDNcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUXHRcdFx0NFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXHRcdDVcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfREVWSUNFXHRcdDZcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFx0XHQ3XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXHRcdDhcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfRFBUXHRcdFx0OVxuJiM0MzsjZGVmaW5lIFJNSV9CVVNZXHRcdFx0MTBcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR0xPQkFMXHRcdDExXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXHRcdDEyXG4mIzQzOyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcdFx0XHQxM1xuJiM0MzsjZGVmaW5lIFJNSV9CTE9DS0VEXHRcdFx0MTRcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUXHRcdFx0MTVcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVx0XHQxNlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfS0VFUF9HT0lOR1x0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEVcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX09QX0NBTl9DQU5DRUxcdFx0MVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0tcdFx0R0VOTUFTSygxOCwgMTcpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1x0XHRCSVQoMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXHRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0JMT0NLX1NJWkUocmVxKVx0RklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1VOREVMRUdBVEVEXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTkRJVElPTkFMXHRcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJR1x0XHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfTk9ORVx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfTElTVFx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcdEdFTk1BU0soNjMsIDYyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0R0VOTUFTSyg1MSwgUEFHRV9TSElGVClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKHIpXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSlcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKHIpXHRcdCgocikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURShyKVx0XHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgKHIpKVxuJiM0MztcbiYjNDM7ZW51bSBybWlfcmlwYXMge1xuJiM0MztcdFJNSV9FTVBUWSA9IDAsXG4mIzQzO1x0Uk1JX1JBTSA9IDEsXG4mIzQzO1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4mIzQzO1x0Uk1JX0RFViA9IDMsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9OT19NRUFTVVJFX0NPTlRFTlRcdDBcbiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJPQVNaXHRcdFx0R0VOTUFTSyg0MCwgMzMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURVx0QklUKDMyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTXHRcdEdFTk1BU0soMzEsIDI3KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VXHRcdFx0QklUKDI2KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRcdEdFTk1BU0soMjUsIDIwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQU1x0XHRcdEdFTk1BU0soMTksIDE0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXHRcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0XHRCSVQoOSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0XHRCSVQoOClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyU1pcdFx0XHRHRU5NQVNLKDcsIDApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdFx0R0VOTUFTSygxNiwgMTQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0XHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcdFx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdFx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0XHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQlx0XHRCSVQoMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soMTQsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTk9OX1RFRV9TVFJFQU1cdFx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WREVWX0tST1VcdFx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QREVWX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSyg3LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXHRcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVVx0XHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdFx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVx0XHRcdEJJVCgwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXHRCSVQoNilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcdEdFTk1BU0soMywgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcdFx0R0VOTUFTSyg2MywgMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0hcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FXHRcdFx0M1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcdFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4mIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFXHRcdDRcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcdDFcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUkVTRVJWRUQgICAgICAgICAgIDBVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVXG4mIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9DUkVBVEVEICAgICAgIDNVXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBOb3RlIG1hbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzbWFsbGVyIHRoYW4gdTY0IGJ1dCBhbGwgZmllbGRzIGhhdmUgdTY0XG4mIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3Qgcm1tX2NvbmZpZyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCB0cmFja2luZ19yZWdpb25fc2l6ZTtcbiYjNDM7XHRcdFx0dTY0IHJtaV9ncmFudWxlX3NpemU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggc2l6ZXJbU1pfNEtdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcdFx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBXHRcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTEZBX1BPTElDWVx0XHRHRU5NQVNLKDYsIDUpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVx0XHRHRU5NQVNLKDgsIDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XHRcdFx0MlxuJiM0MztcbiYjNDM7c3RydWN0IHJlYWxtX3BhcmFtcyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBmbGFnczA7XG4mIzQzO1x0XHRcdHU2NCBzMnN6O1xuJiM0MztcdFx0XHR1NjQgc3ZlX3ZsO1xuJiM0MztcdFx0XHR1NjQgbnVtX2JwcztcbiYjNDM7XHRcdFx0dTY0IG51bV93cHM7XG4mIzQzO1x0XHRcdHU2NCBwbXVfbnVtX2N0cnM7XG4mIzQzO1x0XHRcdHU2NCBoYXNoX2FsZ287XG4mIzQzO1x0XHRcdHU2NCBudW1fYXV4X3BsYW5lcztcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDQwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NDAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBycHZbNjRdO1xuJiM0MztcdFx0XHR1NjQgYXRzX3BsYW5lO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4NDAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg4MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBwYWRkaW5nMjtcbiYjNDM7XHRcdFx0dTY0IHJ0dF9iYXNlO1xuJiM0MztcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgcnR0X251bV9zdGFydDtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMTtcbiYjNDM7XHRcdFx0dTY0IG1heF9udW1fdmRldnM7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHg3MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweGYwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcGFkZGluZzRbMHg4MF07XG4mIzQzO1x0XHRcdHU2NCBhdXhfcnR0X2Jhc2VbM107XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVhbG1fcGFyYW1zKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgbnVtYmVyIG9mIEdQUnMgKHN0YXJ0aW5nIGZyb20gWDApIHRoYXQgYXJlXG4mIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBSRUNfQ1JFQVRFX05SX0dQUlNcdFx0OFxuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVCgwKVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19wYXJhbXMge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MTAwICovXG4mIzQzO1x0XHR1NjQgbXBpZHI7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgcGM7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfQ1JFQVRFX05SX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVx0XHRCSVQoMilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVx0QklUKDUpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4mIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX2VudGVyIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MDAwICovXG4mIzQzO1x0XHR1NjQgZmxhZ3M7XG4mIzQzO1x0XHR1OCBwYWRkaW5nMFsweDIwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MjAwICovXG4mIzQzO1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHg2MDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUVx0XHRcdDB4MDJcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXHRcdDB4MDVcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1x0MHgwOFxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuJiM0MztcbiYjNDM7c3RydWN0IHJlY19leGl0IHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MDAwICovXG4mIzQzO1x0XHR1OCBleGl0X3JlYXNvbjtcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgxMDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBlc3I7XG4mIzQzO1x0XHRcdHU2NCBmYXI7XG4mIzQzO1x0XHRcdHU2NCBocGZhcjtcbiYjNDM7XHRcdFx0dTY0IHJ0dF90cmVlO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MzAwICovXG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NDAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgY250cF9jdGw7XG4mIzQzO1x0XHRcdHU2NCBjbnRwX2N2YWw7XG4mIzQzO1x0XHRcdHU2NCBjbnR2X2N0bDtcbiYjNDM7XHRcdFx0dTY0IGNudHZfY3ZhbDtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NTAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1NjQgcmlwYXNfYmFzZTtcbiYjNDM7XHRcdFx0dTY0IHJpcGFzX3RvcDtcbiYjNDM7XHRcdFx0dTggcmlwYXNfdmFsdWU7XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc1WzB4Zl07XG4mIzQzO1x0XHRcdHU2NCBzMmFwX2Jhc2U7XG4mIzQzO1x0XHRcdHU2NCBzMmFwX3RvcDtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMTtcbiYjNDM7XHRcdFx0dTY0IHZkZXZfaWRfMjtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbiYjNDM7XHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9wYTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1MTYgaW1tO1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nN1sweDZdO1xuJiM0MztcdFx0XHR1NjQgcGxhbmU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzhbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDcwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc5WzB4Zl07XG4mIzQzO1x0XHRcdHU2NCB2c21tdTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nMTBbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfcnVuIHtcbiYjNDM7XHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuJiM0MztcdHN0cnVjdCByZWNfZXhpdCBleGl0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQXHRcdEdFTk1BU0soMjIsIDE5KVxuJiM0MztcbiYjNDM7LyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbiYjNDM7XG4mIzQzOy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xuJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVx0XHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjZjc5ZDA5NDQxNGE2ZTYzMjk2ZWQzM2EzM2Y2YjlkNzgzMmRhNGJjCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtMzgsNiAmIzQzOzM4LDcgQEAgY29uZmlnIEFSTTY0CiAJc2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFCiAJc2VsZWN0IEFSQ0hfSEFTX01FTV9FTkNSWVBUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTCiYjNDM7CXNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTQogCXNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFMKIAlzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0UKIAlzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKQEAgLTI5Myw2ICYjNDM7MjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSwKJiM0MzsJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9WSVNJQkxFLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0RJVF9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKaW5kZXggYjdjYzExZTRmYmZhNi4uNjI2NjBiZjUyMGE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtMzEwLDUgJiM0MzszMTAsNiBAQCBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWcmIzM0OwomIzQzO3NvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnJiMzNDsKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggYmU0NmYxZTFkYzc3Zi4uMTk2YTY1MGNjZjAyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCkBAIC0zOSwzICYjNDM7MzksNCBAQCBvYmoteQkJCQkmIzQzOz0gc2Ftc3VuZy8KIG9iai15CQkJCSYjNDM7PSBzbWNjYy8KIG9iai15CQkJCSYjNDM7PSB0ZWdyYS8KIG9iai15CQkJCSYjNDM7PSB4aWxpbngvCiYjNDM7b2JqLXkJCQkJJiM0Mzs9IGFybV9ybW0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZwpAQCAtMCwwICYjNDM7MSwyNiBAQAomIzQzOwomIzQzO2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTQomIzQzOwlib29sCiYjNDM7CiYjNDM7Y29uZmlnIEFSTV9STU1fUk1JCiYjNDM7CWJvb2wgJiMzNDtSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0JiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTQomIzQzOwlkZWZhdWx0IHkKJiM0MzsJaGVscAomIzQzOwkgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0CiYjNDM7CSAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGUKJiM0MzsJICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLgomIzQzOwomIzQzOwkgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG0KJiM0MzsJICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLAomIzQzOwkgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuCiYjNDM7CSAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlCiYjNDM7CSAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuCiYjNDM7CiYjNDM7CSAgVGhpcyBvcHRpb24gYnVpbGRzIHRoZSBob3N0LXNpZGUgUk1JIHN1cHBvcnQgdXNlZCBieSBLVk0gdG8gZGV0ZWN0IGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlCiYjNDM7CSAgUmVhbG0gZ3Vlc3RzLgomIzQzOwomIzQzOwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOgomIzQzOwkgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYQomIzQzOwkgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjY1MTcxOTg4ZmRjYWUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUKQEAgLTAsMCAmIzQzOzEsMiBAQAomIzQzOwomIzQzO29iai0kKENPTkZJR19BUk1fUk1NX1JNSSkJPSBybWkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjU4M2UxYWNhOWIxNWEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMKQEAgLTAsMCAmIzQzOzEsOTk5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NwdWZlYXR1cmUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtYmxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbWVtb3J5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1ybWktY21kcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9tZW1vcnkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YXNtL3BndGFibGUtaHdkZWYuaCZndDsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzOwomIzQzOy8qIEN1cnJlbnRseSBvbmx5IHRoZSBmaXJzdCAyIHJlZ2lzdGVycyBhcmUgdXNlZCBieSBMaW51eCAqLwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UCTIKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXSBfX3JvX2FmdGVyX2luaXQ7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZQomIzQzOyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZQomIzQzOyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkCiYjNDM7ICoKJiM0MzsgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2UKJiM0MzsgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkCiYjNDM7ICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzCiYjNDM7ICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlCiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWYKJiM0MzsgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb24KJiM0MzsgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvbgomIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeQomIzQzOyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZQomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb24KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nIGVuZCwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VULCBzdGFydCwgZW5kLAomIzQzOwl9OwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJcmV0dXJuIHJlZ3MuYTA7CiYjNDM7CiYjNDM7CWlmIChvdXRfY2F0ZWdvcnkpCiYjNDM7CQkqb3V0X2NhdGVnb3J5ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF9zdGF0ZSkKJiM0MzsJCSpvdXRfc3RhdGUgPSByZWdzLmEyOwomIzQzOwlpZiAob3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIFJNSV9TVUNDRVNTOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi4KJiM0MzsgKiBAc3RhcnQ6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbgomIzQzOyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaAomIzQzOyAqCQl0aGUgR1BUIEBvdXRfZ3B0X3Bhcl9zdGF0ZSBpcyB2YWxpZAomIzQzOyAqIEBvdXRfZ3B0X3Bhcl9zdGF0ZTogU3RhdGUgb2YgdGhlIEdQVCBjb3ZlcmVkIGJ5IFtzdGFydCwgb3V0X3RvcCkKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQl1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1BUX0lORk8sIHN0YXJ0LCBlbmQsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzKTsKJiM0MzsJaWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQlyZXR1cm4gcmVncy5hMDsKJiM0MzsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CWlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSkKJiM0MzsJCSpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiBSTUlfU1VDQ0VTUzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXIKJiM0MzsgKiBAaW5kZXg6IEZlYXR1cmUgcmVnaXN0ZXIgaW5kZXgKJiM0MzsgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9IHsKJiM0MzsJCVNNQ19STUlfRkVBVFVSRVMsIGluZGV4CiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDthcmdzKTsKJiM0MzsJaWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXQpCiYjNDM7CQkqb3V0ID0gYXJncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIGFyZ3MuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU0KJiM0MzsgKiBAY2ZnX3B0cjogUEEgb2YgYSBzdHJ1Y3Qgcm1tX2NvbmZpZwomIzQzOyAqCiYjNDM7ICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleCkKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OKGluZGV4ICZndDs9IFJNSV9GRUFUX1JFR19DT1VOVCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7CiYjNDM7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJCS8qIEJ1Z2d5IFJNTSA/IExldCB0aGUgY2FsbGVyIGxlYWsgdGhlIHBhZ2VzICovCiYjNDM7CQkJaWYgKFdBUk5fT04ob3V0X3RvcCAmbHQ7PSBwaHlzKSkKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywKJiM0MzsJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKQomIzQzO3sKJiM0MzsJbG9uZyByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBvdXRfdG9wOwomIzQzOwomIzQzOwl3aGlsZSAocGh5cyAmbHQ7IHRvcCkgewomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJCS8qIEJ1Z2d5IFJNTSA/ICovCiYjNDM7CQkJaWYgKFdBUk5fT04ob3V0X3RvcCAmbHQ7PSBwaHlzKSkgewomIzQzOwkJCQlybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQkJcGh5cyA9IG91dF90b3A7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChvdXRfcGh5cykKJiM0MzsJCSpvdXRfcGh5cyA9IHBoeXM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBSbWlBZGRyQmxvY2tTaXplIHRvIGFjdHVhbCBzaXplLiBUaGlzIGlzIHVzZWQgaW4gUm1pRG9uYXRlUmVxCiYjNDM7ICogYW5kIFJtaUFkZHJSYW5nZURlc2MqLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXModW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gYmxvY2tfc2l6ZV9mbGQpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5CiYjNDM7ICoJCSAgICBiZSBwYXJ0aWFsbHkgY29uc3VtZWQgYnkgUk1NLgomIzQzOyAqCiYjNDM7ICogQGVudHJ5OiBSTUlfQUREUl9SQU5HRSBkZXNjcmlwdG9yCiYjNDM7ICogQGNvbnN1bWVkX3NpemU6IFBhZ2UgYWxpZ25lZCBzaXplIGNvbnN1bWVkIGJ5IHRoZSBSTU0gZnJvbSB0aGUgYWRkcmVzcyByYW5nZS4KJiM0MzsgKgomIzQzOyAqIElmIHRoZSBzdGF0ZSBvZiB0aGUgYWRkcmVzcyBpcyBERUxFR0FURUQsIHVuZGVsZWdhdGUgaXQgYmFjaywgYmVmb3JlIGZyZWVpbmcuCiYjNDM7ICogTGVha3MgdGhlIG1lbW9yeSBpZiB3ZSBjYW5ub3QgdW5kZWxlZ2F0ZSB0aGUgcmFuZ2UuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZnJlZV9hZGRyX3JhbmdlKHVuc2lnbmVkIGxvbmcgZW50cnksIHVuc2lnbmVkIGxvbmcgY29uc3VtZWRfc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpICogY291bnQ7CiYjNDM7CiYjNDM7CVdBUk5fT04oIVBBR0VfQUxJR05FRChwaHlzKSB8fCAhUEFHRV9BTElHTkVEKGNvbnN1bWVkX3NpemUpKTsKJiM0MzsKJiM0MzsJLyogQWRqdXN0IHRoZSBhZGRyZXNzIGFuZCBzaXplIGZvciBwYXJ0aWFsbHkgY29uc3VtZWQgZW50cnkgKi8KJiM0MzsJcGh5cyAmIzQzOz0gY29uc3VtZWRfc2l6ZTsKJiM0MzsJc2l6ZSAtPSBjb25zdW1lZF9zaXplOwomIzQzOwkvKgomIzQzOwkgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4mIzM5O3QKJiM0MzsJICogY2hhbmdlIHRoZW0gYmFjaywgbGVhayB0aGUgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQgJmFtcDsmYW1wOwomIzQzOwkgICAgV0FSTl9PTihybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplKSkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KHBoeXMpLCBzaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwkqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwkqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGUKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCSAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJKm91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHsKJiM0MzsJCVNNQ19STUlfT1BfTUVNX0RPTkFURSwgc3JvX2hhbmRsZSwgbGlzdF9hZGRyLCBsaXN0X2NvdW50LCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZQomIzQzOwkgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKJiM0MzsJICovCiYjNDM7CXJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfYWRkciwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CSpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXMpKSkgewomIzQzOwkJLyogVW5kZWxlZ2F0ZSBmYWlsZWQ6IGxlYWsgdGhlIHBhZ2UgKi8KJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gYmxvY2tfc2l6ZSAqIGNvdW50OwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlczsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemU7CiYjNDM7CWludCByZXQ7CiYjNDM7CXZvaWQgKnZpcnQ7CiYjNDM7CXBoeXNfYWRkcl90IHBoeXM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYQomIzQzOwkgKiBwb3dlciBvZiAyCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlICZhbXA7JmFtcDsKJiM0MzsJCSAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkgewomIzQzOwkJCXNyby0mZ3Q7YWRkcl9jb3VudC0tOwomIzQzOwkJCXN3YXAoc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSwKJiM0MzsJCQkgICAgIHNyby0mZ3Q7YWRkcl9saXN0W2ldKTsKJiM0MzsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7CiYjNDM7CWlmICghdmlydCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwlwaHlzID0gdmlydF90b19waHlzKHZpcnQpOwomIzQzOwomIzQzOwlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCXBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzOwomIzQzOwomIzQzOwkJaWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplLCAmYW1wO2RlbGVnYXRlZF9waHlzKSkgewomIzQzOwkJCWlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSkKJiM0MzsJCQkJZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBzaXplKTsKJiM0MzsJCQlyZXR1cm4gLUVOWElPOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWFkZHJfcmFuZ2UgPSBwaHlzICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSzsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGNvdW50KTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdID0gYWRkcl9yYW5nZTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwgMSwKJiM0MzsJCQkgIDAsIG91dF9yZWdzKTsKJiM0MzsJZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT04oZG9uYXRlZF9ncmFudWxlcyAmZ3Q7IChzaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQpKSkKJiM0MzsJCWRvbmF0ZWRfZ3JhbnVsZXMgPSAoc2l6ZSAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKJiM0MzsKJiM0MzsJZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkvKiBBbGwgZ3JhbnVsZXMgY29uc3VtZWQgYnkgdGhlIFJNTSAqLwomIzQzOwlpZiAoZG9uYXRlZF9zaXplID09IHNpemUpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJLyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovCiYjNDM7CWlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHsKJiM0MzsJCXNyby0mZ3Q7YWRkcl9jb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBUaGUgZ3JhbnVsZXMgd2VyZSBwYXJ0aWFsbHkgY29uc3VtZWQsIHJlY2xhaW0gdGhlIHVudXNlZCBvbmVzLiAqLwomIzQzOwlmcmVlX2FkZHJfcmFuZ2Uoc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgICAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpOwomIzQzOwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUgPSBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlczsKJiM0MzsJdW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY29uc3VtZWRfYmxvY2tzOwomIzQzOwlpbnQgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGFkZHJfbGlzdF9zdGFydCAmYW1wOyZhbXA7IGZvdW5kICZsdDsgY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgJmFtcDsmYW1wOwomIzQzOwkJICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUpIHsKJiM0MzsJCQlhZGRyX2xpc3Rfc3RhcnQtLTsKJiM0MzsJCQlzd2FwKHNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sCiYjNDM7CQkJICAgICBzcm8tJmd0O2FkZHJfbGlzdFtpXSk7CiYjNDM7CQkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwkJCWktLTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd2hpbGUgKGZvdW5kICZsdDsgY291bnQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJCXZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdChibG9ja19zaXplLCBnZnApOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJCWlmICghdmlydCkKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsCiYjNDM7CQkJCQkgICAgICAgJmFtcDtkZWxlZ2F0ZWRfcGh5cykpIHsKJiM0MzsJCQkJaWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKQomIzQzOwkJCQkJZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTsKJiM0MzsJCQkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlhZGRyX3JhbmdlID0gcGh5cyAmYW1wOyBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTsKJiM0MzsJCUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIDEpOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwkJc3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50JiM0MzsmIzQzO10gPSBhZGRyX3JhbmdlOwomIzQzOwkJZm91bmQmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdKSwKJiM0MzsJCQkgIGNvdW50LCAwLCBvdXRfcmVncyk7CiYjNDM7CiYjNDM7CWRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXAKJiM0MzsJICoganVzdCBpbiBjYXNlLgomIzQzOwkgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzICZndDsgZm91bmQgKiBncmFudWxlc19wZXJfYmxvY2spKQomIzQzOwkJZG9uYXRlZF9ncmFudWxlcyA9IGNvdW50ICogZ3JhbnVsZXNfcGVyX2Jsb2NrOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlCiYjNDM7CSAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIGJsb2NrLXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldAomIzQzOwkgKiB0aGUgbnVtYmVyIG9mIChjb21wbGV0ZSkgY29uc3VtZWQgYmxvY2tzLgomIzQzOwkgKi8KJiM0MzsJY29uc3VtZWRfYmxvY2tzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl9ibG9jazsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfYmxvY2spIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBBIGJsb2NrIGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5CiYjNDM7CQkgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdAomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0KJiM0MzsJCQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfYmxvY2tzXTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0KJiM0MzsJCQkoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJCWZyZWVfYWRkcl9yYW5nZShlbnRyeSwgZG9uYXRlZF9zaXplKTsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGlzIGJsb2NrIGlzIG5vdyBmdWxseSAmIzM5O2NvbnN1bWVkJiMzOTsgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3IKJiM0MzsJCSAqIGZyZWVkKQomIzQzOwkJICovCiYjNDM7CQljb25zdW1lZF9ibG9ja3MmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEtlZXAganVzdCB0aGUgYmxvY2tzIHRoZSBSTU0gZGlkbiYjMzk7dCB1c2UgaW4gYWRkcl9saXN0ICovCiYjNDM7CWZvciAoaW50IGkgPSBjb25zdW1lZF9ibG9ja3M7IGkgJmx0OyBjb3VudDsgaSYjNDM7JiM0MzspCiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaSAtIGNvbnN1bWVkX2Jsb2Nrc10gPQomIzQzOwkJCXNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50IC09IGNvbnN1bWVkX2Jsb2NrczsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLAomIzQzOwkJCSAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncywKJiM0MzsJCQkgIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkgICAgIHJlZ3MsIGdmcCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLAomIzQzOwkJCQkJCXJlZ3MsIGdmcCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywKJiM0MzsJCQkgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OwomIzQzOwomIzQzOwlpZiAocm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKSkKJiM0MzsJCXJtaV9zcm9fZnJlZShzcm8pOwomIzQzOwomIzQzOwljYXBhY2l0eSA9IFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwomIzQzOwlybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSwKJiM0MzsJCQkgICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwKJiM0MzsJCQkgICBjYXBhY2l0eSwgb3V0X3JlZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZQomIzQzOwkgICogaW5wdXQgcGFyYW1ldGVycyB3ZXJlIGludmFsaWQuCiYjNDM7CSAgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKG91dF9yZWdzLSZndDthMSAmZ3Q7IGNhcGFjaXR5KSkKJiM0MzsJCW91dF9yZWdzLSZndDthMSA9IGNhcGFjaXR5OwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLSZndDthMTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwkvKiBIYW5kbGUgdGhlIHdvcnNlICovCiYjNDM7CWlmIChXQVJOX09OKHNyby0mZ3Q7YWRkcl9jb3VudCAmbHQ7IDApKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAoV0FSTl9PTihzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlzcm8tJmd0O2FkZHJfY291bnQgPSBSTUlfTUFYX0FERFJfTElTVDsKJiM0MzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJZnJlZV9hZGRyX3JhbmdlKHNyby0mZ3Q7YWRkcl9saXN0W2ldLCAwKTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ID0gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MgPSAmYW1wO3Nyby0mZ3Q7cmVnczsKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlOwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKHJlZ3MpOwomIzQzOwomIzQzOwlzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CXdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgPT0gUk1JX0lOQ09NUExFVEUpIHsKJiM0MzsJCWJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLSZndDthMCkgPT0gUk1JX09QX0NBTl9DQU5DRUw7CiYjNDM7CQlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtJmd0O2EyLCByZWdzLAomIzQzOwkJCQkJICAgICBnZnApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOgomIzQzOwkJCXJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQlyZXQgPSBXQVJOX09OX09OQ0UoMSk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYQomIzQzOwkJCSAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbiYjMzk7dCBiZSBhbiBpc3N1ZS4KJiM0MzsJCQkgKiBIb3dldmVyLCBpZiB3ZSBlbmNvdW50ZXIgYSByYW5kb20gZmFpbHVyZSAoZS5nLiwKJiM0MzsJCQkgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpCiYjNDM7CQkJCXJldHVybiByZXQ7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlCiYjNDM7CQkJICogdG8gYW4gZXJyb3IgaW4gTUVNUkVRLCB0aGVuIHRoZXJlIGlzIG5vIHBvaW50CiYjNDM7CQkJICogaW4gZ29pbmcgaW4gbG9vcHMuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShjYW5jZWxsZWQpKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCQlybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWNhbmNlbGxlZCA9IHRydWU7CiYjNDM7CiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgIT0gUk1JX0lOQ09NUExFVEUpKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjYW5jZWxsZWQpCiYjNDM7CQlyZXR1cm4gLUVDQU5DRUxFRDsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlZ3MtJmd0O2EwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7CiYjNDM7CiYjNDM7LyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi8KJiM0Mztsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKQomIzQzO3sKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UocmVncyk7CiYjNDM7CiYjNDM7CXNyb19oYW5kbGUgPSByZWdzLSZndDthMTsKJiM0MzsJd2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKSA9PSBSTUlfSU5DT01QTEVURSkgewomIzQzOwkJYm9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtJmd0O2EwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCVdBUk5fT05fT05DRSgxKTsKJiM0MzsJCQlpZiAoIWNhbl9jYW5jZWwpCiYjNDM7CQkJCXJldHVybiByZWdzLSZndDthMDsKJiM0MzsJCQkvKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBkb24mIzM5O3QgcmV0cnkgdGhpcyAqLwomIzQzOwkJCWlmIChjYW5jZWxsZWQpCiYjNDM7CQkJCXJldHVybiAtRUNBTkNFTEVEOwomIzQzOwkJCXJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7CiYjNDM7CQkJY2FuY2VsbGVkID0gdHJ1ZTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOwomIzQzOwl1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sCiYjNDM7CQkJCQkJICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwl1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZXMgPSB7CiYjNDM7CQlTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJLyogSWYgUk1FIGlzbiYjMzk7dCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbiYjMzk7dCBiZSAqLwomIzQzOwlpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3Jlcyk7CiYjNDM7CWlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwl2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpOwomIzQzOwl2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwICE9IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQl1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjsKJiM0MzsKJiM0MzsJCWhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTsKJiM0MzsJCWhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTsKJiM0MzsKJiM0MzsJCXByX2VycigmIzM0O1Vuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcbiYjMzQ7LAomIzQzOwkJICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsCiYjNDM7CQkgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsCiYjNDM7CQkgICAgICAgUk1JX0FCSV9NQUpPUl9WRVJTSU9OLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgQUJJIHZlcnNpb24gJWQuJWRcbiYjMzQ7LCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZCkKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFNpbmNlIHdlJiMzOTt2ZSBuZWdvdGlhdGVkIGEgY29tcGF0aWJsZSB2ZXJzaW9uIHRoZXNlIGZlYXR1cmUgcmVnaXN0ZXJzCiYjNDM7CSAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlCiYjNDM7CSAqLwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IFJNSV9GRUFUX1JFR19DT1VOVDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCAmYW1wO3JtaV9mZWF0X3JlZ19jYWNoZVtpXSkpKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9mZWF0dXJlOwomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTsKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CXN0cnVjdCBybW1fY29uZmlnICpjb25maWc7CiYjNDM7CiYjNDM7CXN3aXRjaCAoUEFHRV9TSVpFKSB7CiYjNDM7CWNhc2UgU1pfNEs6CiYjNDM7CQlncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfMTZLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCOwomIzQzOwkJZ3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgU1pfNjRLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV82NEtCOwomIzQzOwkJZ3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCOwomIzQzOwkJYnJlYWs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlCVUlMRF9CVUcoKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIShybWlfZmVhdF9yZWcoMSkgJmFtcDsgZ3JhbnVsZV9mZWF0dXJlKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGRvZXMgbm90IHN1cHBvcnQgJWx1S0IgZ3JhbnVsZXNcbiYjMzQ7LAomIzQzOwkJICAgICAgIFBBR0VfU0laRSAmZ3Q7Jmd0OyAxMCk7CiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFjb25maWcpIHsKJiM0MzsJCXByX2VycigmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJNTSBjb25maWdcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uCiYjNDM7CSAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuCiYjNDM7CSAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlcgomIzQzOwkgKiBQQUdFX1NJWkVTCiYjNDM7CSAqLwomIzQzOwljb25maWctJmd0O3RyYWNraW5nX3JlZ2lvbl9zaXplID0gMDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcbiYjMzQ7LCByZXQpOwomIzQzOwkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS4KJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJdW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDsKJiM0MzsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCAmYW1wO2NhdGVnb3J5LCAmYW1wO3N0YXRlLCAmYW1wO25leHQpOwomIzQzOwkJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCWlmIChzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fAomIzQzOwkJICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7CiYjNDM7CQkJLyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovCiYjNDM7CQkJcHJfZXJyKCYjMzQ7R3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbiYjMzk7dCBmaW5lL2NvbnZlbnRpb25hbDogJWxseC0lbHhcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBzdGFydCwgbmV4dCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CQl9CiYjNDM7CQlzdGFydCA9IG5leHQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdAomIzQzOyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGwwZ3B0X3N6OwomIzQzOwl1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTsKJiM0MzsKJiM0MzsJbDBncHRfc3ogPSAxVUwgJmx0OyZsdDsgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osCiYjNDM7CQkJCQkgIHJtaV9mZWF0X3JlZygxKSkpOwomIzQzOwlzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTsKJiM0MzsJZW5kID0gQUxJR04oZW5kLCBsMGdwdF9zeik7CiYjNDM7CiYjNDM7CXdoaWxlIChzdGFydCAmbHQ7IGVuZCkgewomIzQzOwkJbG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgJmFtcDtuZXh0LCAmYW1wO3Bhcl9zdGF0ZSk7CiYjNDM7CiYjNDM7CQlpZiAocmV0ICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJaWYgKHBhcl9zdGF0ZSAhPSBSTUlfR1BUX1BBUl9QTEFUKSB7CiYjNDM7CQkJcHJfZXJyKCYjMzQ7R1BUIGZvciB0aGUgcmVnaW9uIGlzIG5vdCBtYW5hZ2VkIGJ5IGZpcm13YXJlICVsbHgtJWx4XG4mIzM0OywKJiM0MzsJCQkJc3RhcnQsIG5leHQpOwomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwkJfQomIzQzOwkJc3RhcnQgPSBuZXh0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcoc3RhcnQsIGVuZCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKQomIzQzO3sKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7CiYjNDM7CQlpbnQgcmV0OwomIzQzOwomIzQzOwkJLyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovCiYjNDM7CQlpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsJCWVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJcmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTsKJiM0MzsJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJaWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKQomIzQzOwkJcmV0dXJuIE5PVElGWV9ET05FOwomIzQzOwomIzQzOwlzdGFydCA9IFBGTl9QSFlTKGFyZy0mZ3Q7c3RhcnRfcGZuKTsKJiM0MzsJZW5kID0gUEZOX1BIWVMoYXJnLSZndDtzdGFydF9wZm4gJiM0MzsgYXJnLSZndDtucl9wYWdlcyk7CiYjNDM7CXJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0gewomIzQzOwkubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsCiYjNDM7fTsKJiM0MzsKJiM0Mztib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBhcm02NF9ybWlfaXNfYXZhaWxhYmxlOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChpc19ybWlfYXZhaWxhYmxlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKJiM0MzsKJiM0MzsJLyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbiYjMzk7dCBhZ3JlZSBvbiBhIHZlcnNpb24gKi8KJiM0MzsJcmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfY29uZmlndXJlKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkvKiBBY3RpdmF0ZSB0aGUgUk1NICovCiYjNDM7CXNybyA9IGttYWxsb2Nfb2JqKCpzcm8pOwomIzQzOwlpZiAoIXNybykKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSByZXQgJmx0OyAwID8gcmV0IDogLUVOWElPOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKCZhbXA7cm1pX21lbW9yeV9uYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dF9kZWFjdGl2YXRlOwomIzQzOwomIzQzOwlhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTsKJiM0MzsJcHJfaW5mbygmIzM0O1JNSSBjb25maWd1cmVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO291dF9kZWFjdGl2YXRlOgomIzQzOwlXQVJOX09OKHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNCiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmUKJiM0MzsgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suCiYjNDM7ICovCiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmZkN2VmN2U4MmIyNDYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oCkBAIC0wLDAgJiM0MzsxLDU0MCBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfCiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9STUlfQ01EU19IXwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcm0tc21jY2Mtcm1pLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJvY2Vzc29yLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90eXBlcy5oJmd0OwomIzQzOwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1QJMjU2CiYjNDM7CiYjNDM7c3RydWN0IHJtaV9zcm9fc3RhdGUgewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7CiYjNDM7CWludCBhZGRyX2NvdW50OwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07CiYjNDM7fTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIHJtaV9zbWNjY19pbnZva2U6IEludm9rZSB0aGUgUk1JIGNhbGwgYW5kIHJldHVybiB0aGUgcmVzdWx0cyBpbiBAcmVnc19vdXQKJiM0MzsgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uCiYjNDM7ICogQHJlZ3Nfb3V0OiBPdXB0cHV0IHJlc3VsdHMgZnJvbSB0aGUgY2FsbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyBhcmdzID0gKnJlZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdHVzOwomIzQzOwomIzQzOwl3aGlsZSAoMSkgewomIzQzOwkJYXJtX3NtY2NjXzFfMl9pbnZva2UoJmFtcDthcmdzLCByZWdzKTsKJiM0MzsJCXN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtJmd0O2EwKTsKJiM0MzsJCWlmIChzdGF0dXMgIT0gUk1JX0JVU1kgJmFtcDsmYW1wOyBzdGF0dXMgIT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljcHVfcmVsYXgoKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGluZGV4KTsKJiM0MzsKJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCSAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpOwomIzQzO2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpOwomIzQzO2ludCBybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzX2FkZHJfdCBwaHlzKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpOwomIzQzOwomIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTsKJiM0Mztsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlc2V0dGluZyB0aGUgYWRkcl9jb3VudCBpcyBzdWZmaWNpZW50IHRvIGlnbm9yZSB0aGUgYWRkcl9saXN0IGNvbnRlbnRzLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoewkJCQlcCiYjNDM7CXN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pOwkJCQlcCiYjNDM7CV9fc3JvLSZndDthZGRyX2NvdW50ID0gMDsJCQkJCQlcCiYjNDM7CV9fc3JvLSZndDtyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpeyBfX1ZBX0FSR1NfXyB9OwlcCiYjNDM7CWxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTsJCVwKJiM0MzsJcm1pX3Nyb19mcmVlKF9fc3JvKTsJCQkJCQlcCiYjNDM7CV9fcmV0OwkJCQkJCQkJXAomIzQzO30pCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHMKJiM0MzsgKgkJCSAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3QKJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0CiYjNDM7ICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlIHdpdGggY29udGVudHMKJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZwomIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYywKJiM0MzsJCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFncwomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHJhbmdlIHdpdGggdW5rbm93biBjb250ZW50cwomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5IGF0IGEgcHJvdGVjdGVkCiYjNDM7ICoJCQkgIElQQSByYW5nZQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWQKJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZQomIzQzOyAqIEBvdXRfY291bnQ6IE51bWJlciBvZiBlbnRyaWVzIGluIG91dHB1dCBhZGRyZXNzIGxpc3QKJiM0MzsgKgomIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV91bm1hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkcgomIzQzOwl9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJCWlmIChvdXRfcmFuZ2UpCiYjNDM7CQkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CQlpZiAob3V0X2NvdW50KQomIzQzOwkJCSpvdXRfY291bnQgPSByZWdzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZAomIzQzOyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDCiYjNDM7ICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3QKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYywKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKgomIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUsIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZWQsIGFsbG93aW5nCiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzKTsKJiM0MzsJcmV0dXJuIHJlZ3MuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0CiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dAomIzQzOyAqCiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dAomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWQKJiM0MzsgKiB0byBieSBAcGFyYW1zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyByZWMsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyBwYXJhbXMsCiYjNDM7CQkJCSAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfY291bnQgPSAwOwomIzQzOwlzcm8tJmd0O3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykgewomIzQzOwkJU01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXMKJiM0MzsJfTsKJiM0MzsJcmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3JvLCBHRlBfS0VSTkVMKTsKJiM0MzsJcm1pX3Nyb19mcmVlKHNybyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfZGVzdHJveSgpIC0gRGVzdHJveSBhIFJFQwomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWQKJiM0MzsgKgomIzQzOyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQwomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmUKJiM0MzsgKgomIzQzOyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MpOwomIzQzOwlyZXR1cm4gcmVncy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9jcmVhdGUoKSAtIENyZWF0ZXMgYW4gUlRUCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcnR0OiBQQSBvZiB0aGUgdGFyZ2V0IFJUVAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKgomIzQzOyAqIENyZWF0ZXMgYW4gUlRUIChSZWFsbSBUcmFuc2xhdGlvbiBUYWJsZSkgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlCiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBydHQsCiYjNDM7CQkJCSAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYW4gUlRUCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFQKJiM0MzsgKiBAbGV2ZWw6IFJUVCBsZXZlbAomIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWQKJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeQomIzQzOyAqIGF0IHdoaWNoIHRoZSBSVFQgd2FsayB0ZXJtaW5hdGVkLgomIzQzOyAqCiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGUKJiM0MzsgKiB0YWJsZSBhcmUgaW4gQVNTSUdORUQgb3IgVEFCTEUgc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGlwYSwKJiM0MzsJCQkJICAgbG9uZyBsZXZlbCwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCwKJiM0MzsJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlpZiAob3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsJaWYgKG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTI7CiYjNDM7CiYjNDM7CXJldHVybiBSTUlfU1VDQ0VTUzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVAomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWQKJiM0MzsgKgomIzQzOyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAmIzM5O2hvbW9nZW5lb3VzJiMzOTsgdGhlIFJUVCBjYW4gYmUKJiM0MzsgKiBmb2xkZWQgaW50byB0aGUgcGFyZW50IGFuZCB0aGUgUlRUIGRlc3Ryb3llZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsCiYjNDM7CQkJCWxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3J0dCkKJiM0MzsJCSpvdXRfcnR0ID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbQomIzQzOyAqIEByZDogUEEgb2YgdGhlIFJECiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0CiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZAomIzQzOyAqCiYjNDM7ICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQQomIzQzOyAqIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2UKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZwomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWQKJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZQomIzQzOyAqIEBvdXRfY291bnQ6IE51bWJlciBvZiBlbnRyaWVzIGluIG91dHB1dCBhZGRyZXNzIGxpc3QKJiM0MzsgKgomIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgYmFzZSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgb2FkZHIsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nICpvdXRfdG9wLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCAhPSBSTUlfU1VDQ0VTUykKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWlmIChvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwlpZiAob3V0X3JhbmdlKQomIzQzOwkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CWlmIChvdXRfY291bnQpCiYjNDM7CQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsKJiM0MzsJcmV0dXJuIFJNSV9TVUNDRVNTOwomIzQzO30KJiM0MzsKJiM0MzsjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMjE0ZDYyMjhkZmMyMgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oCkBAIC0wLDAgJiM0MzsxLDQ5NyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqCiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvcgomIzQzOyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDM6CiYjNDM7ICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0My8KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FybS1zbWNjYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRmaWVsZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zaXplcy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDthc20vcGFnZS5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpCQkJCVwKJiM0MzsJQVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsCQlcCiYjNDM7CQkJICAgQVJNX1NNQ0NDX1NNQ182NCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsCVwKJiM0MzsJCQkgICAoZnVuYykpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT04JCQkJU01DX1JNSV9DQUxMKDB4MDE1MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQJCVNNQ19STUlfQ0FMTCgweDAxNTMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE1NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE1OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNTkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTVhKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNWIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUgkJCVNNQ19STUlfQ0FMTCgweDAxNWMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTVkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZCQkJU01DX1JNSV9DQUxMKDB4MDE2MSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURQkJU01DX1JNSV9DQUxMKDB4MDE2MykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURQkJCVNNQ19STUlfQ0FMTCgweDAxNjQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTCQkJU01DX1JNSV9DQUxMKDB4MDE2NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTY2KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9TRVRfUklQQVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTZhKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE2YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVQJCQlTTUNfUk1JX0NBTEwoMHgwMTZlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZCQlTTUNfUk1JX0NBTEwoMHgwMTZmKQomIzQzOyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNICVNNQ19STUlfQ0FMTCgweDAxNzApCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlQJCQlTTUNfUk1JX0NBTEwoMHgwMTc0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0NPTU1VTklDQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTc1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNzYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWQkJCVNNQ19STUlfQ0FMTCgweDAxNzcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3OCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0gJCVNNQ19STUlfQ0FMTCgweDAxN2EpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWQkJCVNNQ19STUlfQ0FMTCgweDAxN2IpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUAkJCVNNQ19STUlfQ0FMTCgweDAxN2MpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3ZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3ZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xECQkJU01DX1JNSV9DQUxMKDB4MDE3ZikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxODUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxODYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE4NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE4OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxOGEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9TRVRfUzJBUAkJCVNNQ19STUlfQ0FMTCgweDAxOGIpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlQJU01DX1JNSV9DQUxMKDB4MDFkMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTCQlTTUNfUk1JX0NBTEwoMHgwMWQxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0sJCQlTTUNfUk1JX0NBTEwoMHgwMWQyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUCQkJU01DX1JNSV9DQUxMKDB4MDFkMykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFCQlTTUNfUk1JX0NBTEwoMHgwMWQ2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAxZDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEUJCVNNQ19STUlfQ0FMTCgweDAxZDgpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURQkJU01DX1JNSV9DQUxMKDB4MDFkYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfREVTVFJPWQkJU01DX1JNSV9DQUxMKDB4MDFkYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFkZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZGYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFlMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQJCVNNQ19STUlfQ0FMTCgweDAxZTEpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUCQlTTUNfUk1JX0NBTEwoMHgwMWUzKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVQJCQlTTUNfUk1JX0NBTEwoMHgwMWVlKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FCQlTTUNfUk1JX0NBTEwoMHgwMWYwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFCQlTTUNfUk1JX0NBTEwoMHgwMWYxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUJU01DX1JNSV9DQUxMKDB4MDFmMikKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxZjMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDFmNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWY5KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMjAwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjAxKQomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjAyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRQkJCVNNQ19STUlfQ0FMTCgweDAyMDMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1QJCVNNQ19STUlfQ0FMTCgweDAyMDQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1QJCVNNQ19STUlfQ0FMTCgweDAyMDUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjA2KQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0UJCVNNQ19STUlfQ0FMTCgweDAyMDcpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjA4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTQkJCVNNQ19STUlfQ0FMTCgweDAyMDkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NBTkNFTAkJCVNNQ19STUlfQ0FMTCgweDAyMGEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTCQkJU01DX1JNSV9DQUxMKDB4MDIwYikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAyMGMpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9DT01QTEVURQkJU01DX1JNSV9DQUxMKDB4MDIwZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GTwkJCVNNQ19STUlfQ0FMTCgweDAyMGUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDIwZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fSU5GTwkJU01DX1JNSV9DQUxMKDB4MDIxMCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0lORk8JCQlTTUNfUk1JX0NBTEwoMHgwMjExKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OCTIKJiM0MzsjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTgkwCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHZlcnNpb24pICgodmVyc2lvbikgJmd0OyZndDsgMTYpCiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgJmFtcDsgMHhGRkZGKQomIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgJmx0OyZsdDsgMTYpIHwgKG1pbm9yKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0sJCUdFTk1BU0soNywgMCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTSwkJR0VOTUFTSygxNSwgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0sJCUdFTk1BU0soOSwgOCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLCUJJVCgxMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX0lOREVYX01BU0ssIHJldCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldCkJCUZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9TVUNDRVNTCQkJMAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUCQkJMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQUxNCQkJMgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JFQwkJCTMKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFQJCQk0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfTk9UX1NVUFBPUlRFRAkJNQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRQkJNgomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVgJCTcKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9QU01NVV9TVAkJOAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0RQVAkJCTkKJiM0MzsjZGVmaW5lIFJNSV9CVVNZCQkJMTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUwJCTExCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkcJCTEyCiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURQkJCTEzCiYjNDM7I2RlZmluZSBSTUlfQkxPQ0tFRAkJCTE0CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1BUCQkJMTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFCQkxNgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcJCTAKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QCQkxCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEUJCTEKJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU0JCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9PUF9DQU5OT1RfQ0FOQ0VMCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLCQlHRU5NQVNLKDE4LCAxNykKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0sJCUJJVCgxNikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTSwkJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLCUdFTk1BU0soMSwgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEUocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfU1RBVEVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfQ09OVElHX01BU0ssIHJlcSkKJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKQkJRklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFKHJlcSkJRklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTAkJMgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHCQkwCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJRwkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUdFTk1BU0soNjMsIDYyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCUdFTk1BU0soNTEsIFBBR0VfU0hJRlQpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLCUdFTk1BU0soUEFHRV9TSElGVCAtIDEsIDIpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShyKQlGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChyKQkJRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSkKJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocikJCSgocikgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUocikJCUZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCAocikpCiYjNDM7CiYjNDM7ZW51bSBybWlfcmlwYXMgewomIzQzOwlSTUlfRU1QVFkgPSAwLAomIzQzOwlSTUlfUkFNID0gMSwKJiM0MzsJUk1JX0RFU1RST1lFRCA9IDIsCiYjNDM7CVJNSV9ERVYgPSAzLAomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UCTAKJiM0MzsjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlQJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMk9BU1oJCQlHRU5NQVNLKDQwLCAzMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEUJQklUKDMyKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlMJCUdFTk1BU0soMzEsIDI3KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVUJCQlCSVQoMjYpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFMJCQlHRU5NQVNLKDI1LCAyMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQUwkJCUdFTk1BU0soMTksIDE0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkwJCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFCQkJQklUKDkpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTIJCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWgkJCUdFTk1BU0soNywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTCQkJR0VOTUFTSygxNiwgMTQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1oJCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVIJCUdFTk1BU0soOSwgNikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyCQlCSVQoNSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0CQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2CQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQgkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0IJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0IJCUJJVCgwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVIJR0VOTUFTSygxNCwgMTApCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNCQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUERFVl9NQVhfVkRFVlNfT1JERVIJR0VOTUFTSyg3LCA0KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFMJCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVUJCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09ICQkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBCQkJQklUKDApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUCUJJVCg2KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkUJCUdFTk1BU0soNSwgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTCUdFTk1BU0soMywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UCQlHRU5NQVNLKDYzLCAwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwJCTAKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0gJCTEKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSAkJMgomIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FCQkJMwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX1JFU0VSVkVECQkJMAomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkUJCQkxCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORQkJCTIKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19DT0FSU0UJCQkzCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFCQk0CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQgkwCiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0IJMQomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCCTIKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVQomIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVCiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlUKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVQomIzQzOwomIzQzOy8qCiYjNDM7ICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NAomIzQzOyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJtbV9jb25maWcgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7CiYjNDM7CQkJdTY0IHJtaV9ncmFudWxlX3NpemU7CiYjNDM7CQl9OwomIzQzOwkJdTggc2l6ZXJbU1pfNEtdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRQkJQklUKDEpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVUJCUJJVCgyKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREEJCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1kJCUdFTk1BU0soNiwgNSkKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1kJCUdFTk1BU0soOCwgNykKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTYJCQkwCiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyCQkJMQomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzM4NAkJCTIKJiM0MzsKJiM0MztzdHJ1Y3QgcmVhbG1fcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGZsYWdzMDsKJiM0MzsJCQl1NjQgczJzejsKJiM0MzsJCQl1NjQgc3ZlX3ZsOwomIzQzOwkJCXU2NCBudW1fYnBzOwomIzQzOwkJCXU2NCBudW1fd3BzOwomIzQzOwkJCXU2NCBwbXVfbnVtX2N0cnM7CiYjNDM7CQkJdTY0IGhhc2hfYWxnbzsKJiM0MzsJCQl1NjQgbnVtX2F1eF9wbGFuZXM7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzBbMHg0MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NDAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHJwdls2NF07CiYjNDM7CQkJdTY0IGF0c19wbGFuZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMVsweDQwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg4MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHBhZGRpbmcyOwomIzQzOwkJCXU2NCBydHRfYmFzZTsKJiM0MzsJCQlzNjQgcnR0X2xldmVsX3N0YXJ0OwomIzQzOwkJCXU2NCBydHRfbnVtX3N0YXJ0OwomIzQzOwkJCXU2NCBmbGFnczE7CiYjNDM7CQkJdTY0IG1heF9udW1fdmRldnM7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzNbMHg3MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4ZjAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHBhZGRpbmc0WzB4ODBdOwomIzQzOwkJCXU2NCBhdXhfcnR0X2Jhc2VbM107CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzVbMHgxMDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZQomIzQzOyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTCQk4CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEUJQklUKDApCiYjNDM7CiYjNDM7c3RydWN0IHJlY19wYXJhbXMgewomIzQzOwl1bmlvbiB7IC8qIDB4MCAqLwomIzQzOwkJdTY0IGZsYWdzOwomIzQzOwkJdTggcGFkZGluZzBbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MTAwICovCiYjNDM7CQl1NjQgbXBpZHI7CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBwYzsKJiM0MzsJCXU4IHBhZGRpbmcyWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDMwMCAqLwomIzQzOwkJdTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTsKJiM0MzsJCXU4IHBhZGRpbmczWzB4ZDAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7CiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPCUJJVCgwKQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfSU5KRUNUX1NFQQlCSVQoMSkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFCQlCSVQoMykKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFCUJJVCg0KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRQlCSVQoNSkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0UJQklUKDYpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMAkJQklUKDcpCiYjNDM7CiYjNDM7I2RlZmluZSBSRUNfUlVOX0dQUlMJCQkzMQomIzQzOwomIzQzO3N0cnVjdCByZWNfZW50ZXIgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1NjQgZmxhZ3M7CiYjNDM7CQl1OCBwYWRkaW5nMFsweDIwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMVsweDYwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TWU5DCQkJMHgwMAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfSVJRCQkJMHgwMQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfRklRCQkJMHgwMgomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUFNDSQkJCTB4MDMKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRQkJMHgwNAomIzQzOyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMCQkweDA1CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TRVJST1IJCQkweDA2CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRQkJMHgwNwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HCTB4MDgKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkQJCTB4MGEKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX2V4aXQgewomIzQzOwl1bmlvbiB7IC8qIDB4MDAwICovCiYjNDM7CQl1OCBleGl0X3JlYXNvbjsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgZXNyOwomIzQzOwkJCXU2NCBmYXI7CiYjNDM7CQkJdTY0IGhwZmFyOwomIzQzOwkJCXU2NCBydHRfdHJlZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nMVsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgyMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19SVU5fR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU4IHBhZGRpbmczWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDQwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1NjQgY250cF9jdGw7CiYjNDM7CQkJdTY0IGNudHBfY3ZhbDsKJiM0MzsJCQl1NjQgY250dl9jdGw7CiYjNDM7CQkJdTY0IGNudHZfY3ZhbDsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg1MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHJpcGFzX2Jhc2U7CiYjNDM7CQkJdTY0IHJpcGFzX3RvcDsKJiM0MzsJCQl1OCByaXBhc192YWx1ZTsKJiM0MzsJCQl1OCBwYWRkaW5nNVsweGZdOwomIzQzOwkJCXU2NCBzMmFwX2Jhc2U7CiYjNDM7CQkJdTY0IHMyYXBfdG9wOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzE7CiYjNDM7CQkJdTY0IHZkZXZfaWRfMjsKJiM0MzsJCQl1NjQgZGV2X21lbV9iYXNlOwomIzQzOwkJCXU2NCBkZXZfbWVtX3RvcDsKJiM0MzsJCQl1NjQgZGV2X21lbV9wYTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nNlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg2MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTE2IGltbTsKJiM0MzsJCQl1OCBwYWRkaW5nN1sweDZdOwomIzQzOwkJCXU2NCBwbGFuZTsKJiM0MzsJCX07CiYjNDM7CQl1OCBwYWRkaW5nOFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg3MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTggcG11X292Zl9zdGF0dXM7CiYjNDM7CQkJdTggcGFkZGluZzlbMHhmXTsKJiM0MzsJCQl1NjQgdnNtbXU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzEwWzB4MTAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspOwomIzQzOwomIzQzO3N0cnVjdCByZWNfcnVuIHsKJiM0MzsJc3RydWN0IHJlY19lbnRlciBlbnRlcjsKJiM0MzsJc3RydWN0IHJlY19leGl0IGV4aXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspOwomIzQzOwomIzQzOy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqLwomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlQJR0VOTUFTSygxNSwgMikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSCUdFTk1BU0soMTgsIDE2KQomIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAJCUdFTk1BU0soMjIsIDE5KQomIzQzOwomIzQzOy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRQlHRU5NQVNLKDEsIDApCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlQJR0VOTUFTSygxNSwgMikKJiM0MzsKJiM0MzsvKiBTMkFQIERpcmVjdCBFbmNvZGluZ3MsIHVzZWQgaW4gUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVAgKi8KJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURQkJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQUQJCQlCSVQoMSkKJiM0MzsKJiM0MzsjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4MzM3CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNTM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqCgpPa2F5LCBzbyB0aGUgaW5pdGlhbCBwcm9tcHQgYXNrcyBtZSB0byBldmFsdWF0ZSB0aGlzIHBhdGNoIHNlcmllcyBmb3Igc3l6a2FsbGVyIGZ1enppbmcgcG90ZW50aWFsIG9uIGFtZDY0LiBTdHJhaWdodCBhd2F5LCB0aGUgbWVudGlvbiBvZiBgYW1kNjRgIHNldHMgb2ZmIGFsYXJtIGJlbGxzLiBJIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bCBoZXJlLgoKVGhlIGZpcnN0IHRoaW5nIEkgZGlkIHdhcyByZS1leGFtaW5lIHRoZSBgVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRgIGluc3RydWN0aW9uLgoKVGhlIHByb3ZpZGVkIHBhdGNoIHRvdWNoZXMgYSBmZXcga2V5IGFyZWFzLCB0aGUgZmlyc3QgYmVpbmcgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgKHNlbGVjdHMgYEFSQ0hfU1VQUE9SVFNfUk1NYCksIGFuZCBgZHJpdmVycy9maXJtd2FyZWAgd2hpY2ggaW5jbHVkZXMgYW4gYGFybV9ybW1gIHN1YmRpcmVjdG9yeSB3aXRoIEtjb25maWcgYW5kIE1ha2VmaWxlIGNvbmZpZ3VyYXRpb25zIGZvciBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmdW5jdGlvbmFsaXR5LiBJdCYjMzk7cyBvYnZpb3VzbHkgYWltaW5nIGF0IEFSTTY0IGFyY2hpdGVjdHVyZSwgZ2l2ZW4gdGhlIGZpbGUgbmFtZXMgYW5kIHRoZSBpbmNsdXNpb24gb2YgYGFyY2gvYXJtNjRgIGNvbmZpZ3VyYXRpb25zLiBNeSBpbml0aWFsIGludHVpdGlvbiBpcyBzY3JlYW1pbmcgKndyb25nIGFyY2hpdGVjdHVyZSEqLgoKVGhlIHJlYWwgcXVlc3Rpb24sIHRoZSBjcml0aWNhbCBvbmUsIGlzIHdoZXRoZXIgdGhpcyBgQ09ORklHX0FSTV9STU1fUk1JYCBmZWF0dXJlLCB0aGF0JiMzOTtzIGRlZXBseSB0aWVkIHRvIEFSTTY0IFJNSSBzdXBwb3J0LCBpcyBldmVuIGJ1aWxkYWJsZSwgbGV0IGFsb25lIHJlYWNoYWJsZSwgb24gYW4gYW1kNjQgc3lzdGVtLiBUaGUgcGF0Y2ggc2VyaWVzIGhhcyBgS2NvbmZpZ2AgZmlsZXMgdGhhdCByZXZlYWwgYSBkZXBlbmRlbmN5IGNoYWluLiBgQVJNX1JNTV9STUlgIGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc2VsZWN0ZWQgKm9ubHkqIHdpdGhpbiB0aGUgYEFSTTY0YCBjb25maWd1cmF0aW9uIGluIGBhcmNoL2FybTY0L0tjb25maWdgLgoKTm93LCBJJiMzOTttIGNoZWNraW5nLCBqdXN0IHRvIGJlIHN1cmUsIHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBvciBgQVJNX1JNTV9STUlgIGlzICpuZXZlciogc29tZWhvdyBkZWZpbmVkIG9yIHNlbGVjdGVkIG9uIGFuIHg4Ni9hbWQ2NCBjb25maWd1cmF0aW9uLiBJJiMzOTttIGdvaW5nIHRvIHF1aWNrbHkgZ3JlcCB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSB0byBiZSAxMDAlIHBvc2l0aXZlLiBUaGlzIGlzIGltcG9ydGFudCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpcyBldmVuICpyZWxldmFudCogdG8gZnV6emluZyBhIHN5c3RlbSBvbiBhbiBhbWQ2NCBhcmNoaXRlY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QVJDSF9TVVBQT1JUU19STU0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XG4tLVxuYXJjaC9hcm02NC9LY29uZmlnLTQwLVx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG5hcmNoL2FybTY0L0tjb25maWc6NDE6XHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc6Mjpjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTMtXHRib29sXG4tLVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc9NT1jb25maWcgQVJNX1JNTV9STUlcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXHRib29sIFwmIzM0O1JlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcJiMzNDtcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjc6XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVx0ZGVmYXVsdCB5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMDk6MDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjk1NjcKCQkJCQkJCW91dHB1dDogMTM0CgkJCQkJCQl0aG91Z2h0czogMTIwMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQYXRjaCBBcHBsaWNhYmlsaXR5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIGBybWkuY2AgZmlsZSwgaW5jbHVkZXMgYW55IEFSTTY0LXNwZWNpZmljIGhlYWRlcnMuIExvb2tzIGxpa2Ugd2UgaGF2ZTogYCZsdDthc20vbWVtb3J5LmgmZ3Q7YCwgYCZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0O2AsIHRoZSBgQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVGAgbWFjcm8sIHRoZSBgcmVhZF9zYW5pdGlzZWRfZnRyX3JlZ2AgZnVuY3Rpb24gY2FsbCAod2hpY2ggZGVhbHMgd2l0aCB0aGUgc3lzdGVtIHJlZ2lzdGVyKSwgYW5kIGZ1bmN0aW9ucy9zdHJ1Y3R1cmVzIGxpa2UgYGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZGAsIGBhcm1fc21jY2NfMV8yX3JlZ3NgLCBhbmQgYGFybV9zbWNjY18xXzJfaW52b2tlYC4gWWVwLCBkZWZpbml0ZWx5IEFSTTY0LXNwZWNpZmljIHN0dWZmLgoKTm93LCBsZXQmIzM5O3MgcmVmZXIgdG8gdGhlIGluc3RydWN0aW9ucy4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlbGV2YW50IGNvbmRpdGlvbiBoZXJlIGlzICYjMzQ7Q29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLCYjMzQ7IGFuZCBvdXIgdGFyZ2V0IGlzIGNsZWFybHkgYW1kNjQuCgpUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgLyBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1NL1JNSSkuIEl0IHRvdWNoZXMgZmlsZXMgbGlrZSBgYXJjaC9hcm02NC9LY29uZmlnYCwgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AsIHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL2AgZGlyZWN0b3J5LCBhbmQgcmVsYXRlZCBoZWFkZXJzLiBJIGtub3cgdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG9ubHkgc2VsZWN0ZWQgaWYgYGNvbmZpZyBBUk02NGAgaXMgc2V0LiBBbHNvLCBgQVJNX1JNTV9STUlgIGlzIGRlcGVuZGVudCBvbiBgQVJDSF9TVVBQT1JUU19STU1gLiBDb25zZXF1ZW50bHksIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzICpuZXZlciogZW5hYmxlZCBvbiBhbWQ2NCAoeDg2XzY0KS4gRXZlbiBpZiBpdCAqY291bGQqIGJlIGVuYWJsZWQgc29tZWhvdywgdGhlIHByZXNlbmNlIG9mIHRob3NlIEFSTTY0LXNwZWNpZmljIHN5bWJvbHMgY29uZmlybXMgdGhlIGNvZGUmIzM5O3MgdW5yZWFjaGFiaWxpdHkgb24gYW1kNjQuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzd2VlcCBvZiB0aGUgY2hhbmdlZCBmaWxlcyB0byB2ZXJpZnkgdGhhdC4gSSYjMzk7bGwgbWFrZSBzdXJlIGVhY2ggaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCgoxLiAgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgLSBBUk02NCBvbmx5LgoyLiAgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AgLSBBUk02NCBvbmx5LgozLiAgYGRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ2AgLSBzb3VyY2VzIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ2AuCjQuICBgZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZWAgLSBhZGRzIGBvYmoteSAmIzQzOz0gYXJtX3JtbS9gLgo1LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCAtIGRlZmluZXMgYEFSQ0hfU1VQUE9SVFNfUk1NYCAobm90IHNlbGVjdGVkIGJ5IHg4NikgYW5kIGBBUk1fUk1NX1JNSWAgKGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCkuIE9uIGFtZDY0LCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG4sIHNvIGBBUk1fUk1NX1JNSWAgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBlbmFibGVkLgo2LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAgLSBjb21waWxlcyBgcm1pLm9gIG9ubHkgaWYgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgc2V0Lgo3LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY2AgLSBjb21waWxlZCBvbmx5IGlmIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIHNldC4KOC4gIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCAtIGhlYWRlciBub3QgdXNlZCBvbiBhbWQ2NC4KOS4gIGBpbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaGAgLSBoZWFkZXIgbm90IHVzZWQgb24gYW1kNjQuCgpPa2F5LCBhbmQgSSYjMzk7bGwgcXVpY2tseSBjaGVjayBpZiBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tYCBldmVuIGNvbXBpbGVzIG9uIGFtZDY0LiBTaW5jZSBgQ09ORklHX0FSTV9STU1fUk1JYCBpcyBub3Qgc2V0LCB0aGUgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZWAgZ2VuZXJhdGVzIG5vIG9iamVjdHMuIEl0JiMzOTtzIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSBvbiBhbWQ2NC4KClNvLCBhbGwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlbHkgZm9yIEFSTTY0LiBJdCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgJiMzNDtVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6ICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiYjMzQ7CgpUaGVyZWZvcmU6CgoqICAgYFdvcnRoRnV6emluZyA9IGZhbHNlYAoqICAgYEVuYWJsZUNvbmZpZ3MgPSBbXWAKKiAgIGBGb2N1c1N5bWJvbHMgPSBbXWAKKiAgIGBSZWFzb25pbmcgPSBDb25jaXNlIGV4cGxhbmF0aW9uOiBUYXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LCB0aGlzIHBhdGNoIGFkZHMgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgc3VwcG9ydCBleGNsdXNpdmUgdG8gYXJtNjQgYXJjaGl0ZWN0dXJlIChDT05GSUdfQVJNX1JNTV9STUkgZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSwgd2hpY2ggaXMgb25seSBzZWxlY3RlZCBieSBBUk02NCkuIFRodXMsIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5gCgpDaGVja2luZzoKVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQuClBhdGNoOiBBUk0gUk1NL1JNSSBzdXBwb3J0LgpDcml0ZXJpYSBjaGVjazoKLSBXb3J0aEZ1enppbmc9ZmFsc2Ugd2hlbiAmIzM0O0NvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4mIzM0OwotIEZvY3VzU3ltYm9sczogW10KLSBFbmFibGVDb25maWdzOiBbXQotIFJlYXNvbmluZzoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDA5OjA5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyMi4zNDUyNDAwNjlaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTEyNDM0NDExNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyMi4zNDUyNDc0NDlaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyMTcwOTQyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGNmNzlkMDk0NDE0YTZlNjMyOTZlZDMzYTMzZjZiOWQ3ODMyZGE0YmNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgMTIgMDk6MDk6MjEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxcbiBcXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcXG4rXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDMyMTAyYzM5MTJmYTcuLmU4YjI5OTgzYjAwMjEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcXG4rXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc2Ftc3VuZy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS94aWxpbngvS2NvbmZpZ1xcXCJcXG4rc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xcXCJcXG4gXFxuIGVuZG1lbnVcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxuQEAgLTAsMCArMSwyNiBAQFxcbitcXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGJvb2xcXG4rXFxuK2NvbmZpZyBBUk1fUk1NX1JNSVxcbitcXHRib29sIFxcXCJSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGRlZmF1bHQgeVxcbitcXHRoZWxwXFxuK1xcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcXG4rXFx0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxcbitcXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXFxuK1xcbitcXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cXG4rXFx0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxcbitcXHQgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuXFxuK1xcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXFxuK1xcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXFxuK1xcbitcXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxcbitcXHQgIFJlYWxtIGd1ZXN0cy5cXG4rXFxuK1xcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XFxuK1xcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcXHQ9IHJtaS5vXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNTgzZTFhY2E5YjE1YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcXG5AQCAtMCwwICsxLDk5OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1ibG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXFx1MDAzZVxcbitcXG4rc3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcXG4rXFxuKy8qIEN1cnJlbnRseSBvbmx5IHRoZSBmaXJzdCAyIHJlZ2lzdGVycyBhcmUgdXNlZCBieSBMaW51eCAqL1xcbisjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVFxcdDJcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF0gX19yb19hZnRlcl9pbml0O1xcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlc1xcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXFxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxcbisgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZFxcbisgKlxcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcXG4rICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXFxuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxcbisgKlxcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XFxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCxcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZWdzLmEwO1xcbitcXG4rXFx0aWYgKG91dF9jYXRlZ29yeSlcXG4rXFx0XFx0Km91dF9jYXRlZ29yeSA9IHJlZ3MuYTE7XFxuK1xcdGlmIChvdXRfc3RhdGUpXFxuK1xcdFxcdCpvdXRfc3RhdGUgPSByZWdzLmEyO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEzO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKlxcbisgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXFxuKyAqIEBzdGFydDogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcXG4rICpcXHRcXHR0aGUgR1BUIEBvdXRfZ3B0X3Bhcl9zdGF0ZSBpcyB2YWxpZFxcbisgKiBAb3V0X2dwdF9wYXJfc3RhdGU6IFN0YXRlIG9mIHRoZSBHUFQgY292ZXJlZCBieSBbc3RhcnQsIG91dF90b3ApXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSlcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfR1BUX0lORk8sIHN0YXJ0LCBlbmQsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0aWYgKHJlZ3MuYTAgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZWdzLmEwO1xcbitcXG4rXFx0aWYgKG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFx0aWYgKG91dF9ncHRfcGFyX3N0YXRlKVxcbitcXHRcXHQqb3V0X2dwdF9wYXJfc3RhdGUgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXJcXG4rICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIGFyZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfRkVBVFVSRVMsIGluZGV4XFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZhcmdzKTtcXG4rXFx0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0KVxcbitcXHRcXHQqb3V0ID0gYXJncy5hMTtcXG4rXFxuK1xcdHJldHVybiBhcmdzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxcbisgKiBAY2ZnX3B0cjogUEEgb2YgYSBzdHJ1Y3Qgcm1tX2NvbmZpZ1xcbisgKlxcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0cixcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT04oaW5kZXggXFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2luZGV4XTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xcbitcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0bG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXG4rXFx0XFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRcXHQvKiBCdWdneSBSTU0gPyBMZXQgdGhlIGNhbGxlciBsZWFrIHRoZSBwYWdlcyAqL1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTihvdXRfdG9wIFxcdTAwM2M9IHBoeXMpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7XFxuK1xcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXFxuK1xcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXFxuK3tcXG4rXFx0bG9uZyByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XFxuK1xcbitcXHR3aGlsZSAocGh5cyBcXHUwMDNjIHRvcCkge1xcbitcXHRcXHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZShwaHlzLCB0b3AsIFxcdTAwMjZvdXRfdG9wKTtcXG4rXFxuK1xcdFxcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0XFx0LyogQnVnZ3kgUk1NID8gKi9cXG4rXFx0XFx0XFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcXHUwMDNjPSBwaHlzKSkge1xcbitcXHRcXHRcXHRcXHRybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG91dF9waHlzKVxcbitcXHRcXHQqb3V0X3BoeXMgPSBwaHlzO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xcbitcXG4rLypcXG4rICogQ29udmVydCB0aGUgUm1pQWRkckJsb2NrU2l6ZSB0byBhY3R1YWwgc2l6ZS4gVGhpcyBpcyB1c2VkIGluIFJtaURvbmF0ZVJlcVxcbisgKiBhbmQgUm1pQWRkclJhbmdlRGVzYyouXFxuKyAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQpXFxuK3tcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmcmVlX2FkZHJfcmFuZ2U6IEZyZWUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgYWRkcmVzcyByYW5nZSBlbnRyeSwgd2hpY2ggbWF5XFxuKyAqXFx0XFx0ICAgIGJlIHBhcnRpYWxseSBjb25zdW1lZCBieSBSTU0uXFxuKyAqXFxuKyAqIEBlbnRyeTogUk1JX0FERFJfUkFOR0UgZGVzY3JpcHRvclxcbisgKiBAY29uc3VtZWRfc2l6ZTogUGFnZSBhbGlnbmVkIHNpemUgY29uc3VtZWQgYnkgdGhlIFJNTSBmcm9tIHRoZSBhZGRyZXNzIHJhbmdlLlxcbisgKlxcbisgKiBJZiB0aGUgc3RhdGUgb2YgdGhlIGFkZHJlc3MgaXMgREVMRUdBVEVELCB1bmRlbGVnYXRlIGl0IGJhY2ssIGJlZm9yZSBmcmVlaW5nLlxcbisgKiBMZWFrcyB0aGUgbWVtb3J5IGlmIHdlIGNhbm5vdCB1bmRlbGVnYXRlIHRoZSByYW5nZS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGZyZWVfYWRkcl9yYW5nZSh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3NpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQgPSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcXG4rXFx0dW5zaWduZWQgbG9uZyBzaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCkgKiBjb3VudDtcXG4rXFxuK1xcdFdBUk5fT04oIVBBR0VfQUxJR05FRChwaHlzKSB8fCAhUEFHRV9BTElHTkVEKGNvbnN1bWVkX3NpemUpKTtcXG4rXFxuK1xcdC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBmb3IgcGFydGlhbGx5IGNvbnN1bWVkIGVudHJ5ICovXFxuK1xcdHBoeXMgKz0gY29uc3VtZWRfc2l6ZTtcXG4rXFx0c2l6ZSAtPSBjb25zdW1lZF9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBVbmRlbGVnYXRlIHRoZSBwYWdlcyBiYWNrIGlmIHJlcXVpcmVkLiBJZiB3ZSBjYW4ndFxcbitcXHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgV0FSTl9PTihybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBzaXplKSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0ZnJlZV9wYWdlc19leGFjdChwaHlzX3RvX3ZpcnQocGh5cyksIHNpemUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY29udGludWUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcXG4rXFx0XFx0U01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX09QX0NBTkNFTCwgc3JvX2hhbmRsZVxcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcXG4rXFx0XFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxcbitcXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcXG4rXFx0ICovXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfbWVtX3JlY2xhaW0odW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcXG4re1xcbitcXHQqb3V0X3JlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xcbit9XFxuK1xcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xcbitcXG4rc3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxcbit7XFxuK1xcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVxcdTAwM2VhZGRyX2NvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QpKVxcbitcXHRcXHRyZXR1cm4gLUVPVkVSRkxPVztcXG4rXFxuK1xcdGlmIChjb3VudCBcXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVxcdTAwM2VhZGRyX2NvdW50KVxcbitcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0IGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHNpemUgPSBibG9ja19zaXplICogY291bnQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZTtcXG4rXFx0aW50IHJldDtcXG4rXFx0dm9pZCAqdmlydDtcXG4rXFx0cGh5c19hZGRyX3QgcGh5cztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxcbitcXHQgKiBwb3dlciBvZiAyXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzcm8tXFx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSBjb3VudCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xcbitcXHRcXHRcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcXG4rXFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0YWRkcl9yYW5nZSA9IHBoeXMgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0s7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgY291bnQpO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9saXN0W3Nyby1cXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xcbitcXG4rb3V0OlxcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSksIDEsXFxuK1xcdFxcdFxcdCAgMCwgb3V0X3JlZ3MpO1xcbitcXHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXFx1MDAzZWExO1xcbitcXG4rXFx0aWYgKFdBUk5fT04oZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNlIChzaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpKSlcXG4rXFx0XFx0ZG9uYXRlZF9ncmFudWxlcyA9IChzaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbitcXG4rXFx0ZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0LyogQWxsIGdyYW51bGVzIGNvbnN1bWVkIGJ5IHRoZSBSTU0gKi9cXG4rXFx0aWYgKGRvbmF0ZWRfc2l6ZSA9PSBzaXplKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0LyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovXFxuK1xcdGlmIChkb25hdGVkX2dyYW51bGVzID09IDApIHtcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50Kys7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBUaGUgZ3JhbnVsZXMgd2VyZSBwYXJ0aWFsbHkgY29uc3VtZWQsIHJlY2xhaW0gdGhlIHVudXNlZCBvbmVzLiAqL1xcbitcXHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0RPTkFURV9CTE9DS19TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xcbitcXHR1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl9ibG9jayA9IGJsb2NrX3NpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb25zdW1lZF9ibG9ja3M7XFxuK1xcdGludCBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXFx1MDAyNlxcdTAwMjYgZm91bmQgXFx1MDAzYyBjb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFxuK1xcdFxcdGlmIChSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KSA9PSBibG9ja19zaXplX2ZsZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xcbitcXHRcXHRcXHRhZGRyX2xpc3Rfc3RhcnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFx0XFx0XFx0Zm91bmQrKztcXG4rXFx0XFx0XFx0aS0tO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3aGlsZSAoZm91bmQgXFx1MDAzYyBjb3VudCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdFxcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdChibG9ja19zaXplLCBnZnApO1xcbitcXHRcXHRwaHlzX2FkZHJfdCBwaHlzO1xcbitcXG4rXFx0XFx0aWYgKCF2aXJ0KVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XFxuK1xcbitcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0XFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XFxuK1xcbitcXHRcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIGJsb2NrX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XFxuK1xcdFxcdFxcdFxcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcXG4rXFx0XFx0XFx0XFx0XFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBibG9ja19zaXplKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGRyX3JhbmdlID0gcGh5cyBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIGJsb2NrX3NpemVfZmxkKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCAxKTtcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XFxuK1xcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnQrK10gPSBhZGRyX3JhbmdlO1xcbitcXHRcXHRmb3VuZCsrO1xcbitcXHR9XFxuK1xcbitcXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHZpcnRfdG9fcGh5cyhcXHUwMDI2c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXFxuK1xcdFxcdFxcdCAgY291bnQsIDAsIG91dF9yZWdzKTtcXG4rXFxuK1xcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxcbitcXHQgKiBqdXN0IGluIGNhc2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl9ibG9jaykpXFxuK1xcdFxcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBjb3VudCAqIGdyYW51bGVzX3Blcl9ibG9jaztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcXG4rXFx0ICogdHJhY2sgaW4gdGhlIGFkZHJlc3MgbGlzdHMgaW4gYmxvY2stc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XFxuK1xcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCBibG9ja3MuXFxuK1xcdCAqL1xcbitcXHRjb25zdW1lZF9ibG9ja3MgPSBkb25hdGVkX2dyYW51bGVzIC8gZ3JhbnVsZXNfcGVyX2Jsb2NrO1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBBIGJsb2NrIGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XFxuK1xcdFxcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XFxuK1xcdFxcdCAqL1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfYmxvY2tzXTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxcbitcXHRcXHRcXHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl9ibG9jaykgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdFxcdGZyZWVfYWRkcl9yYW5nZShlbnRyeSwgZG9uYXRlZF9zaXplKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhpcyBibG9jayBpcyBub3cgZnVsbHkgJ2NvbnN1bWVkJyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxcbitcXHRcXHQgKiBmcmVlZClcXG4rXFx0XFx0ICovXFxuK1xcdFxcdGNvbnN1bWVkX2Jsb2NrcysrO1xcbitcXHR9XFxuK1xcbitcXHQvKiBLZWVwIGp1c3QgdGhlIGJsb2NrcyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXFxuK1xcdGZvciAoaW50IGkgPSBjb25zdW1lZF9ibG9ja3M7IGkgXFx1MDAzYyBjb3VudDsgaSsrKVxcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfYmxvY2tzXSA9XFxuK1xcdFxcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX2Jsb2NrcztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MsXFxuK1xcdFxcdFxcdCAgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkgPT0gUk1JX09QX01FTV9DT05USUcpIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICByZWdzLCBnZnApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHNybywgc3JvX2hhbmRsZSwgZG9uYXRlcmVxLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRyZWdzLCBnZnApO1xcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19yZWNsYWltKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcXG4rXFxuK1xcdGlmIChybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpKVxcbitcXHRcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSxcXG4rXFx0XFx0XFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAgKiBSTUlfT1BfTUVNX1JFQ0xBSU0gYWx3YXlzIHJldHVybiBSTUlfSU5DT01QTEVURSwgZXhjZXB0IHdoZW4gdGhlXFxuK1xcdCAgKiBpbnB1dCBwYXJhbWV0ZXJzIHdlcmUgaW52YWxpZC5cXG4rXFx0ICAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKG91dF9yZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cXHUwMDNlYTEgXFx1MDAzZSBjYXBhY2l0eSkpXFxuK1xcdFxcdG91dF9yZWdzLVxcdTAwM2VhMSA9IGNhcGFjaXR5O1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdC8qIEhhbmRsZSB0aGUgd29yc2UgKi9cXG4rXFx0aWYgKFdBUk5fT04oc3JvLVxcdTAwM2VhZGRyX2NvdW50IFxcdTAwM2MgMCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGlmIChXQVJOX09OKHNyby1cXHUwMDNlYWRkcl9jb3VudCBcXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gUk1JX01BWF9BRERSX0xJU1Q7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKVxcbitcXHRcXHRmcmVlX2FkZHJfcmFuZ2Uoc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV0sIDApO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50ID0gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFxcdTAwMjZzcm8tXFx1MDAzZXJlZ3M7XFxuK1xcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcXG4rXFx0XFx0aW50IHJldCA9IDA7XFxuK1xcbitcXHRcXHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXFx1MDAzZWEwKSkge1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6XFxuK1xcdFxcdFxcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcXG4rXFx0XFx0XFx0XFx0XFx0cmVncyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcXG4rXFx0XFx0XFx0cmV0ID0gcm1pX3Nyb19kb25hdGUoc3JvLCBzcm9faGFuZGxlLCByZWdzLVxcdTAwM2VhMiwgcmVncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBnZnApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxcbitcXHRcXHRcXHRyZXQgPSBybWlfc3JvX3JlY2xhaW0oc3JvLCBzcm9faGFuZGxlLCByZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChyZXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQWxsIG1lbW9yeSBkb25hdGluZyBTUk9zIG11c3QgYmUgY2FuY2VsbGFibGUuIFNvIGFcXG4rXFx0XFx0XFx0ICogZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbiBzaG91bGRuJ3QgYmUgYW4gaXNzdWUuXFxuK1xcdFxcdFxcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxcbitcXHRcXHRcXHQgKiBidWdneSBSTU0pLCBkb24ndCBsb29wIGZvcmV2ZXIsIGp1c3QgZ2l2ZSB1cC5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWNhbl9jYW5jZWwpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBhbmQgY2FtZSBiYWNrIGhlcmUgZHVlXFxuK1xcdFxcdFxcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxcbitcXHRcXHRcXHQgKiBpbiBnb2luZyBpbiBsb29wcy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGNhbmNlbGxlZCA9IHRydWU7XFxuK1xcbitcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXFx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUpO1xcbitcXG4rLyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi9cXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncylcXG4re1xcbitcXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xcbitcXHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUgPSByZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UocmVncyk7XFxuK1xcbitcXHRzcm9faGFuZGxlID0gcmVncy1cXHUwMDNlYTE7XFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0aWYgKCFjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK1xcdFxcdFxcdC8qIElmIHdlIGhhdmUgYWxyZWFkeSBjYW5jZWxsZWQsIGRvbid0IHJldHJ5IHRoaXMgKi9cXG4rXFx0XFx0XFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcdFxcdFxcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XFxuK1xcdFxcdFxcdGNhbmNlbGxlZCA9IHRydWU7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNhbmNlbGxlZClcXG4rXFx0XFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XFxuK1xcbitcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcXG4rXFxuK3N0YXRpYyBpbnQgcm1pX2NoZWNrX3ZlcnNpb24odm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xcbitcXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xcbitcXHRcXHRTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbixcXG4rXFx0fTtcXG4rXFxuK1xcdC8qIElmIFJNRSBpc24ndCBzdXBwb3J0ZWQsIHRoZW4gUk1JIGNhbid0IGJlICovXFxuK1xcdGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApXFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZXMpO1xcbitcXHRpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0dmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTtcXG4rXFx0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcXG4rXFx0XFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XFxuK1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7XFxuK1xcdFxcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcXG4rXFxuK1xcdFxcdHByX2VycihcXFwiVW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcXG4rXFx0XFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdHByX2luZm8oXFxcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcXFxuXFxcIiwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcmVhZF9mZWF0dXJlcyh2b2lkKVxcbit7XFxuK1xcdC8qXFxuK1xcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcXG4rXFx0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcXG4rXFx0ICovXFxuK1xcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgUk1JX0ZFQVRfUkVHX0NPVU5UOyBpKyspIHtcXG4rXFx0XFx0aWYgKFdBUk5fT04ocm1pX2ZlYXR1cmVzKGksIFxcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7XFxuK1xcdGludCByZXQgPSAwO1xcbitcXHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xcbitcXG4rXFx0c3dpdGNoIChQQUdFX1NJWkUpIHtcXG4rXFx0Y2FzZSBTWl80SzpcXG4rXFx0XFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl8xNks6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcXG4rXFx0XFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBTWl82NEs6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcXG4rXFx0XFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0QlVJTERfQlVHKCk7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcXHUwMDI2IGdyYW51bGVfZmVhdHVyZSkpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIFBBR0VfU0laRSBcXHUwMDNlXFx1MDAzZSAxMCk7XFxuK1xcdFxcdHJldHVybiAtRU5YSU87XFxuK1xcdH1cXG4rXFxuK1xcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFjb25maWcpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSTU0gY29uZmlnXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdH1cXG4rXFxuK1xcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxcbitcXHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxcbitcXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcXG4rXFx0ICogUEFHRV9TSVpFU1xcbitcXHQgKi9cXG4rXFx0Y29uZmlnLVxcdTAwM2V0cmFja2luZ19yZWdpb25fc2l6ZSA9IDA7XFxuK1xcbitcXHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcXFxcblxcXCIsIHJldCk7XFxuK1xcdFxcdHJldCA9IC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKlxcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cXG4rICovXFxuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyByZXQsIGNhdGVnb3J5LCBzdGF0ZSwgbmV4dDtcXG4rXFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcXHUwMDI2Y2F0ZWdvcnksIFxcdTAwMjZzdGF0ZSwgXFx1MDAyNm5leHQpO1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSAhPSBSTUlfVFJBQ0tJTkdfRklORSB8fFxcbitcXHRcXHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcXG4rXFx0XFx0XFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXFxuK1xcdFxcdFxcdHByX2VycihcXFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgPSBuZXh0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxcbisgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxcbisgKi9cXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcXG4rXFx0dW5zaWduZWQgbG9uZyBuZXh0LCBwYXJfc3RhdGU7XFxuK1xcbitcXHRsMGdwdF9zeiA9IDFVTCBcXHUwMDNjXFx1MDAzYyAoMzAgKyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxcbitcXHRcXHRcXHRcXHRcXHQgIHJtaV9mZWF0X3JlZygxKSkpO1xcbitcXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcXG4rXFx0ZW5kID0gQUxJR04oZW5kLCBsMGdwdF9zeik7XFxuK1xcbitcXHR3aGlsZSAoc3RhcnQgXFx1MDAzYyBlbmQpIHtcXG4rXFx0XFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXFx1MDAyNm5leHQsIFxcdTAwMjZwYXJfc3RhdGUpO1xcbitcXG4rXFx0XFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRcXHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHUFQgZm9yIHRoZSByZWdpb24gaXMgbm90IG1hbmFnZWQgYnkgZmlybXdhcmUgJWxseC0lbHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdHN0YXJ0LCBuZXh0KTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdFxcdH1cXG4rXFx0XFx0c3RhcnQgPSBuZXh0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfcHJlcGFyZV9tZW1vcnkocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcoc3RhcnQsIGVuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxcbit7XFxuK1xcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XFxuK1xcdHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7XFxuK1xcbitcXHRmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHtcXG4rXFx0XFx0aW50IHJldDtcXG4rXFxuK1xcdFxcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xcbitcXHRcXHRpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGVuZCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyKSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0XFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSlcXG4re1xcbitcXHRzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTtcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGlmIChhY3Rpb24gIT0gTUVNX0dPSU5HX09OTElORSlcXG4rXFx0XFx0cmV0dXJuIE5PVElGWV9ET05FO1xcbitcXG4rXFx0c3RhcnQgPSBQRk5fUEhZUyhhcmctXFx1MDAzZXN0YXJ0X3Bmbik7XFxuK1xcdGVuZCA9IFBGTl9QSFlTKGFyZy1cXHUwMDNlc3RhcnRfcGZuICsgYXJnLVxcdTAwM2Vucl9wYWdlcyk7XFxuK1xcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcXG4rXFxuK1xcdHJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKHJldCk7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcm1pX21lbW9yeV9uYiA9IHtcXG4rXFx0Lm5vdGlmaWVyX2NhbGwgPSBybWlfbWVtb3J5X25vdGlmaWVyLFxcbit9O1xcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuK1xcbitcXHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJ3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXFxuK1xcdHJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0LyogQWN0aXZhdGUgdGhlIFJNTSAqL1xcbitcXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvKTtcXG4rXFx0aWYgKCFzcm8pXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSByZXQgXFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBybWlfaW5pdF9tZXRhZGF0YSgpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIG91dF9kZWFjdGl2YXRlO1xcbitcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFxcdTAwMjZybWlfbWVtb3J5X25iKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcXG4rXFxuK1xcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xcbitcXHRwcl9pbmZvKFxcXCJSTUkgY29uZmlndXJlZFxcXFxuXFxcIik7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK291dF9kZWFjdGl2YXRlOlxcbitcXHRXQVJOX09OKHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTVxcbisgKiB3aWxsIG5vdCBzdXBwb3J0IHJlYWxtIGd1ZXN0cy4gc3Vic3lzX2luaXRjYWxsKCkgaXMgY2FsbGVkIGJlZm9yZVxcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXFxuKyAqL1xcbitzdWJzeXNfaW5pdGNhbGwoYXJtNjRfaW5pdF9ybWkpO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmQ3ZWY3ZTgyYjI0Nlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxuQEAgLTAsMCArMSw1NDAgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuXFxuKyAqL1xcbitcXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IX1xcbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnAuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rXFxuKyNkZWZpbmUgUk1JX01BWF9BRERSX0xJU1RcXHQyNTZcXG4rXFxuK3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xcbitcXHRpbnQgYWRkcl9jb3VudDtcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xcbit9O1xcbitcXG4rLypcXG4rICogcm1pX3NtY2NjX2ludm9rZTogSW52b2tlIHRoZSBSTUkgY2FsbCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGluIEByZWdzX291dFxcbisgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXFxuKyAqIEByZWdzX291dDogT3VwdHB1dCByZXN1bHRzIGZyb20gdGhlIGNhbGwuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9ICpyZWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXR1cztcXG4rXFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGFybV9zbWNjY18xXzJfaW52b2tlKFxcdTAwMjZhcmdzLCByZWdzKTtcXG4rXFx0XFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cXHUwMDNlYTApO1xcbitcXHRcXHRpZiAoc3RhdHVzICE9IFJNSV9CVVNZIFxcdTAwMjZcXHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNwdV9yZWxheCgpO1xcbitcXHR9XFxuK31cXG4rXFxuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpO1xcbitcXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcXG4raW50IHJtaV9mcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApO1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuK1xcbisvKlxcbisgKiBSZXNldHRpbmcgdGhlIGFkZHJfY291bnQgaXMgc3VmZmljaWVudCB0byBpZ25vcmUgdGhlIGFkZHJfbGlzdCBjb250ZW50cy5cXG4rICovXFxuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3Nyby1cXHUwMDNlYWRkcl9jb3VudCA9IDA7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3Nyby1cXHUwMDNlcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKXsgX19WQV9BUkdTX18gfTtcXHRcXFxcXFxuK1xcdGxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcXHRcXHRcXFxcXFxuK1xcdHJtaV9zcm9fZnJlZShfX3Nybyk7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRfX3JldDtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK30pXFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHNcXG4rICpcXHRcXHRcXHQgICAgIGZyb20gYSBnaXZlbiBub24tc2VjdXJlIHNvdXJjZSBncmFudWxlLlxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIEBkYXRhIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxcbisgKiBAc3JjOiBQQSBvZiB0aGUgc291cmNlIGdyYW51bGUgd2l0aCBjb250ZW50c1xcbisgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXFxuKyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgaXBhLCB1bnNpZ25lZCBsb25nIHNyYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGxvbmcgZmxhZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHJhbmdlIHdpdGggdW5rbm93biBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeSBhdCBhIHByb3RlY3RlZFxcbisgKlxcdFxcdFxcdCAgSVBBIHJhbmdlXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcXG4rICpcXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cyxcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MpO1xcbitcXHRyZXR1cm4gcmVncy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKlxcbisgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlLCBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGVkLCBhbGxvd2luZ1xcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxcbisgKlxcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcXG4rXFx0XFx0XFx0XFx0ICAgU01DX1JNSV9SRUFMTV9DUkVBVEUsIHJkLCBwYXJhbXMpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XFxuKyAqXFxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxcbisgKlxcbisgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHQgICBTTUNfUk1JX1JFQUxNX0RFU1RST1ksIHJkKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxcbisgKiB0byBieSBAcGFyYW1zLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQgPSAwO1xcbitcXHRzcm8tXFx1MDAzZXJlZ3MgPSAoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncykge1xcbitcXHRcXHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xcbitcXHR9O1xcbitcXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xcbitcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxcbit7XFxuK1xcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlXFxuKyAqXFxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxcbisgKlxcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsXFxuK1xcdH07XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKFxcdTAwMjZyZWdzKTtcXG4rXFx0cmV0dXJuIHJlZ3MuYTA7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcXG4rICpcXG4rICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcXG4rICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxcbitcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgaXBhLCBsb25nIGxldmVsKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfQ1JFQVRFLCByZCwgcnR0LCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcbitcXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXFxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcXG4rICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIHRvcCBJUEEgb2Ygbm9uLWxpdmUgUlRUIGVudHJpZXMsIGZyb20gZW50cnlcXG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGFuIFJUVC4gVGhlIFJUVCBtdXN0IGJlIG5vbi1saXZlLCBpLmUuIG5vbmUgb2YgdGhlIGVudHJpZXMgaW4gdGhlXFxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0XFx0ICAgbG9uZyBsZXZlbCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3J0dCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRpZiAob3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmEyO1xcbitcXG4rXFx0cmV0dXJuIFJNSV9TVUNDRVNTO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXFxuKyAqXFxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXFxuKyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXFxuK1xcdFxcdFxcdFxcdGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF9ydHQpXFxuK1xcdFxcdCpvdXRfcnR0ID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcXG4rICpcXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X21hcCgpIC0gTWFwIHVucHJvdGVjdGVkIGdyYW51bGVzIGludG8gYSByZWFsbVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiBtYXBwZWRcXG4rICpcXG4rICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0XFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxcbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxcbisgKlxcbisgKiBDb21wbGV0ZXMgYSByZXF1ZXN0IG1hZGUgYnkgdGhlIHJlYWxtIHRvIGNoYW5nZSB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBXFxuKyAqIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2VcXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxcbisgKlxcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcbitcXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XFxuK31cXG4rXFxuKyNlbmRpZlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMTRkNjIyOGRmYzIyXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxuQEAgLTAsMCArMSw0OTcgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICpcXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxcbisgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRmaWVsZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wYWdlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXFx0XFx0XFxcXFxcbitcXHRcXHRcXHQgICBBUk1fU01DQ0NfU01DXzY0LFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgKGZ1bmMpKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cXHRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTUwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTcpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTkpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YilcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWMpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjEpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjMpXFxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NClcXG4rI2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmUpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcXG4rI2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0hcXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc4KVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2IpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2YpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODUpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NilcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NylcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODgpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODkpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxOGEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThiKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDIpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjEpXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcXHRTTUNfUk1JX0NBTEwoMHgwMWYyKVxcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjMpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY1KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmIpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDApXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMilcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDgpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDkpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGMpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBkKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGUpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMClcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0R0VOTUFTSyg3LCAwKVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTS1xcdFxcdEdFTk1BU0soMTUsIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdEdFTk1BU0soOSwgOClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTS1xcdEJJVCgxMClcXG4rXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXFx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXFxuK1xcbisjZGVmaW5lIFJNSV9TVUNDRVNTXFx0XFx0XFx0MFxcbisjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVBTE1cXHRcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1JFQ1xcdFxcdFxcdDNcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUXFx0XFx0XFx0NFxcbisjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXFx0XFx0NVxcbisjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcXHRcXHQ2XFxuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcXHRcXHQ3XFxuKyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXFx0XFx0OFxcbisjZGVmaW5lIFJNSV9FUlJPUl9EUFRcXHRcXHRcXHQ5XFxuKyNkZWZpbmUgUk1JX0JVU1lcXHRcXHRcXHQxMFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcXHRcXHQxMVxcbisjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1xcdFxcdDEyXFxuKyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcXHRcXHRcXHQxM1xcbisjZGVmaW5lIFJNSV9CTE9DS0VEXFx0XFx0XFx0MTRcXG4rI2RlZmluZSBSTUlfRVJST1JfR1BUXFx0XFx0XFx0MTVcXG4rI2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVxcdFxcdDE2XFxuK1xcbisjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9OT05FXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVxcdFxcdDFcXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTFxcdFxcdDFcXG4rXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXFx0XFx0R0VOTUFTSygxOCwgMTcpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUdfTUFTS1xcdFxcdEJJVCgxNilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0tcXHRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLXFx0R0VOTUFTSygxLCAwKVxcbitcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQkxPQ0tfU0laRShyZXEpXFx0RklFTERfR0VUKFJNSV9ET05BVEVfQkxPQ0tfU0laRV9NQVNLLCByZXEpXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX09QX01FTV9OT05fQ09OVElHXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fQ09OVElHXFx0XFx0MVxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXFx0XFx0MlxcbitcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXFx0R0VOTUFTSyg2MywgNjIpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXFx0R0VOTUFTSyg1MSwgUEFHRV9TSElGVClcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXFx0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFX01BU0tcXHRHRU5NQVNLKDEsIDApXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkUocilcXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCAocikpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcXHRcXHRGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgKHIpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocilcXHRcXHQoKHIpIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFKHIpXFx0XFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIChyKSlcXG4rXFxuK2VudW0gcm1pX3JpcGFzIHtcXG4rXFx0Uk1JX0VNUFRZID0gMCxcXG4rXFx0Uk1JX1JBTSA9IDEsXFxuK1xcdFJNSV9ERVNUUk9ZRUQgPSAyLFxcbitcXHRSTUlfREVWID0gMyxcXG4rfTtcXG4rXFxuKyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFxcdDBcXG4rI2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXFx0MVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlxcdFxcdFxcdEdFTk1BU0soNDAsIDMzKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEVcXHRCSVQoMzIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRcXHRHRU5NQVNLKDMxLCAyNylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVxcdFxcdFxcdEJJVCgyNilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcXHRcXHRcXHRHRU5NQVNLKDI1LCAyMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFNcXHRcXHRcXHRHRU5NQVNLKDE5LCAxNClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTFxcdFxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXFx0XFx0XFx0QklUKDkpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyXFx0XFx0XFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXFx0XFx0XFx0R0VOTUFTSyg3LCAwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1xcdFxcdFxcdEdFTk1BU0soMTYsIDE0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlxcdFxcdFxcdEdFTk1BU0soMTMsIDEwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVJcXHRcXHRHRU5NQVNLKDksIDYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcXHRcXHRCSVQoNSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFxcdFxcdEJJVCg0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2XFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcXHRcXHRCSVQoMClcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9SRUFMTV9NQVhfVkRFVlNfT1JERVJcXHRHRU5NQVNLKDE0LCAxMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXFx0XFx0QklUKDkpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WREVWX0tST1VcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXFx0XFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVVxcdFxcdFxcdEJJVCgyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXFx0XFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVxcdFxcdFxcdEJJVCgwKVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXFx0QklUKDYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcXHRcXHRHRU5NQVNLKDUsIDQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVNcXHRHRU5NQVNLKDMsIDApXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXFx0XFx0R0VOTUFTSyg2MywgMClcXG4rXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUxcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0hcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9OT05FXFx0XFx0XFx0M1xcbitcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX05PTkVcXHRcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcXHRcXHRcXHQyXFxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVxcdFxcdFxcdDNcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfSU5URVJNRURJQVRFXFx0XFx0NFxcbitcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlxcdDBcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzE2S0JcXHQxXFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXFx0MlxcbitcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9QTEFUICAgICAgICAgICAgICAgMVVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcXG4rXFxuKy8qXFxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcXG4rICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cXG4rICovXFxuK3N0cnVjdCBybW1fY29uZmlnIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xcbitcXHRcXHRcXHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggc2l6ZXJbU1pfNEtdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcXG4rXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXFx0XFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcXHRcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXFx0XFx0R0VOTUFTSyg2LCA1KVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcXHRcXHRHRU5NQVNLKDgsIDcpXFxuK1xcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8yNTZcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XFx0XFx0XFx0MlxcbitcXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczA7XFxuK1xcdFxcdFxcdHU2NCBzMnN6O1xcbitcXHRcXHRcXHR1NjQgc3ZlX3ZsO1xcbitcXHRcXHRcXHR1NjQgbnVtX2JwcztcXG4rXFx0XFx0XFx0dTY0IG51bV93cHM7XFxuK1xcdFxcdFxcdHU2NCBwbXVfbnVtX2N0cnM7XFxuK1xcdFxcdFxcdHU2NCBoYXNoX2FsZ287XFxuK1xcdFxcdFxcdHU2NCBudW1fYXV4X3BsYW5lcztcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NDAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHJwdls2NF07XFxuK1xcdFxcdFxcdHU2NCBhdHNfcGxhbmU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxWzB4NDAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDgwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcGFkZGluZzI7XFxuK1xcdFxcdFxcdHU2NCBydHRfYmFzZTtcXG4rXFx0XFx0XFx0czY0IHJ0dF9sZXZlbF9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IHJ0dF9udW1fc3RhcnQ7XFxuK1xcdFxcdFxcdHU2NCBmbGFnczE7XFxuK1xcdFxcdFxcdHU2NCBtYXhfbnVtX3ZkZXZzO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDcwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHhmMDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzRbMHg4MF07XFxuK1xcdFxcdFxcdHU2NCBhdXhfcnR0X2Jhc2VbM107XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc1WzB4MTAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcXG4rXFxuKy8qXFxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcXG4rICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXFxuKyAqL1xcbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1xcdFxcdDhcXG4rXFxuKyNkZWZpbmUgUkVDX1BBUkFNU19GTEFHX1JVTk5BQkxFXFx0QklUKDApXFxuK1xcbitzdHJ1Y3QgcmVjX3BhcmFtcyB7XFxuK1xcdHVuaW9uIHsgLyogMHgwICovXFxuK1xcdFxcdHU2NCBmbGFncztcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHU2NCBtcGlkcjtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBwYztcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4ZDAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XFxuK1xcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cXHRCSVQoMClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXFx0QklUKDEpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXFx0QklUKDQpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUzJBUF9SRVNQT05TRVxcdEJJVCg1KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcXHRCSVQoNilcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFxcdFxcdEJJVCg3KVxcbitcXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcXHRcXHRcXHQzMVxcbitcXG4rc3RydWN0IHJlY19lbnRlciB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTY0IGZsYWdzO1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDIwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHg2MDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19lbnRlcikgPT0gU1pfMkspO1xcbitcXG4rI2RlZmluZSBSTUlfRVhJVF9TWU5DXFx0XFx0XFx0MHgwMFxcbisjZGVmaW5lIFJNSV9FWElUX0lSUVxcdFxcdFxcdDB4MDFcXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcXHRcXHRcXHQweDAyXFxuKyNkZWZpbmUgUk1JX0VYSVRfUFNDSVxcdFxcdFxcdDB4MDNcXG4rI2RlZmluZSBSTUlfRVhJVF9SSVBBU19DSEFOR0VcXHRcXHQweDA0XFxuKyNkZWZpbmUgUk1JX0VYSVRfSE9TVF9DQUxMXFx0XFx0MHgwNVxcbisjZGVmaW5lIFJNSV9FWElUX1NFUlJPUlxcdFxcdFxcdDB4MDZcXG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVxcdFxcdDB4MDdcXG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcXHQweDA4XFxuKyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORFxcdFxcdDB4MGFcXG4rXFxuK3N0cnVjdCByZWNfZXhpdCB7XFxuK1xcdHVuaW9uIHsgLyogMHgwMDAgKi9cXG4rXFx0XFx0dTggZXhpdF9yZWFzb247XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDEwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgZXNyO1xcbitcXHRcXHRcXHR1NjQgZmFyO1xcbitcXHRcXHRcXHR1NjQgaHBmYXI7XFxuK1xcdFxcdFxcdHU2NCBydHRfdHJlZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MjAwICovXFxuK1xcdFxcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XFxuK1xcdFxcdHU4IHBhZGRpbmcyWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDMwMCAqL1xcbitcXHRcXHR1OCBwYWRkaW5nM1sweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGNudHBfY3RsO1xcbitcXHRcXHRcXHR1NjQgY250cF9jdmFsO1xcbitcXHRcXHRcXHR1NjQgY250dl9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N2YWw7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmc0WzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDUwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHJpcGFzX3RvcDtcXG4rXFx0XFx0XFx0dTggcmlwYXNfdmFsdWU7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc1WzB4Zl07XFxuK1xcdFxcdFxcdHU2NCBzMmFwX2Jhc2U7XFxuK1xcdFxcdFxcdHU2NCBzMmFwX3RvcDtcXG4rXFx0XFx0XFx0dTY0IHZkZXZfaWRfMTtcXG4rXFx0XFx0XFx0dTY0IHZkZXZfaWRfMjtcXG4rXFx0XFx0XFx0dTY0IGRldl9tZW1fYmFzZTtcXG4rXFx0XFx0XFx0dTY0IGRldl9tZW1fdG9wO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9wYTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzZbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NjAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHUxNiBpbW07XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc3WzB4Nl07XFxuK1xcdFxcdFxcdHU2NCBwbGFuZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzhbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NzAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU4IHBtdV9vdmZfc3RhdHVzO1xcbitcXHRcXHRcXHR1OCBwYWRkaW5nOVsweGZdO1xcbitcXHRcXHRcXHR1NjQgdnNtbXU7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmcxMFsweDEwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcXG4rXFxuK3N0cnVjdCByZWNfcnVuIHtcXG4rXFx0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcXG4rXFx0c3RydWN0IHJlY19leGl0IGV4aXQ7XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xcbitcXG4rLyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXFx0R0VOTUFTSygxOCwgMTYpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcXHRcXHRHRU5NQVNLKDIyLCAxOSlcXG4rXFxuKy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcXHRHRU5NQVNLKDEsIDApXFxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXFx0R0VOTUFTSygxNSwgMilcXG4rXFxuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9XUklURVxcdFxcdFxcdEJJVCgwKVxcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXFx0XFx0XFx0QklUKDEpXFxuK1xcbisjZW5kaWYgLyogX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDA5OjA5OjIyLjg2Nzc2Mzg5WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxNDYwMTgwNzM1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2Y3OWQwOTQ0MTRhNmU2MzI5NmVkMzNhMzNmNmI5ZDc4MzJkYTRiY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDA5OjA5OjIxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXG5pbmRleCBiNWE1MWIwZWY5NDQwLi5mZjk1NjVkM2ZmYTU5IDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcbkBAIC0zOCw2ICszOCw3IEBAIGNvbmZpZyBBUk02NFxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HU1xuK1x0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OX09WRVJMQVBQSU5HX0FERFJFU1NfU1BBQ0VcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5pbmRleCAzMjEwMmMzOTEyZmE3Li5lOGIyOTk4M2IwMDIxIDEwMDY0NFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG4rKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbkBAIC0yOTMsNiArMjkzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIzW10gPSB7XG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWM19TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjJfU0hJRlQsIDQsIDApLFxuK1x0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX1ZJU0lCTEUsIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfRElUX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5pbmRleCBiN2NjMTFlNGZiZmE2Li42MjY2MGJmNTIwYThkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMTAsNSArMzEwLDYgQEAgc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnXCJcbitzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1wiXG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcdFx0XHRcdCs9IHNhbXN1bmcvXG4gb2JqLXlcdFx0XHRcdCs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQrPSB0ZWdyYS9cbiBvYmoteVx0XHRcdFx0Kz0geGlsaW54L1xuK29iai15XHRcdFx0XHQrPSBhcm1fcm1tL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xuQEAgLTAsMCArMSwyNiBAQFxuK1xuK2NvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuK1x0Ym9vbFxuK1xuK2NvbmZpZyBBUk1fUk1NX1JNSVxuK1x0Ym9vbCBcIlJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcIlxuK1x0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTVxuK1x0ZGVmYXVsdCB5XG4rXHRoZWxwXG4rXHQgIFN1cHBvcnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAoUk1NKSBvbiBBcm0gc3lzdGVtcyB0aGF0XG4rXHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXG4rXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXG4rXG4rXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cbitcdCAgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSxcbitcdCAgbWFuYWdlIGFuZCBydW4gcHJvdGVjdGVkIHZpcnR1YWwgbWFjaGluZXMgY2FsbGVkIFJlYWxtcy4gVGhlIFJNTSBjYW5cbitcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXG4rXHQgIFBDSSBJREUgc2V0dXAgZm9yIHNlY3VyaW5nIHRoZSBQQ0llIGxpbmtzLlxuK1xuK1x0ICBUaGlzIG9wdGlvbiBidWlsZHMgdGhlIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCB1c2VkIGJ5IEtWTSB0byBkZXRlY3QgYVxuK1x0ICBjb21wYXRpYmxlIFJNTSwgY29uZmlndXJlIGl0LCBtYW5hZ2UgZGVsZWdhdGVkIG1lbW9yeSBhbmQgZW5hYmxlXG4rXHQgIFJlYWxtIGd1ZXN0cy5cbitcbitcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XG4rXHQgIHRoZSBzeXN0ZW0gbXVzdCBhbHNvIHByb3ZpZGUgUk1FLWNhcGFibGUgaGFyZHdhcmUgYW5kIGZpcm13YXJlIHdpdGggYVxuK1x0ICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgKzEsMiBAQFxuK1xuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcdD0gcm1pLm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41ODNlMWFjYTliMTVhXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbkBAIC0wLDAgKzEsOTk5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuXG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY3B1ZmVhdHVyZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXJtaS1jbWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcdTAwM2Nhc20vbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlXG4rXG4rc3RhdGljIGJvb2wgYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbitcbisvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cbisjZGVmaW5lIFJNSV9GRUFUX1JFR19DT1VOVFx0MlxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdIF9fcm9fYWZ0ZXJfaW5pdDtcbitcbisvKipcbisgKiBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSgpIC0gRGVsZWdhdGUgZ3JhbnVsZXNcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXG4rICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4rICogQG91dF90b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG5vdCBkZWxlZ2F0ZWRcbisgKlxuKyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuKyAqIHdhcyBkZWxlZ2F0ZWQgdGhlbiBAb3V0X3RvcCA9PSBAdG9wLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXG4rICogQGJhc2U6IEJhc2UgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuKyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxuKyAqXG4rICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cbisgKiBAZW5kOiBFbmQgb2YgdGhlIFBBIHJlZ2lvblxuKyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeVxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIG1lbW9yeSByZWdpb25cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfY2F0ZWdvcnksXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZWdzLmEwICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmVncy5hMDtcbitcbitcdGlmIChvdXRfY2F0ZWdvcnkpXG4rXHRcdCpvdXRfY2F0ZWdvcnkgPSByZWdzLmExO1xuK1x0aWYgKG91dF9zdGF0ZSlcbitcdFx0Km91dF9zdGF0ZSA9IHJlZ3MuYTI7XG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmEzO1xuK1xuK1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuK31cbitcbisvKlxuKyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi5cbisgKiBAc3RhcnQ6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaFxuKyAqXHRcdHRoZSBHUFQgQG91dF9ncHRfcGFyX3N0YXRlIGlzIHZhbGlkXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW3N0YXJ0LCBvdXRfdG9wKVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3B0X2luZm8odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsXG4rXHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX0dQVF9JTkZPLCBzdGFydCwgZW5kLFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4rXHRpZiAocmVncy5hMCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0cmV0dXJuIHJlZ3MuYTA7XG4rXG4rXHRpZiAob3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0aWYgKG91dF9ncHRfcGFyX3N0YXRlKVxuK1x0XHQqb3V0X2dwdF9wYXJfc3RhdGUgPSByZWdzLmEyO1xuK1xuK1x0cmV0dXJuIFJNSV9TVUNDRVNTO1xuK31cbitcbisvKipcbisgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlclxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxuKyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9IHtcbitcdFx0U01DX1JNSV9GRUFUVVJFUywgaW5kZXhcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNmFyZ3MpO1xuK1x0aWYgKGFyZ3MuYTAgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dClcbitcdFx0Km91dCA9IGFyZ3MuYTE7XG4rXG4rXHRyZXR1cm4gYXJncy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JtbV9jb25maWdfc2V0KCkgLSBDb25maWd1cmUgdGhlIFJNTVxuKyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4rICpcbisgKiBTZXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgUk1NLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncyk7XG4rXG4rXHRyZXR1cm4gcmVncy5hMDtcbit9XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpbmRleClcbit7XG4rXHRpZiAoV0FSTl9PTihpbmRleCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpbmRleF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0XHQvKiBCdWdneSBSTU0gPyBMZXQgdGhlIGNhbGxlciBsZWFrIHRoZSBwYWdlcyAqL1xuK1x0XHRcdGlmIChXQVJOX09OKG91dF90b3AgXHUwMDNjPSBwaHlzKSlcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdCAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXG4re1xuK1x0bG9uZyByZXQgPSAwO1xuK1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcbitcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcbitcbitcdHdoaWxlIChwaHlzIFx1MDAzYyB0b3ApIHtcbitcdFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbitcbitcdFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuK1x0XHRcdC8qIEJ1Z2d5IFJNTSA/ICovXG4rXHRcdFx0aWYgKFdBUk5fT04ob3V0X3RvcCBcdTAwM2M9IHBoeXMpKSB7XG4rXHRcdFx0XHRybWlfdW5kZWxlZ2F0ZV9yYW5nZSh0b3AgLSBzaXplLCBzaXplKTtcbitcdFx0XHRcdHJldHVybiAtRU5YSU87XG4rXHRcdFx0fVxuK1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAob3V0X3BoeXMpXG4rXHRcdCpvdXRfcGh5cyA9IHBoeXM7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZGVsZWdhdGVfcmFuZ2UpO1xuK1xuKy8qXG4rICogQ29udmVydCB0aGUgUm1pQWRkckJsb2NrU2l6ZSB0byBhY3R1YWwgc2l6ZS4gVGhpcyBpcyB1c2VkIGluIFJtaURvbmF0ZVJlcVxuKyAqIGFuZCBSbWlBZGRyUmFuZ2VEZXNjKi5cbisgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyBybWlfYWRkcl9ibG9ja19zaXplX3RvX2J5dGVzKHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZV9mbGQpXG4re1xuK1x0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSBibG9ja19zaXplX2ZsZCkpO1xuK31cbitcbisvKlxuKyAqIGZyZWVfYWRkcl9yYW5nZTogRnJlZSBtZW1vcnkgZGVzY3JpYmVkIGJ5IHRoZSBhZGRyZXNzIHJhbmdlIGVudHJ5LCB3aGljaCBtYXlcbisgKlx0XHQgICAgYmUgcGFydGlhbGx5IGNvbnN1bWVkIGJ5IFJNTS5cbisgKlxuKyAqIEBlbnRyeTogUk1JX0FERFJfUkFOR0UgZGVzY3JpcHRvclxuKyAqIEBjb25zdW1lZF9zaXplOiBQYWdlIGFsaWduZWQgc2l6ZSBjb25zdW1lZCBieSB0aGUgUk1NIGZyb20gdGhlIGFkZHJlc3MgcmFuZ2UuXG4rICpcbisgKiBJZiB0aGUgc3RhdGUgb2YgdGhlIGFkZHJlc3MgaXMgREVMRUdBVEVELCB1bmRlbGVnYXRlIGl0IGJhY2ssIGJlZm9yZSBmcmVlaW5nLlxuKyAqIExlYWtzIHRoZSBtZW1vcnkgaWYgd2UgY2Fubm90IHVuZGVsZWdhdGUgdGhlIHJhbmdlLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGZyZWVfYWRkcl9yYW5nZSh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3NpemUpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBwaHlzID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGJsb2NrX3NpemVfZmxkID0gUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJtaV9hZGRyX2Jsb2NrX3NpemVfdG9fYnl0ZXMoYmxvY2tfc2l6ZV9mbGQpICogY291bnQ7XG4rXG4rXHRXQVJOX09OKCFQQUdFX0FMSUdORUQocGh5cykgfHwgIVBBR0VfQUxJR05FRChjb25zdW1lZF9zaXplKSk7XG4rXG4rXHQvKiBBZGp1c3QgdGhlIGFkZHJlc3MgYW5kIHNpemUgZm9yIHBhcnRpYWxseSBjb25zdW1lZCBlbnRyeSAqL1xuK1x0cGh5cyArPSBjb25zdW1lZF9zaXplO1xuK1x0c2l6ZSAtPSBjb25zdW1lZF9zaXplO1xuK1x0LypcbitcdCAqIFVuZGVsZWdhdGUgdGhlIHBhZ2VzIGJhY2sgaWYgcmVxdWlyZWQuIElmIHdlIGNhbid0XG4rXHQgKiBjaGFuZ2UgdGhlbSBiYWNrLCBsZWFrIHRoZSBwYWdlcy5cbitcdCAqL1xuK1x0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEIFx1MDAyNlx1MDAyNlxuK1x0ICAgIFdBUk5fT04ocm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSkpKVxuK1x0XHRyZXR1cm47XG4rXHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChwaHlzKSwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4rXHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0Km91dF9yZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXG4rXHR9O1xuK1xuK1x0LypcbitcdCAqIFRoZSBvdXRwdXQgZG9uYXRlZCBjb3VudCAoYTEpIGlzIGFsd2F5cyB2YWxpZCwgaXJyZXNwZWN0aXZlXG4rXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcbitcdCAqL1xuK1x0cm1pX3NtY2NjX2ludm9rZShvdXRfcmVncyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fcmVjbGFpbSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdCpvdXRfcmVncyA9IChzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzKSB7XG4rXHRcdFNNQ19STUlfT1BfTUVNX1JFQ0xBSU0sIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudFxuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2Uob3V0X3JlZ3MpO1xuK31cbitcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBjb3VudClcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4rXHRcdHJldHVybiAtRU9WRVJGTE9XO1xuK1xuK1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuK1x0XHRyZXR1cm4gLUVOT1NQQztcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbitcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbitcdFx0XHRcdCBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJsb2NrX3NpemUgKiBjb3VudDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcztcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplO1xuK1x0aW50IHJldDtcbitcdHZvaWQgKnZpcnQ7XG4rXHRwaHlzX2FkZHJfdCBwaHlzO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBjb250aWd1b3VzIGFsbG9jYXRpb25zIGFyZSBhbHdheXMgYVxuK1x0ICogcG93ZXIgb2YgMlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFpc19wb3dlcl9vZl8yKHNpemUpKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBSZXVzZSB0aGUgY2FjaGVkIGFkZHJlc3MgcmFuZ2UgaWYgd2UgaGF2ZSBvbmUgKi9cbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShlbnRyeSkgPT0gYmxvY2tfc2l6ZV9mbGQgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuK1x0XHRcdHNyby1cdTAwM2VhZGRyX2NvdW50LS07XG4rXHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSxcbitcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuK1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBnZnApO1xuK1x0aWYgKCF2aXJ0KVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4rXG4rXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbitcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuK1x0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCBzaXplKTtcbitcdFx0XHRyZXR1cm4gLUVOWElPO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgYmxvY2tfc2l6ZV9mbGQpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIGNvdW50KTtcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XG4rXG4rb3V0OlxuK1x0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcbitcdFx0XHQgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksIDEsXG4rXHRcdFx0ICAwLCBvdXRfcmVncyk7XG4rXHRkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4rXG4rXHRpZiAoV0FSTl9PTihkb25hdGVkX2dyYW51bGVzIFx1MDAzZSAoc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkpKVxuK1x0XHRkb25hdGVkX2dyYW51bGVzID0gKHNpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuK1xuK1x0ZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdC8qIEFsbCBncmFudWxlcyBjb25zdW1lZCBieSB0aGUgUk1NICovXG4rXHRpZiAoZG9uYXRlZF9zaXplID09IHNpemUpXG4rXHRcdHJldHVybiAwO1xuK1x0LyogTm8gZ3JhbnVsZXMgd2VyZSBjb25zdW1lZCBieSB0aGUgUk1NLCBjYWNoZSB0aGVtICovXG4rXHRpZiAoZG9uYXRlZF9ncmFudWxlcyA9PSAwKSB7XG4rXHRcdHNyby1cdTAwM2VhZGRyX2NvdW50Kys7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogVGhlIGdyYW51bGVzIHdlcmUgcGFydGlhbGx5IGNvbnN1bWVkLCByZWNsYWltIHRoZSB1bnVzZWQgb25lcy4gKi9cbitcdGZyZWVfYWRkcl9yYW5nZShzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSwgZG9uYXRlZF9zaXplKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbitcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbitcdFx0XHRcdCAgICBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplX2ZsZCA9IFJNSV9ET05BVEVfQkxPQ0tfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gcm1pX2FkZHJfYmxvY2tfc2l6ZV90b19ieXRlcyhibG9ja19zaXplX2ZsZCk7XG4rXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgZm91bmQgPSAwO1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzO1xuK1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfYmxvY2sgPSBibG9ja19zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dW5zaWduZWQgbG9uZyBjb25zdW1lZF9ibG9ja3M7XG4rXHRpbnQgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXG4rXHRcdGlmIChSTUlfQUREUl9SQU5HRV9CTE9DS19TSVpFKGVudHJ5KSA9PSBibG9ja19zaXplX2ZsZCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KSA9PSAxIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4rXHRcdFx0YWRkcl9saXN0X3N0YXJ0LS07XG4rXHRcdFx0c3dhcChzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0sXG4rXHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbitcdFx0XHRmb3VuZCsrO1xuK1x0XHRcdGktLTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTtcbitcdFx0dm9pZCAqdmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KGJsb2NrX3NpemUsIGdmcCk7XG4rXHRcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRcdGlmICghdmlydClcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBibG9ja19zaXplLFxuK1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4rXHRcdFx0XHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXG4rXHRcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgYmxvY2tfc2l6ZSk7XG4rXHRcdFx0XHRyZXR1cm4gLUVOWElPO1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1x0XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBibG9ja19zaXplX2ZsZCk7XG4rXHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCsrXSA9IGFkZHJfcmFuZ2U7XG4rXHRcdGZvdW5kKys7XG4rXHR9XG4rXG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4rXHRcdFx0ICBjb3VudCwgMCwgb3V0X3JlZ3MpO1xuK1xuK1x0ZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuK1x0ICoganVzdCBpbiBjYXNlLlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX2Jsb2NrKSlcbitcdFx0ZG9uYXRlZF9ncmFudWxlcyA9IGNvdW50ICogZ3JhbnVsZXNfcGVyX2Jsb2NrO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbitcdCAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIGJsb2NrLXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuK1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIGJsb2Nrcy5cbitcdCAqL1xuK1x0Y29uc3VtZWRfYmxvY2tzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl9ibG9jaztcbitcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSB7XG4rXHRcdC8qXG4rXHRcdCAqIEEgYmxvY2sgaGFzIGJlZW4gcGFydGlhbGx5IGNvbnN1bWVkLCB0aGUgc3RhcnQgaXMgb3duZWQgYnlcbitcdFx0ICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3RcbitcdFx0ICovXG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPVxuK1x0XHRcdHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgY29uc3VtZWRfYmxvY2tzXTtcbitcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuK1x0XHRcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX2Jsb2NrKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcbitcdFx0ZnJlZV9hZGRyX3JhbmdlKGVudHJ5LCBkb25hdGVkX3NpemUpO1xuK1x0XHQvKlxuK1x0XHQgKiBUaGlzIGJsb2NrIGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4rXHRcdCAqIGZyZWVkKVxuK1x0XHQgKi9cbitcdFx0Y29uc3VtZWRfYmxvY2tzKys7XG4rXHR9XG4rXG4rXHQvKiBLZWVwIGp1c3QgdGhlIGJsb2NrcyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXG4rXHRmb3IgKGludCBpID0gY29uc3VtZWRfYmxvY2tzOyBpIFx1MDAzYyBjb3VudDsgaSsrKVxuK1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGkgLSBjb25zdW1lZF9ibG9ja3NdID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfYmxvY2tzO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyxcbitcdFx0XHQgIGdmcF90IGdmcClcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSkpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpID09IFJNSV9PUF9NRU1fQ09OVElHKSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdCAgICAgcmVncywgZ2ZwKTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4rXHRcdFx0XHRcdFx0cmVncywgZ2ZwKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX3JlY2xhaW0oc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0ICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbitcbitcdGlmIChybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpKVxuK1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbitcbitcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuK1x0XHRcdCAgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksXG4rXHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbitcbitcdC8qXG4rXHQgICogUk1JX09QX01FTV9SRUNMQUlNIGFsd2F5cyByZXR1cm4gUk1JX0lOQ09NUExFVEUsIGV4Y2VwdCB3aGVuIHRoZVxuK1x0ICAqIGlucHV0IHBhcmFtZXRlcnMgd2VyZSBpbnZhbGlkLlxuK1x0ICAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhvdXRfcmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXHUwMDNlYTEgXHUwMDNlIGNhcGFjaXR5KSlcbitcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVx1MDAzZWExO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0LyogSGFuZGxlIHRoZSB3b3JzZSAqL1xuK1x0aWYgKFdBUk5fT04oc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNjIDApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRpZiAoV0FSTl9PTihzcm8tXHUwMDNlYWRkcl9jb3VudCBcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QpKVxuK1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IFJNSV9NQVhfQUREUl9MSVNUO1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpKyspXG4rXHRcdGZyZWVfYWRkcl9yYW5nZShzcm8tXHUwMDNlYWRkcl9saXN0W2ldLCAwKTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcbitcbitsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzID0gXHUwMDI2c3JvLVx1MDAzZXJlZ3M7XG4rXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShyZWdzKTtcbitcbitcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuK1x0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApID09IFJNSV9JTkNPTVBMRVRFKSB7XG4rXHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKSA9PSBSTUlfT1BfQ0FOX0NBTkNFTDtcbitcdFx0aW50IHJldCA9IDA7XG4rXG4rXHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9OT05FOlxuK1x0XHRcdHJtaV9vcF9jb250aW51ZShzcm9faGFuZGxlLCBSTUlfQ09OVElOVUVfS0VFUF9HT0lORyxcbitcdFx0XHRcdFx0cmVncyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfRE9OQVRFOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbitcdFx0XHRcdFx0ICAgICBnZnApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4rXHRcdFx0cmV0ID0gcm1pX3Nyb19yZWNsYWltKHNybywgc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0cmV0ID0gV0FSTl9PTl9PTkNFKDEpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIEFsbCBtZW1vcnkgZG9uYXRpbmcgU1JPcyBtdXN0IGJlIGNhbmNlbGxhYmxlLiBTbyBhXG4rXHRcdFx0ICogZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbiBzaG91bGRuJ3QgYmUgYW4gaXNzdWUuXG4rXHRcdFx0ICogSG93ZXZlciwgaWYgd2UgZW5jb3VudGVyIGEgcmFuZG9tIGZhaWx1cmUgKGUuZy4sXG4rXHRcdFx0ICogYnVnZ3kgUk1NKSwgZG9uJ3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogSWYgd2UgaGF2ZSBhbHJlYWR5IGNhbmNlbGxlZCwgYW5kIGNhbWUgYmFjayBoZXJlIGR1ZVxuK1x0XHRcdCAqIHRvIGFuIGVycm9yIGluIE1FTVJFUSwgdGhlbiB0aGVyZSBpcyBubyBwb2ludFxuK1x0XHRcdCAqIGluIGdvaW5nIGluIGxvb3BzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoY2FuY2VsbGVkKSlcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbitcbitcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXHUwMDNlYTApICE9IFJNSV9JTkNPTVBMRVRFKSlcbitcdFx0XHRcdHJldHVybiByZXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChjYW5jZWxsZWQpXG4rXHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbitcbisvKiBGb3IgUk1JIGNvbW1hbmRzIHRoYXQgYXJlIHN0YXRlZnVsIGJ1dCBub3QgbWVtb3J5LXRyYW5zZmVycmluZyAqL1xuK2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4re1xuK1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKHJlZ3MpO1xuK1xuK1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbitcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApID09IFJNSV9PUF9DQU5fQ0FOQ0VMO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4rXHRcdFx0XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbitcdFx0XHQvKiBJZiB3ZSBoYXZlIGFscmVhZHkgY2FuY2VsbGVkLCBkb24ndCByZXRyeSB0aGlzICovXG4rXHRcdFx0aWYgKGNhbmNlbGxlZClcbitcdFx0XHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKGNhbmNlbGxlZClcbitcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4rXG4rXHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTtcbitcbitzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXG4re1xuK1x0dW5zaWduZWQgc2hvcnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjtcbitcdHVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0XHRcdFx0XHQgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHR1bnNpZ25lZCBsb25nIGFhNjRwZnIwID0gcmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKTtcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVzID0ge1xuK1x0XHRTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbixcbitcdH07XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVzKTtcbitcdGlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpXG4rXHRcdHJldHVybiAtRU5YSU87XG4rXG4rXHR2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpO1xuK1x0dmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTtcbitcbitcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0dW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7XG4rXG4rXHRcdGhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTtcbitcdFx0aGlnaF92ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTIpO1xuK1xuK1x0XHRwcl9lcnIoXCJVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXFxuXCIsXG4rXHRcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxuK1x0XHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0XHRyZXR1cm4gLUVOWElPO1xuK1x0fVxuK1xuK1x0cHJfaW5mbyhcIlJNSSBBQkkgdmVyc2lvbiAlZC4lZFxcblwiLCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpXG4re1xuK1x0LypcbitcdCAqIFNpbmNlIHdlJ3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcbitcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXG4rXHQgKi9cbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkrKykge1xuK1x0XHRpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfc2l6ZTtcbitcdGludCByZXQgPSAwO1xuK1x0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcbitcbitcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XG4rXHRjYXNlIFNaXzRLOlxuK1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzRLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl8xNks6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xuK1x0XHRicmVhaztcbitcdGNhc2UgU1pfNjRLOlxuK1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XG4rXHRcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRCVUlMRF9CVUcoKTtcbitcdH1cbitcbitcdGlmICghKHJtaV9mZWF0X3JlZygxKSBcdTAwMjYgZ3JhbnVsZV9mZWF0dXJlKSkge1xuK1x0XHRwcl9lcnIoXCJSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcblwiLFxuK1x0XHQgICAgICAgUEFHRV9TSVpFIFx1MDAzZVx1MDAzZSAxMCk7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWNvbmZpZykge1xuK1x0XHRwcl9lcnIoXCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSTU0gY29uZmlnXFxuXCIpO1xuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdH1cbitcbitcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gZ3JhbnVsZV9zaXplO1xuK1xuK1x0LypcbitcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxuK1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbitcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuK1x0ICogUEFHRV9TSVpFU1xuK1x0ICovXG4rXHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuK1xuK1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkICglZClcXG5cIiwgcmV0KTtcbitcdFx0cmV0ID0gLUVJTlZBTDtcbitcdH1cbitcbitcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLypcbisgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbit7XG4rXHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuK1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoc3RhcnQsIGVuZCwgXHUwMDI2Y2F0ZWdvcnksIFx1MDAyNnN0YXRlLCBcdTAwMjZuZXh0KTtcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4rXHRcdCAgICBjYXRlZ29yeSAhPSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTCkge1xuK1x0XHRcdC8qIFRPRE86IFNldCBncmFudWxlIHRyYWNraW5nIGluIHRoaXMgY2FzZSAqL1xuK1x0XHRcdHByX2VycihcIkdyYW51bGUgdHJhY2tpbmcgZm9yIHJlZ2lvbiBpc24ndCBmaW5lL2NvbnZlbnRpb25hbDogJWxseC0lbHhcXG5cIixcbitcdFx0XHQgICAgICAgc3RhcnQsIG5leHQpO1xuK1x0XHRcdHJldHVybiAtRU5PREVWO1xuK1x0XHR9XG4rXHRcdHN0YXJ0ID0gbmV4dDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNyZWF0aW5nIEwxIEdQVHMgeWV0LiBTbywgbWFrZSBzdXJlIHRoYXRcbisgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuKyAqL1xuK3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbDBncHRfc3o7XG4rXHR1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTtcbitcbitcdGwwZ3B0X3N6ID0gMVVMIFx1MDAzY1x1MDAzYyAoMzAgKyBGSUVMRF9HRVQoUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaLFxuK1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuK1x0c3RhcnQgPSBBTElHTl9ET1dOKHN0YXJ0LCBsMGdwdF9zeik7XG4rXHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcbitcbitcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4rXHRcdGxvbmcgcmV0ID0gcm1pX2dwdF9pbmZvKHN0YXJ0LCBlbmQsIFx1MDAyNm5leHQsIFx1MDAyNnBhcl9zdGF0ZSk7XG4rXG4rXHRcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRcdGlmIChwYXJfc3RhdGUgIT0gUk1JX0dQVF9QQVJfUExBVCkge1xuK1x0XHRcdHByX2VycihcIkdQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwiLFxuK1x0XHRcdFx0c3RhcnQsIG5leHQpO1xuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1x0XHR9XG4rXHRcdHN0YXJ0ID0gbmV4dDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXR1cm4gcm1pX3ZlcmlmeV9ncHRfZmlybXdhcmVfbWFuYWdlZChzdGFydCwgZW5kKTtcbit9XG4rXG4rc3RhdGljIGludCBybWlfaW5pdF9tZXRhZGF0YSh2b2lkKVxuK3tcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyO1xuK1xuK1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4rXHRcdGludCByZXQ7XG4rXG4rXHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuK1x0XHRpZiAobWVtYmxvY2tfaXNfbm9tYXAocikpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdHN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0XHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpXG4re1xuK1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4rXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xuK1x0aW50IHJldDtcbitcbitcdGlmIChhY3Rpb24gIT0gTUVNX0dPSU5HX09OTElORSlcbitcdFx0cmV0dXJuIE5PVElGWV9ET05FO1xuK1xuK1x0c3RhcnQgPSBQRk5fUEhZUyhhcmctXHUwMDNlc3RhcnRfcGZuKTtcbitcdGVuZCA9IFBGTl9QSFlTKGFyZy1cdTAwM2VzdGFydF9wZm4gKyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuK1x0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuK1xuK1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuK1x0Lm5vdGlmaWVyX2NhbGwgPSBybWlfbWVtb3J5X25vdGlmaWVyLFxuK307XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGlzX3JtaV9hdmFpbGFibGUpO1xuK1xuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXG4re1xuK1x0aW50IHJldDtcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4rXG4rXHQvKiBDb250aW51ZSB3aXRob3V0IHJlYWxtIHN1cHBvcnQgaWYgd2UgY2FuJ3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4rXHRyZXQgPSBybWlfY2hlY2tfdmVyc2lvbigpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9yZWFkX2ZlYXR1cmVzKCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIEFjdGl2YXRlIHRoZSBSTU0gKi9cbitcdHNybyA9IGttYWxsb2Nfb2JqKCpzcm8pO1xuK1x0aWYgKCFzcm8pXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0FDVElWQVRFKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcblwiKTtcbitcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuK1x0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XG4rXG4rXHRyZXQgPSByZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoXHUwMDI2cm1pX21lbW9yeV9uYik7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuK1xuK1x0YXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7XG4rXHRwcl9pbmZvKFwiUk1JIGNvbmZpZ3VyZWRcXG5cIik7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitvdXRfZGVhY3RpdmF0ZTpcbitcdFdBUk5fT04ocm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmZkN2VmN2U4MmIyNDZcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgKzEsNTQwIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rXG4rI2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4rXG4rc3RydWN0IHJtaV9zcm9fc3RhdGUge1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuK1x0aW50IGFkZHJfY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XG4rfTtcbitcbisvKlxuKyAqIHJtaV9zbWNjY19pbnZva2U6IEludm9rZSB0aGUgUk1JIGNhbGwgYW5kIHJldHVybiB0aGUgcmVzdWx0cyBpbiBAcmVnc19vdXRcbisgKiBAcmVnc19pbjogUmVnaXN0ZXJzIHdpdGggdGhlIGFyZ3VtZW50cyBmaWxsZWQgaW4uXG4rICogQHJlZ3Nfb3V0OiBPdXB0cHV0IHJlc3VsdHMgZnJvbSB0aGUgY2FsbC5cbisgKi9cbitzdGF0aWMgaW5saW5lIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgYXJncyA9ICpyZWdzO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZhcmdzLCByZWdzKTtcbitcdFx0c3RhdHVzID0gUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCk7XG4rXHRcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXHUwMDI2XHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcbitcdFx0XHRicmVhaztcbitcdFx0Y3B1X3JlbGF4KCk7XG4rXHR9XG4rfVxuK1xuK3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaW5kZXgpO1xuK1xuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcbitpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTtcbitpbnQgcm1pX2ZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7XG4rXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcbit9XG4rXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xuK1xuK2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcbitsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKTtcbitcbisvKlxuKyAqIFJlc2V0dGluZyB0aGUgYWRkcl9jb3VudCBpcyBzdWZmaWNpZW50IHRvIGlnbm9yZSB0aGUgYWRkcl9saXN0IGNvbnRlbnRzLlxuKyAqL1xuKyNkZWZpbmUgcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIGdmcCwgLi4uKSAoe1x0XHRcdFx0XFxcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1x0XHRcdFx0XFxcbitcdF9fc3JvLVx1MDAzZWFkZHJfY291bnQgPSAwO1x0XHRcdFx0XHRcdFxcXG4rXHRfX3Nyby1cdTAwM2VyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpeyBfX1ZBX0FSR1NfXyB9O1x0XFxcbitcdGxvbmcgX19yZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShfX3NybywgZ2ZwKTtcdFx0XFxcbitcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbitcdF9fcmV0O1x0XHRcdFx0XHRcdFx0XHRcXFxuK30pXG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBtYXBwaW5nIGF0IHByb3RlY3RlZCBJUEEsIGNvcHlpbmcgY29udGVudHNcbisgKlx0XHRcdCAgICAgZnJvbSBhIGdpdmVuIG5vbi1zZWN1cmUgc291cmNlIGdyYW51bGUuXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcbisgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgQGRhdGEgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlIHdpdGggY29udGVudHNcbisgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxuKyAqXG4rICogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIFByb3RlY3RlZCBJUEEgc3BhY2UgdG8gY29udmVudGlvbmFsIG1lbW9yeSwgY29weWluZ1xuKyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBmbGFncylcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbitcdH07XG4rXG4rXHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfbWFwKCkgLSBDcmVhdGUgbWFwcGluZ3MgaW4gcHJvdGVjdGVkIElQQSByYW5nZSB3aXRoIHVua25vd24gY29udGVudHNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIGFkZHJlc3Mgb2YgcmFuZ2Ugd2hpY2ggd2FzIHByb2Nlc3NlZC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9kYXRhX3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3MgdG8gY29udmVudGlvbmFsIG1lbW9yeSBhdCBhIHByb3RlY3RlZFxuKyAqXHRcdFx0ICBJUEEgcmFuZ2VcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4rXHRcdGlmIChvdXRfdG9wKVxuK1x0XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcdFx0aWYgKG91dF9yYW5nZSlcbitcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbitcdFx0aWYgKG91dF9jb3VudClcbitcdFx0XHQqb3V0X2NvdW50ID0gcmVncy5hMztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9wc2NpX2NvbXBsZXRlKCkgLSBDb21wbGV0ZSBwZW5kaW5nIFBTQ0kgY29tbWFuZFxuKyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcbisgKlxuKyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsXG4rXHR9O1xuK1xuK1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzKTtcbitcdHJldHVybiByZWdzLmEwO1xuK31cbitcbisvKipcbisgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2YXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSwgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlZCwgYWxsb3dpbmdcbisgKiBleGVjdXRpb24gb2YgdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JFQUxNX0FDVElWQVRFLCByZCxcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuK1x0cmV0dXJuIHJlZ3MuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0XG4rICpcbisgKiBDcmVhdGUgYSBuZXcgcmVhbG0gdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX3Rlcm1pbmF0ZSgpIC0gVGVybWluYXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxuKyAqXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dFxuKyAqXG4rICogRGVzdHJveXMgYSByZWFsbSwgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSByZWFsbSBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgUkVDXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBwYXJhbXM6IFBBIG9mIFJFQyBwYXJhbWV0ZXJzXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIENyZWF0ZSBhIFJFQyB1c2luZyB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdCByZWNfcGFyYW1zIHBvaW50ZWRcbisgKiB0byBieSBAcGFyYW1zLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbitcdFx0XHRcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRsb25nIHJldDtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbitcdHNyby1cdTAwM2VyZWdzID0gKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MpIHtcbitcdFx0U01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXNcbitcdH07XG4rXHRyZXQgPSBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzcm8sIEdGUF9LRVJORUwpO1xuK1x0cm1pX3Nyb19mcmVlKHNybyk7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcbitcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JFQ19ERVNUUk9ZLCByZWMpO1xuK31cbitcbisvKipcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHJ1bl9wdHI6IFBBIG9mIFJlY1J1biBzdHJ1Y3R1cmVcbisgKlxuKyAqIFN0YXJ0cyAob3IgY29udGludWVzKSBleGVjdXRpb24gd2l0aGluIGEgUkVDLlxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19lbnRlcih1bnNpZ25lZCBsb25nIHJlYywgdW5zaWduZWQgbG9uZyBydW5fcHRyKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0cixcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MpO1xuK1x0cmV0dXJuIHJlZ3MuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgIGxvbmcgbGV2ZWwsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKG91dF9ydHQpXG4rXHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbitcdGlmIChvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTI7XG4rXG4rXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXG4rICpcbisgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJ2hvbW9nZW5lb3VzJyB0aGUgUlRUIGNhbiBiZVxuKyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9GT0xELCByZCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3J0dClcbitcdFx0Km91dF9ydHQgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9pbml0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIG5ldyByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAb3V0X3RvcDogVG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWRcbisgKlxuKyAqIFNldHMgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQSByYW5nZSB0byBSQU0sIGZvciBhIHJlYWxtIGluIHRoZSBORVcgc3RhdGUuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9pbml0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxuKyAqXG4rICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEByZWM6IFBBIG9mIHRoZSBSRUMgbWFraW5nIHRoZSByZXF1ZXN0XG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAdG9wOiBUb3Agb2YgdGFyZ2V0IElQQSByZWdpb25cbisgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0b3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogQ29tcGxldGVzIGEgcmVxdWVzdCBtYWRlIGJ5IHRoZSByZWFsbSB0byBjaGFuZ2UgdGhlIFJJUEFTIG9mIGEgdGFyZ2V0IElQQVxuKyAqIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfU0VUX1JJUEFTLCByZCwgcmVjLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4rICogQGZsYWdzOiBGbGFnc1xuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGZsYWdzLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcdGlmIChvdXRfcmFuZ2UpXG4rXHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuK1x0aWYgKG91dF9jb3VudClcbitcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4rXG4rXHRyZXR1cm4gUk1JX1NVQ0NFU1M7XG4rfVxuK1xuKyNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oIGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4yMTRkNjIyOGRmYzIyXG4tLS0gL2Rldi9udWxsXG4rKysgYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxuQEAgLTAsMCArMSw0OTcgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbisgKlxuKyAqIFRoZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIGFyZSBmcm9tIHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3JcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuKyAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vZG9jdW1lbnRhdGlvbi9kZW4wMTM3LzItMGJldDMvXG4rICovXG4rXG4rI2lmbmRlZiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0ZmllbGQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2l6ZXMuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFx1MDAzY2FzbS9wYWdlLmhcdTAwM2VcbitcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbitcdEFSTV9TTUNDQ19DQUxMX1ZBTChBUk1fU01DQ0NfRkFTVF9DQUxMLFx0XHRcXFxuK1x0XHRcdCAgIEFSTV9TTUNDQ19TTUNfNjQsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbitcdFx0XHQgICAoZnVuYykpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXHRcdFNNQ19STUlfQ0FMTCgweDAxNTMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1NylcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OClcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVhKVxuKyNkZWZpbmUgU01DX1JNSV9SRUNfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWIpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTVkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9SRUFEX0VOVFJZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2MSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NClcbisjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY1KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OClcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmEpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmUpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRllcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcbisjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzQpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXHRcdFNNQ19STUlfQ0FMTCgweDAxN2EpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RPUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2MpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZilcbitcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE4NilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg3KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODkpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbitcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVFx0U01DX1JNSV9DQUxMKDB4MDFkMClcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDIpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQzKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkNilcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0NSRUFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWRiKVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRkKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGUpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZTApXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTEpXG4rXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfU0VUXHRcdFNNQ19STUlfQ0FMTCgweDAxZTMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbitcbisjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZWUpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcdFx0U01DX1JNSV9DQUxMKDB4MDFmMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYxKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWYzKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNilcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FSQ0hfREVWX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY5KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmMpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZmKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAwKVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAyKVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DT05USU5VRVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDMpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA2KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDgpXG4rI2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOSlcbisjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYylcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBlKVxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbisjZGVmaW5lIFNNQ19STUlfR1BUX0lORk9cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjExKVxuK1xuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4rI2RlZmluZSBSTUlfQUJJX01JTk9SX1ZFUlNJT05cdDBcbitcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHZlcnNpb24pICgodmVyc2lvbikgXHUwMDI2IDB4RkZGRilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTihtYWpvciwgbWlub3IpICAgICAgKCgobWFqb3IpIFx1MDAzY1x1MDAzYyAxNikgfCAobWlub3IpKVxuK1xuKyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTS1x0XHRHRU5NQVNLKDcsIDApXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0R0VOTUFTSygxNSwgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0R0VOTUFTSyg5LCA4KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0tcdEJJVCgxMClcbitcbisjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcbisjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVgocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmV0KVx0RklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpXG4rXG4rI2RlZmluZSBSTUlfU1VDQ0VTU1x0XHRcdDBcbisjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVFx0XHRcdDFcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVx0XHRcdDJcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUNcdFx0XHQzXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUXHRcdFx0NFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcdFx0NVxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVx0XHQ2XG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFx0XHQ3XG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcdFx0OFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFx0XHRcdDlcbisjZGVmaW5lIFJNSV9CVVNZXHRcdFx0MTBcbisjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcdFx0MTFcbisjZGVmaW5lIFJNSV9FUlJPUl9UUkFDS0lOR1x0XHQxMlxuKyNkZWZpbmUgUk1JX0lOQ09NUExFVEVcdFx0XHQxM1xuKyNkZWZpbmUgUk1JX0JMT0NLRURcdFx0XHQxNFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dQVFx0XHRcdDE1XG4rI2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRVx0XHQxNlxuK1xuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcdFx0MFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcdFx0MVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORVx0XHQwXG4rI2RlZmluZSBSTUlfT1BfTUVNX1JFUV9ET05BVEVcdFx0MVxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfUkVDTEFJTVx0XHQyXG4rXG4rI2RlZmluZSBSTUlfT1BfQ0FOTk9UX0NBTkNFTFx0XHQwXG4rI2RlZmluZSBSTUlfT1BfQ0FOX0NBTkNFTFx0XHQxXG4rXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0tcdFx0R0VOTUFTSygxOCwgMTcpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXHRcdEJJVCgxNilcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTS1x0XHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbitcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEUocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9CTE9DS19TSVpFKHJlcSlcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0JMT0NLX1NJWkVfTUFTSywgcmVxKVxuK1xuKyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRFx0XHQxXG4rI2RlZmluZSBSTUlfT1BfTUVNX0NPTkRJVElPTkFMXHRcdDJcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fTk9OX0NPTlRJR1x0XHQwXG4rI2RlZmluZSBSTUlfT1BfTUVNX0NPTlRJR1x0XHQxXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0tcdEdFTk1BU0soNjMsIDYyKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLXHRHRU5NQVNLKDUxLCBQQUdFX1NISUZUKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuK1xuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQkxPQ0tfU0laRShyKVx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0JMT0NLX1NJWkVfTUFTSywgKHIpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIChyKSlcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIocilcdFx0KChyKSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUocilcdFx0RklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIChyKSlcbitcbitlbnVtIHJtaV9yaXBhcyB7XG4rXHRSTUlfRU1QVFkgPSAwLFxuK1x0Uk1JX1JBTSA9IDEsXG4rXHRSTUlfREVTVFJPWUVEID0gMixcbitcdFJNSV9ERVYgPSAzLFxuK307XG4rXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXHQwXG4rI2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UXHQxXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRcdEdFTk1BU0soNDAsIDMzKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURVx0QklUKDMyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdFx0R0VOTUFTSygzMSwgMjcpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRcdEJJVCgyNilcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRcdEdFTk1BU0soMjUsIDIwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdFx0R0VOTUFTSygxOSwgMTQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRV9WTFx0XHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0XHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMlx0XHRcdEJJVCg4KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdFx0R0VOTUFTSyg3LCAwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFNcdFx0XHRHRU5NQVNLKDE2LCAxNClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWlx0XHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0XHRHRU5NQVNLKDksIDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMlx0XHRCSVQoNSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMzg0XHRcdEJJVCg0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0JcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQlx0XHRCSVQoMClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDE0LCAxMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfTk9OX1RFRV9TVFJFQU1cdFx0QklUKDkpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0XHRCSVQoOClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUERFVl9NQVhfVkRFVlNfT1JERVJcdEdFTk1BU0soNywgNClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfQVRTXHRcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXHRcdFx0QklUKDIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBX0NPSFx0XHRcdEJJVCgxKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQVx0XHRcdEJJVCgwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUzJBUF9JTkRJUkVDVFx0QklUKDYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX01BWF9OVU1fQVVYX1BMQU5FU1x0R0VOTUFTSygzLCAwKVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcdFx0R0VOTUFTSyg2MywgMClcbitcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMXHRcdDBcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX05DT0hcdFx0MVxuKyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09IXHRcdDJcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfTk9ORVx0XHRcdDNcbitcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFx0XHRcdDBcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19OT05FXHRcdFx0MVxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkVcdFx0XHQyXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXHRcdFx0M1xuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0lOVEVSTUVESUFURVx0XHQ0XG4rXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCXHQxXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcdDJcbitcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVVxuKyNkZWZpbmUgUk1JX0dQVF9QQVJfUExBVCAgICAgICAgICAgICAgIDFVXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVVxuK1xuKy8qXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxuKyAqIGFsaWdubWVudCwgc28gdXNlIHU2NCB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQuXG4rICovXG4rc3RydWN0IHJtbV9jb25maWcge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XG4rXHRcdFx0dTY0IHJtaV9ncmFudWxlX3NpemU7XG4rXHRcdH07XG4rXHRcdHU4IHNpemVyW1NaXzRLXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xuK1xuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfU1ZFXHRcdEJJVCgxKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VXHRcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcdFx0XHRCSVQoMylcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcdFx0R0VOTUFTSyg2LCA1KVxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVx0XHRHRU5NQVNLKDgsIDcpXG4rXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2XHRcdFx0MFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMlx0XHRcdDFcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcdFx0XHQyXG4rXG4rc3RydWN0IHJlYWxtX3BhcmFtcyB7XG4rXHR1bmlvbiB7IC8qIDB4MCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBmbGFnczA7XG4rXHRcdFx0dTY0IHMyc3o7XG4rXHRcdFx0dTY0IHN2ZV92bDtcbitcdFx0XHR1NjQgbnVtX2JwcztcbitcdFx0XHR1NjQgbnVtX3dwcztcbitcdFx0XHR1NjQgcG11X251bV9jdHJzO1xuK1x0XHRcdHU2NCBoYXNoX2FsZ287XG4rXHRcdFx0dTY0IG51bV9hdXhfcGxhbmVzO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMFsweDQwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU4IHJwdls2NF07XG4rXHRcdFx0dTY0IGF0c19wbGFuZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzFbMHg0MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg4MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgcGFkZGluZzI7XG4rXHRcdFx0dTY0IHJ0dF9iYXNlO1xuK1x0XHRcdHM2NCBydHRfbGV2ZWxfc3RhcnQ7XG4rXHRcdFx0dTY0IHJ0dF9udW1fc3RhcnQ7XG4rXHRcdFx0dTY0IGZsYWdzMTtcbitcdFx0XHR1NjQgbWF4X251bV92ZGV2cztcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzNbMHg3MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHhmMDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBwYWRkaW5nNFsweDgwXTtcbitcdFx0XHR1NjQgYXV4X3J0dF9iYXNlWzNdO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xuK1xuKy8qXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxuKyAqIGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3Qgd2hlbiBhIFJFQyBpcyBjcmVhdGVkLlxuKyAqL1xuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXHRcdDhcbitcbisjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUKDApXG4rXG4rc3RydWN0IHJlY19wYXJhbXMge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0dTY0IGZsYWdzO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHR1NjQgbXBpZHI7XG4rXHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MjAwICovXG4rXHRcdHU2NCBwYztcbitcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgzMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzNbMHhkMDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XG4rXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19FTVVMQVRFRF9NTUlPXHRCSVQoMClcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcdEJJVCgxKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRklcdFx0QklUKDIpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRVx0XHRCSVQoMylcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXHRCSVQoNClcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0VcdEJJVCg1KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVx0QklUKDYpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFx0XHRCSVQoNylcbitcbisjZGVmaW5lIFJFQ19SVU5fR1BSU1x0XHRcdDMxXG4rXG4rc3RydWN0IHJlY19lbnRlciB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgyMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzFbMHg2MDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbitcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcdFx0XHQweDAwXG4rI2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4rI2RlZmluZSBSTUlfRVhJVF9GSVFcdFx0XHQweDAyXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXHRcdFx0MHgwM1xuKyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbisjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTFx0XHQweDA1XG4rI2RlZmluZSBSTUlfRVhJVF9TRVJST1JcdFx0XHQweDA2XG4rI2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4rI2RlZmluZSBSTUlfRVhJVF9WREVWX1ZBTElEQVRFX01BUFBJTkdcdDB4MDhcbisjZGVmaW5lIFJNSV9FWElUX1ZTTU1VX0NPTU1BTkRcdFx0MHgwYVxuK1xuK3N0cnVjdCByZWNfZXhpdCB7XG4rXHR1bmlvbiB7IC8qIDB4MDAwICovXG4rXHRcdHU4IGV4aXRfcmVhc29uO1xuK1x0XHR1OCBwYWRkaW5nMFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDEwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBlc3I7XG4rXHRcdFx0dTY0IGZhcjtcbitcdFx0XHR1NjQgaHBmYXI7XG4rXHRcdFx0dTY0IHJ0dF90cmVlO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xuK1x0XHR1OCBwYWRkaW5nMlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDMwMCAqL1xuK1x0XHR1OCBwYWRkaW5nM1sweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDQwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCBjbnRwX2N0bDtcbitcdFx0XHR1NjQgY250cF9jdmFsO1xuK1x0XHRcdHU2NCBjbnR2X2N0bDtcbitcdFx0XHR1NjQgY250dl9jdmFsO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNFsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDUwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHU2NCByaXBhc19iYXNlO1xuK1x0XHRcdHU2NCByaXBhc190b3A7XG4rXHRcdFx0dTggcmlwYXNfdmFsdWU7XG4rXHRcdFx0dTggcGFkZGluZzVbMHhmXTtcbitcdFx0XHR1NjQgczJhcF9iYXNlO1xuK1x0XHRcdHU2NCBzMmFwX3RvcDtcbitcdFx0XHR1NjQgdmRldl9pZF8xO1xuK1x0XHRcdHU2NCB2ZGV2X2lkXzI7XG4rXHRcdFx0dTY0IGRldl9tZW1fYmFzZTtcbitcdFx0XHR1NjQgZGV2X21lbV90b3A7XG4rXHRcdFx0dTY0IGRldl9tZW1fcGE7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NjAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTE2IGltbTtcbitcdFx0XHR1OCBwYWRkaW5nN1sweDZdO1xuK1x0XHRcdHU2NCBwbGFuZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzhbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg3MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbitcdFx0XHR1OCBwYWRkaW5nOVsweGZdO1xuK1x0XHRcdHU2NCB2c21tdTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzEwWzB4MTAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTtcbitcbitzdHJ1Y3QgcmVjX3J1biB7XG4rXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xuK1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuK1xuKy8qIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcdEdFTk1BU0soMTgsIDE2KVxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4rXG4rLyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcdEdFTk1BU0soMTUsIDIpXG4rXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEVcdFx0XHRCSVQoMClcbisjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFEXHRcdFx0QklUKDEpXG4rXG4rI2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqL1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDk6MDk6MjIuODY3NzY2OTJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0NDgyNjI2NzkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgRmVhc2liaWxpdHkgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIHRoZSBpbml0aWFsIHByb21wdCBhc2tzIG1lIHRvIGV2YWx1YXRlIHRoaXMgcGF0Y2ggc2VyaWVzIGZvciBzeXprYWxsZXIgZnV6emluZyBwb3RlbnRpYWwgb24gYW1kNjQuIFN0cmFpZ2h0IGF3YXksIHRoZSBtZW50aW9uIG9mIGBhbWQ2NGAgc2V0cyBvZmYgYWxhcm0gYmVsbHMuIEkgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGhlcmUuXG5cblRoZSBmaXJzdCB0aGluZyBJIGRpZCB3YXMgcmUtZXhhbWluZSB0aGUgYFRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0YCBpbnN0cnVjdGlvbi5cblxuVGhlIHByb3ZpZGVkIHBhdGNoIHRvdWNoZXMgYSBmZXcga2V5IGFyZWFzLCB0aGUgZmlyc3QgYmVpbmcgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgKHNlbGVjdHMgYEFSQ0hfU1VQUE9SVFNfUk1NYCksIGFuZCBgZHJpdmVycy9maXJtd2FyZWAgd2hpY2ggaW5jbHVkZXMgYW4gYGFybV9ybW1gIHN1YmRpcmVjdG9yeSB3aXRoIEtjb25maWcgYW5kIE1ha2VmaWxlIGNvbmZpZ3VyYXRpb25zIGZvciBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmdW5jdGlvbmFsaXR5LiBJdCdzIG9idmlvdXNseSBhaW1pbmcgYXQgQVJNNjQgYXJjaGl0ZWN0dXJlLCBnaXZlbiB0aGUgZmlsZSBuYW1lcyBhbmQgdGhlIGluY2x1c2lvbiBvZiBgYXJjaC9hcm02NGAgY29uZmlndXJhdGlvbnMuIE15IGluaXRpYWwgaW50dWl0aW9uIGlzIHNjcmVhbWluZyAqd3JvbmcgYXJjaGl0ZWN0dXJlISouXG5cblRoZSByZWFsIHF1ZXN0aW9uLCB0aGUgY3JpdGljYWwgb25lLCBpcyB3aGV0aGVyIHRoaXMgYENPTkZJR19BUk1fUk1NX1JNSWAgZmVhdHVyZSwgdGhhdCdzIGRlZXBseSB0aWVkIHRvIEFSTTY0IFJNSSBzdXBwb3J0LCBpcyBldmVuIGJ1aWxkYWJsZSwgbGV0IGFsb25lIHJlYWNoYWJsZSwgb24gYW4gYW1kNjQgc3lzdGVtLiBUaGUgcGF0Y2ggc2VyaWVzIGhhcyBgS2NvbmZpZ2AgZmlsZXMgdGhhdCByZXZlYWwgYSBkZXBlbmRlbmN5IGNoYWluLiBgQVJNX1JNTV9STUlgIGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc2VsZWN0ZWQgKm9ubHkqIHdpdGhpbiB0aGUgYEFSTTY0YCBjb25maWd1cmF0aW9uIGluIGBhcmNoL2FybTY0L0tjb25maWdgLlxuXG5Ob3csIEknbSBjaGVja2luZywganVzdCB0byBiZSBzdXJlLCB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgb3IgYEFSTV9STU1fUk1JYCBpcyAqbmV2ZXIqIHNvbWVob3cgZGVmaW5lZCBvciBzZWxlY3RlZCBvbiBhbiB4ODYvYW1kNjQgY29uZmlndXJhdGlvbi4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgZ3JlcCB0aGUgZW50aXJlIGtlcm5lbCBzb3VyY2UgdHJlZSB0byBiZSAxMDAlIHBvc2l0aXZlLiBUaGlzIGlzIGltcG9ydGFudCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpcyBldmVuICpyZWxldmFudCogdG8gZnV6emluZyBhIHN5c3RlbSBvbiBhbiBhbWQ2NCBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI4MzM3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTM0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMDk6MDk6MjcuMzUwMzk4MDgxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MTczODA1NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQVJDSF9TVVBQT1JUU19STU1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XFxuLS1cXG5hcmNoL2FybTY0L0tjb25maWctNDAtXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuYXJjaC9hcm02NC9LY29uZmlnOjQxOlxcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjI6Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cXHRib29sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFxcXCJcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzo3OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOToyOS4yNjc3ODcyMTFaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo4MjAxNzU2ODUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIFBhdGNoIEFwcGxpY2FiaWxpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIGBybWkuY2AgZmlsZSwgaW5jbHVkZXMgYW55IEFSTTY0LXNwZWNpZmljIGhlYWRlcnMuIExvb2tzIGxpa2Ugd2UgaGF2ZTogYFx1MDAzY2FzbS9tZW1vcnkuaFx1MDAzZWAsIGBcdTAwM2Nhc20vcGd0YWJsZS1od2RlZi5oXHUwMDNlYCwgdGhlIGBBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUYCBtYWNybywgdGhlIGByZWFkX3Nhbml0aXNlZF9mdHJfcmVnYCBmdW5jdGlvbiBjYWxsICh3aGljaCBkZWFscyB3aXRoIHRoZSBzeXN0ZW0gcmVnaXN0ZXIpLCBhbmQgZnVuY3Rpb25zL3N0cnVjdHVyZXMgbGlrZSBgY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkYCwgYGFybV9zbWNjY18xXzJfcmVnc2AsIGFuZCBgYXJtX3NtY2NjXzFfMl9pbnZva2VgLiBZZXAsIGRlZmluaXRlbHkgQVJNNjQtc3BlY2lmaWMgc3R1ZmYuXG5cbk5vdywgbGV0J3MgcmVmZXIgdG8gdGhlIGluc3RydWN0aW9ucy4gU2VjdGlvbiAyIGRpY3RhdGVzIHdoZW4gd2UgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPWZhbHNlYC4gVGhlIHJlbGV2YW50IGNvbmRpdGlvbiBoZXJlIGlzIFwiQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLFwiIGFuZCBvdXIgdGFyZ2V0IGlzIGNsZWFybHkgYW1kNjQuXG5cblRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvciAvIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTU0vUk1JKS4gSXQgdG91Y2hlcyBmaWxlcyBsaWtlIGBhcmNoL2FybTY0L0tjb25maWdgLCBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCwgdGhlIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vYCBkaXJlY3RvcnksIGFuZCByZWxhdGVkIGhlYWRlcnMuIEkga25vdyB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgb25seSBzZWxlY3RlZCBpZiBgY29uZmlnIEFSTTY0YCBpcyBzZXQuIEFsc28sIGBBUk1fUk1NX1JNSWAgaXMgZGVwZW5kZW50IG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAuIENvbnNlcXVlbnRseSwgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgKm5ldmVyKiBlbmFibGVkIG9uIGFtZDY0ICh4ODZfNjQpLiBFdmVuIGlmIGl0ICpjb3VsZCogYmUgZW5hYmxlZCBzb21laG93LCB0aGUgcHJlc2VuY2Ugb2YgdGhvc2UgQVJNNjQtc3BlY2lmaWMgc3ltYm9scyBjb25maXJtcyB0aGUgY29kZSdzIHVucmVhY2hhYmlsaXR5IG9uIGFtZDY0LlxuXG5MZXQncyBkbyBhIHF1aWNrIHN3ZWVwIG9mIHRoZSBjaGFuZ2VkIGZpbGVzIHRvIHZlcmlmeSB0aGF0LiBJJ2xsIG1ha2Ugc3VyZSBlYWNoIGlzIGNvbXBsZXRlbHkgdW5yZWxhdGVkLlxuXG4xLiAgYGFyY2gvYXJtNjQvS2NvbmZpZ2AgLSBBUk02NCBvbmx5LlxuMi4gIGBhcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNgIC0gQVJNNjQgb25seS5cbjMuICBgZHJpdmVycy9maXJtd2FyZS9LY29uZmlnYCAtIHNvdXJjZXMgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYC5cbjQuICBgZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZWAgLSBhZGRzIGBvYmoteSArPSBhcm1fcm1tL2AuXG41LiAgYGRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnYCAtIGRlZmluZXMgYEFSQ0hfU1VQUE9SVFNfUk1NYCAobm90IHNlbGVjdGVkIGJ5IHg4NikgYW5kIGBBUk1fUk1NX1JNSWAgKGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCkuIE9uIGFtZDY0LCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG4sIHNvIGBBUk1fUk1NX1JNSWAgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBlbmFibGVkLlxuNi4gIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVgIC0gY29tcGlsZXMgYHJtaS5vYCBvbmx5IGlmIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIHNldC5cbjcuICBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jYCAtIGNvbXBpbGVkIG9ubHkgaWYgYENPTkZJR19BUk1fUk1NX1JNSWAgaXMgc2V0LlxuOC4gIGBpbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oYCAtIGhlYWRlciBub3QgdXNlZCBvbiBhbWQ2NC5cbjkuICBgaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmhgIC0gaGVhZGVyIG5vdCB1c2VkIG9uIGFtZDY0LlxuXG5Pa2F5LCBhbmQgSSdsbCBxdWlja2x5IGNoZWNrIGlmIGBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW1gIGV2ZW4gY29tcGlsZXMgb24gYW1kNjQuIFNpbmNlIGBDT05GSUdfQVJNX1JNTV9STUlgIGlzIG5vdCBzZXQsIHRoZSBgZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlYCBnZW5lcmF0ZXMgbm8gb2JqZWN0cy4gSXQncyBhbiBlbXB0eSBidWlsZCBkaXJlY3Rvcnkgb24gYW1kNjQuXG5cblNvLCBhbGwgdGhlIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlbHkgZm9yIEFSTTY0LiBJdCBmYWxscyBzcXVhcmVseSB1bmRlciB0aGUgXCJVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6ICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlwiXG5cblRoZXJlZm9yZTpcblxuKiAgIGBXb3J0aEZ1enppbmcgPSBmYWxzZWBcbiogICBgRW5hYmxlQ29uZmlncyA9IFtdYFxuKiAgIGBGb2N1c1N5bWJvbHMgPSBbXWBcbiogICBgUmVhc29uaW5nID0gQ29uY2lzZSBleHBsYW5hdGlvbjogVGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NCwgdGhpcyBwYXRjaCBhZGRzIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHN1cHBvcnQgZXhjbHVzaXZlIHRvIGFybTY0IGFyY2hpdGVjdHVyZSAoQ09ORklHX0FSTV9STU1fUk1JIGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgYnkgQVJNNjQpLiBUaHVzLCB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuYFxuXG5DaGVja2luZzpcblRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0LlxuUGF0Y2g6IEFSTSBSTU0vUk1JIHN1cHBvcnQuXG5Dcml0ZXJpYSBjaGVjazpcbi0gV29ydGhGdXp6aW5nPWZhbHNlIHdoZW4gXCJDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXCJcbi0gRm9jdXNTeW1ib2xzOiBbXVxuLSBFbmFibGVDb25maWdzOiBbXVxuLSBSZWFzb25pbmc6XG5cbiIsIklucHV0VG9rZW5zIjoyOTU2NywiT3V0cHV0VG9rZW5zIjoxMzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjAyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDA5OjA5OjM3LjQ2OTU0NzIyNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4gVGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgaW50cm9kdWNlIHN1cHBvcnQgZm9yIHRoZSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBmb3IgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZSAoQXJtIENDQSkuIFRoZSBkcml2ZXIgY29kZSBpbiBkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vIGlzIGd1YXJkZWQgYnkgQ09ORklHX0FSTV9STU1fUk1JLCB3aGljaCBkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NIChvbmx5IHNlbGVjdGVkIHVuZGVyIGFyY2gvYXJtNjQpLiBUaGVyZWZvcmUsIHRoZSBtb2RpZmllZCBhbmQgYWRkZWQgY29kZSBpcyBleGNsdXNpdmUgdG8gYXJtNjQgYW5kIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBvbiBhbWQ2NC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuIFRoZSBjaGFuZ2VzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGludHJvZHVjZSBzdXBwb3J0IGZvciB0aGUgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgZm9yIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUgKEFybSBDQ0EpLiBUaGUgZHJpdmVyIGNvZGUgaW4gZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tLyBpcyBndWFyZGVkIGJ5IENPTkZJR19BUk1fUk1NX1JNSSwgd2hpY2ggZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX1JNTSAob25seSBzZWxlY3RlZCB1bmRlciBhcmNoL2FybTY0KS4gVGhlcmVmb3JlLCB0aGUgbW9kaWZpZWQgYW5kIGFkZGVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIGFybTY0IGFuZCBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgb24gYW1kNjQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQwOTowOTozNy40Njk1NzM1NzRaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjczMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowx7knp[1] Phase: Running StartedAt: 2026-09-12 09:09:49 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx7knp[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-12 09:09:49 +0000 UTC FinishedAt: 2026-09-12 09:09:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}