Name: series-workflowrtmws Phase: Failed StartedAt: 2026-07-30 18:25:03 +0000 UTC FinishedAt: 2026-07-30 18:40:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtmws[0] Phase: Succeeded StartedAt: 2026-07-30 18:25:03 +0000 UTC FinishedAt: 2026-07-30 18:40:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtmws[0].run-triage Phase: Succeeded StartedAt: 2026-07-30 18:25:03 +0000 UTC FinishedAt: 2026-07-30 18:40:30 +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+CgkJCTx0ZD4yMDI2LzA3LzMwIDE4OjQwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8zMCAxODo0MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDhkYWU1MTQ4YzEwNDVmZDAwZTVhYTkxMzFmN2QzNTg0NjRjMGM4ZTVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEp1bCAzMCAxODo0MDowOSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtMTA1NjUsMTIgJiM0MzsxMDU2NSw2IEBAIEw6XHRsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZ1xuIFM6XHRPcnBoYW5cbiBGOlx0ZHJpdmVycy91c2IvcGh5L3BoeS1mc2wtdXNiKlxuIFxuLUZSRUVWWEZTIEZJTEVTWVNURU1cbi1NOlx0Q2hyaXN0b3BoIEhlbGx3aWcgXHUwMDNjaGNoQGluZnJhZGVhZC5vcmdcdTAwM2Vcbi1TOlx0TWFpbnRhaW5lZFxuLVc6XHRmdHA6Ly9mdHAub3BlbmxpbnV4Lm9yZy9wdWIvcGVvcGxlL2hjaC92eGZzXG4tRjpcdGZzL2ZyZWV2eGZzL1xuLVxuIEZSRUVaRVJcbiBNOlx0XCYjMzQ7UmFmYWVsIEouIFd5c29ja2lcJiMzNDsgXHUwMDNjcmFmYWVsQGtlcm5lbC5vcmdcdTAwM2VcbiBSOlx0UGF2ZWwgTWFjaGVrIFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcdTAwM2VcbmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZ1xuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcbi0tLSBhL2ZzL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL0tjb25maWdcbkBAIC0zMjEsNyAmIzQzOzMyMSw2IEBAIHNvdXJjZSBcJiMzNDtmcy9qZmZzMi9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL3ViaWZzL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvY3JhbWZzL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvc3F1YXNoZnMvS2NvbmZpZ1wmIzM0O1xuLXNvdXJjZSBcJiMzNDtmcy9mcmVldnhmcy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL21pbml4L0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvb21mcy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL2hwZnMvS2NvbmZpZ1wmIzM0O1xuZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGVcbmluZGV4IDg5YThhOWQyMDdkMWMuLmFjMGQxYzAwNTIzZjAgMTAwNjQ0XG4tLS0gYS9mcy9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZnMvTWFrZWZpbGVcbkBAIC04MCw3ICYjNDM7ODAsNiBAQCBvYmotJChDT05GSUdfSVNPOTY2MF9GUylcdCYjNDM7PSBpc29mcy9cbiBvYmotJChDT05GSUdfSEZTUExVU19GUylcdCYjNDM7PSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUyYjNDM7XG4gb2JqLSQoQ09ORklHX0hGU19GUylcdFx0JiM0Mzs9IGhmcy9cbiBvYmotJChDT05GSUdfRUNSWVBUX0ZTKVx0XHQmIzQzOz0gZWNyeXB0ZnMvXG4tb2JqLSQoQ09ORklHX1ZYRlNfRlMpXHRcdCYjNDM7PSBmcmVldnhmcy9cbiBvYmotJChDT05GSUdfTkZTX0ZTKVx0XHQmIzQzOz0gbmZzL1xuIG9iai0kKENPTkZJR19FWFBPUlRGUylcdFx0JiM0Mzs9IGV4cG9ydGZzL1xuIG9iai0kKENPTkZJR19ORlNEKVx0XHQmIzQzOz0gbmZzZC9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA5MTIxMDdlYmVhNmY0Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwyNyAmIzQzOzAsMCBAQFxuLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLWNvbmZpZyBWWEZTX0ZTXG4tXHR0cmlzdGF0ZSBcJiMzNDtGcmVlVnhGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChWRVJJVEFTIFZ4RlMoVE0pIGNvbXBhdGlibGUpXCYjMzQ7XG4tXHRkZXBlbmRzIG9uIEJMT0NLXG4tXHRzZWxlY3QgQlVGRkVSX0hFQURcbi1cdGhlbHBcbi1cdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXG4tXHQgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtXG4tXHQgIG9mIFNDTyBVbml4V2FyZSAoYW5kIHBvc3NpYmx5IG90aGVycykgYW5kIG9wdGlvbmFsbHkgYXZhaWxhYmxlXG4tXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXG4tXHQgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrXG4tXHQgIGRhdGEgZW5kaWFubmVzcyBhbmQvb3Igc3VwZXJibG9jayBvZmZzZXQuIFRoZSB2eGZzIG1vZHVsZSBoYXMgYmVlblxuLVx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxuLVx0ICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zXG4tXHQgIDIsIDMgYW5kIDQuIFRlc3RzIHdlcmUgcGVyZm9ybWVkIHdpdGggSFAtVVggVnhGUyB2ZXJzaW9uIDMuXG4tXG4tXHQgIE5PVEU6IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGFzIHVzZWQgYnkgbW91bnQoMSksIG1vdW50KDIpIGFuZFxuLVx0ICBmc3RhYig1KSBpcyAmIzM5O3Z4ZnMmIzM5OyBhcyBpdCBkZXNjcmliZXMgdGhlIGZpbGUgc3lzdGVtIGZvcm1hdCwgbm90XG4tXHQgIHRoZSBhY3R1YWwgZHJpdmVyLlxuLVxuLVx0ICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXNcbi1cdCAgY3JlYXRpbmcgSFAtVVggbG9naWNhbCB2b2x1bWVzIGVhc3kgZnJvbSBIUC1VWCBkaXNrIGJsb2NrIGRldmljZSBmaWxlXG4tXHQgIG9yIHJlZ3VsYXIgZmlsZSB3aXRoIGltYWdlIG9mIHRoZSBkaXNrLiBTZWU6XG4tXHQgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzL1xuLVxuLVx0ICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxuLVx0ICBjYWxsZWQgZnJlZXZ4ZnMuICBJZiB1bnN1cmUsIHNheSBOLlxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZTZlZTU5MjkxNTIxYy4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDkgJiM0MzswLDAgQEBcbi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0jXG4tIyBWeEZTIE1ha2VmaWxlXG4tI1xuLVxuLW9iai0kKENPTkZJR19WWEZTX0ZTKSAmIzQzOz0gZnJlZXZ4ZnMub1xuLVxuLWZyZWV2eGZzLW9ianMgOj0gdnhmc19ibWFwLm8gdnhmc19mc2hlYWQubyB2eGZzX2ltbWVkLm8gdnhmc19pbm9kZS5vIFxcXG4tXHRcdCB2eGZzX2xvb2t1cC5vIHZ4ZnNfb2x0Lm8gdnhmc19zdWJyLm8gdnhmc19zdXBlci5vXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGJmZmQxNTZkNjQzNGMuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMjU3ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfU1VQRVJfSF9cbi0jZGVmaW5lIF9WWEZTX1NVUEVSX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmVcbi0gKiBzdXBlcmJsb2NrcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2Vcbi1cbi0vKlxuLSAqIFN1cGVyYmxvY2sgbWFnaWMgbnVtYmVyICh2eGZzX3N1cGVyLVx1MDAzZXZzX21hZ2ljKS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfU1VQRVJfTUFHSUNcdDB4YTUwMUZDRjVcbi1cbi0vKlxuLSAqIFRoZSByb290IGlub2RlLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19ST09UX0lOT1x0XHQyXG4tXG4tLypcbi0gKiBOdW0gb2YgZW50cmllcyBpbiBmcmVlIGV4dGVudCBhcnJheVxuLSAqL1xuLSNkZWZpbmUgVlhGU19ORUZSRUVcdFx0MzJcbi1cbi1lbnVtIHZ4ZnNfYnl0ZV9vcmRlciB7XG4tXHRWWEZTX0JPX0xFLFxuLVx0VlhGU19CT19CRSxcbi19O1xuLVxuLXR5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fZnMxNjtcbi10eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2ZzMzI7XG4tdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19mczY0O1xuLVxuLS8qXG4tICogVnhGUyBzdXBlcmJsb2NrIChkaXNrKS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19zYiB7XG4tXHQvKlxuLVx0ICogUmVhZG9ubHkgZmllbGRzIGZvciB0aGUgdmVyc2lvbiAxIHN1cGVyYmxvY2suXG4tXHQgKlxuLVx0ICogTG90cyBvZiB0aGlzIGZpZWxkcyBhcmUgbm8gbW9yZSB1c2VkIGJ5IHZlcnNpb24gMlxuLVx0ICogYW5kIG5ldmVyIGZpbGVzeXN0ZW1zLlxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfbWFnaWM7XHRcdC8qIE1hZ2ljIG51bWJlciAqL1xuLVx0X19mczMyXHRcdHZzX3ZlcnNpb247XHRcdC8qIFZ4RlMgdmVyc2lvbiAqL1xuLVx0X19mczMyXHRcdHZzX2N0aW1lO1x0XHQvKiBjcmVhdGUgdGltZSAtIHNlY3MgKi9cbi1cdF9fZnMzMlx0XHR2c19jdXRpbWU7XHRcdC8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi9cbi1cdF9fZnMzMlx0XHRfX3VudXNlZDE7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdF9fdW51c2VkMjtcdFx0LyogdW51c2VkICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2xvZ3N0YXJ0O1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbG9nZW5kO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2JzaXplO1x0XHQvKiBibG9jayBzaXplICovXG4tXHRfX2ZzMzJcdFx0dnNfc2l6ZTtcdFx0LyogbnVtYmVyIG9mIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2RzaXplO1x0XHQvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmlub2RlO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9uYXU7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0X191bnVzZWQzO1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfZGVmaWV4dHNpemU7XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbGJzaXplO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2ltbWVkbGVuO1x0XHQvKiBzaXplIG9mIGltbWVkaWF0ZSBkYXRhIGFyZWEgKi9cbi1cdF9fZnMzMlx0XHR2c19uZGFkZHI7XHRcdC8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19maXJzdGF1O1x0XHQvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfZW1hcDtcdFx0Lyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbWFwO1x0XHQvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfaWV4dG9wO1x0XHQvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2lzdGFydDtcdFx0Lyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19ic3RhcnQ7XHRcdC8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfZmVtYXA7XHRcdC8qIGF1Zmlyc3QgJiM0MzsgZW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpbWFwO1x0XHQvKiBhdWZpcnN0ICYjNDM7IGltYXAgKi9cbi1cdF9fZnMzMlx0XHR2c19maWV4dG9wO1x0XHQvKiBhdWZpcnN0ICYjNDM7IGlleHRvcCAqL1xuLVx0X19mczMyXHRcdHZzX2Zpc3RhcnQ7XHRcdC8qIGF1Zmlyc3QgJiM0MzsgaXN0YXJ0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZmJzdGFydDtcdFx0LyogYXVmaXJzdCAmIzQzOyBic3RhcnQgKi9cbi1cdF9fZnMzMlx0XHR2c19uaW5kaXI7XHRcdC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGluZGlyICovXG4tXHRfX2ZzMzJcdFx0dnNfYXVsZW47XHRcdC8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWltbGVuO1x0XHQvKiBsZW5ndGggb2YgaW1hcCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWVtbGVuO1x0XHQvKiBsZW5ndGggb2YgZW1hcCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWlsZW47XHRcdC8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdXBhZDtcdFx0LyogbGVuZ3RoIG9mIHBhZCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWJsb2NrcztcdFx0LyogZGF0YSBibG9ja3MgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19tYXh0aWVyO1x0XHQvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfaW5vcGI7XHRcdC8qIG51bWJlciBvZiBpbm9kZXMgcGVyIGJsayAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbm9wYXU7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2lub3BpbGI7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX25kaXJpcGF1O1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19pYWRkcmxlbjtcdFx0Lyogc2l6ZSBvZiBpbmRpcmVjdCBhZGRyIGV4dC4gKi9cbi1cdF9fZnMzMlx0XHR2c19ic2hpZnQ7XHRcdC8qIGxvZyBiYXNlIDIgb2YgYnNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbm9zaGlmdDtcdFx0LyogbG9nIGJhc2UgMiBvZiBpbm9icCAqL1xuLVx0X19mczMyXHRcdHZzX2JtYXNrO1x0XHQvKiB+KCBic2l6ZSAtIDEgKSAqL1xuLVx0X19mczMyXHRcdHZzX2JvZmZtYXNrO1x0XHQvKiBic2l6ZSAtIDEgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaW5vbWFzaztcdFx0Lyogb2xkX2lub3BpbGIgLSAxICovXG4tXHRfX2ZzMzJcdFx0dnNfY2hlY2tzdW07XHRcdC8qIGNoZWNrc3VtIG9mIFYxIGRhdGEgKi9cbi1cdFxuLVx0Lypcbi1cdCAqIFZlcnNpb24gMSwgd3JpdGFibGVcbi1cdCAqL1xuLVx0X19mczMyXHRcdHZzX2ZyZWU7XHRcdC8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2lmcmVlO1x0XHQvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19lZnJlZVtWWEZTX05FRlJFRV07XHQvKiBudW1iZXIgb2YgZnJlZSBleHRlbnRzIGJ5IHNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19mbGFncztcdFx0LyogZmxhZ3MgPyE/ICovXG4tXHRfX3U4XHRcdHZzX21vZDtcdFx0XHQvKiBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi9cbi1cdF9fdThcdFx0dnNfY2xlYW47XHRcdC8qIGNsZWFuIEZTICovXG4tXHRfX2ZzMTZcdFx0X191bnVzZWQ0O1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHR2c19maXJzdGxvZ2lkO1x0XHQvKiBtb3VudCB0aW1lIGxvZyBJRCAqL1xuLVx0X19mczMyXHRcdHZzX3d0aW1lO1x0XHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZzX3d1dGltZTtcdFx0LyogbGFzdCB0aW1lIHdyaXR0ZW4gLSB1c2VjICovXG4tXHRfX3U4XHRcdHZzX2ZuYW1lWzZdO1x0XHQvKiBGUyBuYW1lICovXG4tXHRfX3U4XHRcdHZzX2ZwYWNrWzZdO1x0XHQvKiBGUyBwYWNrIG5hbWUgKi9cbi1cdF9fZnMzMlx0XHR2c19sb2d2ZXJzaW9uO1x0XHQvKiBsb2cgZm9ybWF0IHZlcnNpb24gKi9cbi1cdF9fdTMyXHRcdF9fdW51c2VkNTtcdFx0LyogdW51c2VkICovXG4tXHRcbi1cdC8qXG4tXHQgKiBWZXJzaW9uIDIsIFJlYWQtb25seVxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfb2x0ZXh0WzJdO1x0XHQvKiBPTFQgZXh0ZW50IGFuZCByZXBsaWNhICovXG4tXHRfX2ZzMzJcdFx0dnNfb2x0c2l6ZTtcdFx0LyogT0xUIGV4dGVudCBzaXplICovXG4tXHRfX2ZzMzJcdFx0dnNfaWF1aW1sZW47XHRcdC8qIHNpemUgb2YgaW5vZGUgbWFwICovXG4tXHRfX2ZzMzJcdFx0dnNfaWF1c2l6ZTtcdFx0Lyogc2l6ZSBvZiBJQVUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfZGlub3NpemU7XHRcdC8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfZG5pYWRkcjtcdFx0LyogaW5kaXIgbGV2ZWxzIHBlciBpbm9kZSAqL1xuLVx0X19mczMyXHRcdHZzX2NoZWNrc3VtMjtcdFx0LyogY2hlY2tzdW0gb2YgVjIgUk8gKi9cbi1cbi1cdC8qXG4tXHQgKiBBY3R1YWxseSBtdWNoIG1vcmUuLi5cbi1cdCAqL1xuLX07XG4tXG4tXG4tLypcbi0gKiBJbiBjb3JlIHN1cGVyYmxvY2sgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZm9yIFZ4RlMuXG4tICovXG4tc3RydWN0IHZ4ZnNfc2JfaW5mbyB7XG4tXHRzdHJ1Y3Qgdnhmc19zYlx0XHQqdnNpX3JhdztcdC8qIHJhdyAob24gZGlzaykgc3VwZXJibG9jayAqL1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqdnNpX2JwO1x0LyogYnVmZmVyIGZvciByYXcgc3VwZXJibG9jayovXG4tXHRzdHJ1Y3QgaW5vZGVcdFx0KnZzaV9mc2hpcDtcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXG4tXHRzdHJ1Y3QgaW5vZGVcdFx0KnZzaV9pbGlzdDtcdC8qIGlub2RlIGxpc3QgaW5vZGUgKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX3N0aWxpc3Q7XHQvKiBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW5vZGUgKi9cbi1cdHVfbG9uZ1x0XHRcdHZzaV9pZXh0O1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0ICovXG4tXHRpbm9fdFx0XHRcdHZzaV9mc2hpbm87XHQvKiBmaWxlc2V0IGhlYWRlciBpbm9kZSAqL1xuLVx0ZGFkZHJfdFx0XHRcdHZzaV9vbHRleHQ7XHQvKiBPTFQgZXh0ZW50ICovXG4tXHRkYWRkcl90XHRcdFx0dnNpX29sdHNpemU7XHQvKiBPTFQgc2l6ZSAqL1xuLVx0ZW51bSB2eGZzX2J5dGVfb3JkZXJcdGJ5dGVfb3JkZXI7XG4tfTtcbi1cbi1zdGF0aWMgaW5saW5lIHUxNiBmczE2X3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMxNiBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmUxNl90b19jcHUoKF9fZm9yY2UgX19iZTE2KWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgX19sZTE2KWEpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHUzMiBmczMyX3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMzMiBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmUzMl90b19jcHUoKF9fZm9yY2UgX19iZTMyKWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGUzMl90b19jcHUoKF9fZm9yY2UgX19sZTMyKWEpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHU2NCBmczY0X3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnM2NCBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmU2NF90b19jcHUoKF9fZm9yY2UgX19iZTY0KWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGU2NF90b19jcHUoKF9fZm9yY2UgX19sZTY0KWEpO1xuLX1cbi1cbi0vKlxuLSAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZFxuLSAqIG5vdCBiZSBwYXNzZWQgYmFjayB0byBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBzeXN0ZW0uICB2eGZzIGZpbGUgdHlwZXMgbXVzdFxuLSAqIG5ldmVyIGhhdmUgb25lIG9mIHRoZSByZWd1bGFyIGZpbGUgdHlwZSBiaXRzIHNldC5cbi0gKi9cbi1lbnVtIHZ4ZnNfbW9kZSB7XG4tXHRWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCxcdC8qIHNldHVpZCAqL1xuLVx0VlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsXHQvKiBzZXRnaWQgKi9cbi1cdFZYRlNfSVNWVFggPSAweDAwMDAwMjAwLFx0Lyogc3RpY2t5IGJpdCAqL1xuLVx0VlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsXHQvKiByZWFkICovXG4tXHRWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsXHQvKiB3cml0ZSAqL1xuLVx0VlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsXHQvKiBleGVjICovXG4tXG4tXHRWWEZTX0lGSUZPID0gMHgwMDAwMTAwMCxcdC8qIE5hbWVkIHBpcGUgKi9cbi1cdFZYRlNfSUZDSFIgPSAweDAwMDAyMDAwLFx0LyogQ2hhcmFjdGVyIGRldmljZSAqL1xuLVx0VlhGU19JRkRJUiA9IDB4MDAwMDQwMDAsXHQvKiBEaXJlY3RvcnkgKi9cbi1cdFZYRlNfSUZOQU0gPSAweDAwMDA1MDAwLFx0LyogWGVuaXggZGV2aWNlID8/ICovXG4tXHRWWEZTX0lGQkxLID0gMHgwMDAwNjAwMCxcdC8qIEJsb2NrIGRldmljZSAqL1xuLVx0VlhGU19JRlJFRyA9IDB4MDAwMDgwMDAsXHQvKiBSZWd1bGFyIGZpbGUgKi9cbi1cdFZYRlNfSUZDTVAgPSAweDAwMDA5MDAwLFx0LyogQ29tcHJlc3NlZCBmaWxlID8hPyAqL1xuLVx0VlhGU19JRkxOSyA9IDB4MDAwMGEwMDAsXHQvKiBTeW1saW5rICovXG4tXHRWWEZTX0lGU09DID0gMHgwMDAwYzAwMCxcdC8qIFNvY2tldCAqL1xuLVxuLVx0LyogVnhGUyBpbnRlcm5hbCAqL1xuLVx0VlhGU19JRkZTSCA9IDB4MTAwMDAwMDAsXHQvKiBGaWxlc2V0IGhlYWRlciAqL1xuLVx0VlhGU19JRklMVCA9IDB4MjAwMDAwMDAsXHQvKiBJbm9kZSBsaXN0ICovXG4tXHRWWEZTX0lGSUFVID0gMHgzMDAwMDAwMCxcdC8qIElub2RlIGFsbG9jYXRpb24gdW5pdCAqL1xuLVx0VlhGU19JRkNVVCA9IDB4NDAwMDAwMDAsXHQvKiBDdXJyZW50IHVzYWdlIHRhYmxlICovXG4tXHRWWEZTX0lGQVRUID0gMHg1MDAwMDAwMCxcdC8qIEF0dHIuIGlub2RlICovXG4tXHRWWEZTX0lGTENUID0gMHg2MDAwMDAwMCxcdC8qIExpbmsgY291bnQgdGFibGUgKi9cbi1cdFZYRlNfSUZJQVQgPSAweDcwMDAwMDAwLFx0LyogSW5kaXJlY3QgYXR0cmlidXRlIGZpbGUgKi9cbi1cdFZYRlNfSUZFTVIgPSAweDgwMDAwMDAwLFx0LyogRXh0ZW50IG1hcCByZW9yZyBmaWxlICovXG4tXHRWWEZTX0lGUVVPID0gMHg5MDAwMDAwMCxcdC8qIEJTRCBxdW90YSBmaWxlICovXG4tXHRWWEZTX0lGUFRJID0gMHhhMDAwMDAwMCxcdC8qIFwmIzM0O1Bhc3MgdGhyb3VnaFwmIzM0OyBpbm9kZSAqL1xuLVx0VlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xuLVx0VlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsXHQvKiBPTFQgZmlsZSAqL1xuLVx0VlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsXHQvKiBMb2cgZmlsZSAqL1xuLVx0VlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cbi1cdFZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cbi1cdFZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xuLVx0VlhGU19JRkRFViA9IDB4MTcwMDAwMDAsXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cbi1cbi19O1xuLVxuLSNkZWZpbmVcdFZYRlNfVFlQRV9NQVNLXHRcdDB4ZmZmZmYwMDBcbi1cbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVx0KCgoaXApLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxuLSNkZWZpbmUgVlhGU19JU0ZJRk8oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxuLSNkZWZpbmUgVlhGU19JU0NIUih4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXG4tI2RlZmluZSBWWEZTX0lTRElSKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcbi0jZGVmaW5lIFZYRlNfSVNOQU0oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxuLSNkZWZpbmUgVlhGU19JU0JMSyh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXG4tI2RlZmluZSBWWEZTX0lTTE5LKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcbi0jZGVmaW5lIFZYRlNfSVNSRUcoeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxuLSNkZWZpbmUgVlhGU19JU0NNUCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXG4tI2RlZmluZSBWWEZTX0lTU09DKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcbi1cbi0jZGVmaW5lIFZYRlNfSVNGU0goeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKVxuLSNkZWZpbmUgVlhGU19JU0lMVCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpXG4tXG4tLypcbi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19PUkdfTk9ORVx0PSAwLFx0LyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqL1xuLVx0VlhGU19PUkdfRVhUNFx0PSAxLFx0LyogRXh0NCAqL1xuLVx0VlhGU19PUkdfSU1NRURcdD0gMixcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xuLVx0VlhGU19PUkdfVFlQRURcdD0gMyxcdC8qIFR5cGVkIGV4dGVudHMgKi9cbi19O1xuLVxuLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKVx0KChpcCktXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXG4tI2RlZmluZSBWWEZTX0lTTk9ORShpcClcdFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcbi0jZGVmaW5lIFZYRlNfSVNFWFQ0KGlwKVx0XHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxuLSNkZWZpbmUgVlhGU19JU0lNTUVEKGlwKVx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfSU1NRUQpXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19UWVBFRClcbi1cbi0vKlxuLSAqIEdldCBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmcm9tIFZGUyBzdXBlcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxuLVx0KChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktXHUwMDNlc19mc19pbmZvKVxuLVxuLSNlbmRpZiAvKiBfVlhGU19TVVBFUl9IXyAqL1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMWI4MjE2ZWIxZDkwYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDI3MiAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzeXN0ZW0gdG8gZGlzayBibG9jayBtYXBwaW5nLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2lub2RlLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfdHlwZHVtcChzdHJ1Y3Qgdnhmc190eXBlZCAqdHlwKVxuLXtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3R5cGU9JUx1IFwmIzM0OywgdHlwLVx1MDAzZXZ0X2hkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpO1xuLVx0cHJpbnRrKFwmIzM0O29mZnNldD0lTHggXCYjMzQ7LCB0eXAtXHUwMDNldnRfaGRyIFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0spO1xuLVx0cHJpbnRrKFwmIzM0O2Jsb2NrPSV4IFwmIzM0OywgdHlwLVx1MDAzZXZ0X2Jsb2NrKTtcbi1cdHByaW50ayhcJiMzNDtzaXplPSV4XFxuXCYjMzQ7LCB0eXAtXHUwMDNldnRfc2l6ZSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBibjpcdFx0bG9naWNhbCBibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxuLSAqICAgZXh0NC1zdHlsZSBleHRlbnRzICh3aGljaCBhcmUgbXVjaCBsaWtlIHRoZSB0cmFkaXRpb25hbCBVTklYXG4tICogICBpbm9kZSBvcmdhbmlzYXRpb24pLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBkYWRkcl90XG4tdnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibilcbi17XG4tXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtXHUwMDNlaV9zYjtcbi1cdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKHNiKTtcbi1cdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2luZHNpemUpO1xuLVx0aW50IGk7XG4tXG4tXHRpZiAoaW5kc2l6ZSBcdTAwM2Ugc2ItXHUwMDNlc19ibG9ja3NpemUpXG4tXHRcdGdvdG8gZmFpbF9zaXplO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OREFERFI7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHN0cnVjdCBkaXJlY3QgKmQgPSB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2RpcmVjdCAmIzQzOyBpO1xuLVx0XHRpZiAoYm4gXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiBibiBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZXNpemUpKVxuLVx0XHRcdHJldHVybiAoYm4gJiM0MzsgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZWV4dGVudCkpO1xuLVx0XHRibiAtPSBmczMyX3RvX2NwdShzYmksIGQtXHUwMDNlc2l6ZSk7XG4tXHR9XG4tXG4tXHRpZiAoKGJuIC8gKGluZHNpemUgKiBpbmRzaXplICogYnNpemUgLyA0KSkgPT0gMCkge1xuLVx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1Zjtcbi1cdFx0ZGFkZHJfdFx0Ym5vO1xuLVx0XHRfX2ZzMzIgKmluZGlyO1xuLVxuLVx0XHRidWYgPSBzYl9icmVhZChzYixcbi1cdFx0XHRmczMyX3RvX2NwdShzYmksIHZpcC1cdTAwM2V2aWlfZXh0NC52ZTRfaW5kaXJbMF0pKTtcbi1cdFx0aWYgKCFidWYgfHwgIWJ1ZmZlcl9tYXBwZWQoYnVmKSlcbi1cdFx0XHRnb3RvIGZhaWxfYnVmO1xuLVxuLVx0XHRpbmRpciA9IChfX2ZzMzIgKilidWYtXHUwMDNlYl9kYXRhO1xuLVx0XHRibm8gPSBmczMyX3RvX2NwdShzYmksIGluZGlyWyhibiAvIGluZHNpemUpICUgKGluZHNpemUgKiBibildKSAmIzQzO1xuLVx0XHRcdChibiAlIGluZHNpemUpO1xuLVxuLVx0XHRicmVsc2UoYnVmKTtcbi1cdFx0cmV0dXJuIGJubztcbi1cdH0gZWxzZVxuLVx0XHRwcmludGsoS0VSTl9XQVJOSU5HIFwmIzM0O25vIG1hdGNoaW5nIGluZGlyP1wmIzM0Oyk7XG4tXG4tXHRyZXR1cm4gMDtcbi1cbi1mYWlsX3NpemU6XG4tXHRwcmludGsoXCYjMzQ7dnhmczogaW5kaXJlY3QgZXh0ZW50IHRvbyBiaWchXFxuXCYjMzQ7KTtcbi1mYWlsX2J1Zjpcbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfaW5kaXIgLSByZWN1cnNpb24gZm9yIHZ4ZnNfYm1hcF90eXBlZFxuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaW5kaXI6XHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XG4tICogQHNpemU6XHRzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaFxuLSAqIEBibG9jazpcdHBhcnRpYWxseSByZXN1bHQgZnJvbSBmdXJ0aGVyIHNlYXJjaGVzXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcF9pbmRpciByZWFkcyBhIFx1MDAyNnN0cnVjdCB2eGZzX3R5cGVkIGF0IEBpbmRpclxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTm90ZTpcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwID0gTlVMTDtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYik7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHQqdHlwO1xuLVx0XHRpbnQ2NF90XHRcdFx0b2ZmO1xuLVxuLVx0XHRicCA9IHNiX2JyZWFkKGlwLVx1MDAzZWlfc2IsXG4tXHRcdFx0XHRpbmRpciAmIzQzOyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLVx1MDAzZWlfc2IpKSk7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHR0eXAgPSAoKHN0cnVjdCB2eGZzX3R5cGVkICopYnAtXHUwMDNlYl9kYXRhKSAmIzQzO1xuLVx0XHRcdChpICUgVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYikpO1xuLVx0XHRvZmYgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9oZHIpIFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0s7XG4tXG4tXHRcdGlmIChibG9jayBcdTAwM2Mgb2ZmKSB7XG4tXHRcdFx0YnJlbHNlKGJwKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHRzd2l0Y2ggKCh1X2ludDMyX3QpKGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikgXHUwMDNlXHUwMDNlXG4tXHRcdFx0XHRWWEZTX1RZUEVEX1RZUEVTSElGVCkpIHtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUOlxuLVx0XHRcdHBibG9jayA9IHZ4ZnNfYm1hcF9pbmRpcihpcCxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSxcbi1cdFx0XHRcdFx0YmxvY2sgLSBvZmYpO1xuLVx0XHRcdGlmIChwYmxvY2sgPT0gLTIpXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEE6XG4tXHRcdFx0aWYgKChibG9jayAtIG9mZikgXHUwMDNlPSBmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSlcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdHBibG9jayA9IGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSAmIzQzOyBibG9jayAtIG9mZjtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O1xcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCYjMzQ7KTtcbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O2Jsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cJiMzNDssXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0fVxuLVx0XHRkZWZhdWx0OlxuLVx0XHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDslczolZCB2dF9oZHIgJWxsdVxcblwmIzM0OywgX19mdW5jX18sXG4tXHRcdFx0XHRfX0xJTkVfXywgZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKSk7XG4tXHRcdFx0QlVHKCk7XG4tXHRcdH1cbi1cdFx0YnJlbHNlKGJwKTtcbi1cdH1cbi1cbi1mYWlsOlxuLVx0cGJsb2NrID0gMDtcbi1vdXQ6XG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIChwYmxvY2spO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfdHlwZWQgLSBibWFwIGZvciB0eXBlZCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBpYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFBlcmZvcm1zIHRoZSBibWFwIG9wZXJhdGlvbiBmb3IgdHlwZWQgZXh0ZW50cy5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgZGFkZHJfdFxuLXZ4ZnNfYm1hcF90eXBlZChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCpzYmkgPSBWWEZTX1NCSShpcC1cdTAwM2VpX3NiKTtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBWWEZTX05UWVBFRDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0c3RydWN0IHZ4ZnNfdHlwZWRcdCp0eXAgPSB2aXAtXHUwMDNldmlpX29yZy50eXBlZCAmIzQzOyBpO1xuLVx0XHR1NjRcdFx0XHRoZHIgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9oZHIpO1xuLVx0XHRpbnQ2NF90XHRcdFx0b2ZmID0gKGhkciBcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX3R5cGR1bXAodHlwKTtcbi0jZW5kaWZcbi1cdFx0aWYgKGlibG9jayBcdTAwM2Mgb2ZmKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRzd2l0Y2ggKCh1MzIpKGhkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcbi1cdFx0XHRwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfc2l6ZSksXG4tXHRcdFx0XHRcdGlibG9jayAtIG9mZik7XG4tXHRcdFx0aWYgKHBibG9jayA9PSAtMilcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdHJldHVybiAocGJsb2NrKTtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEE6XG4tXHRcdFx0aWYgKChpYmxvY2sgLSBvZmYpIFx1MDAzYyBmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSlcbi1cdFx0XHRcdHJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spICYjNDM7XG4tXHRcdFx0XHRcdFx0aWJsb2NrIC0gb2ZmKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O1xcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCYjMzQ7KTtcbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O2Jsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cJiMzNDssXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4tXHRcdGRlZmF1bHQ6XG4tXHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4tXHR9XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibWFwMSAtIHZ4ZnMtaW50ZXJuYWwgYm1hcCBvcGVyYXRpb25cbi0gKiBAaXA6XHRcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaWJsb2NrOlx0XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcDEgcGVyZm9tcyBhIGxvZ2ljYWwgdG8gcGh5c2ljYWwgYmxvY2sgbWFwcGluZ1xuLSAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICovXG4tZGFkZHJfdFxuLXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwID0gVlhGU19JTk8oaXApO1xuLVxuLVx0aWYgKFZYRlNfSVNFWFQ0KHZpcCkpXG4tXHRcdHJldHVybiB2eGZzX2JtYXBfZXh0NChpcCwgaWJsb2NrKTtcbi1cdGlmIChWWEZTX0lTVFlQRUQodmlwKSlcbi1cdFx0cmV0dXJuIHZ4ZnNfYm1hcF90eXBlZChpcCwgaWJsb2NrKTtcbi1cdGlmIChWWEZTX0lTTk9ORSh2aXApKVxuLVx0XHRnb3RvIHVuc3VwcDtcbi1cdGlmIChWWEZTX0lTSU1NRUQodmlwKSlcbi1cdFx0Z290byB1bnN1cHA7XG4tXG4tXHRwcmludGsoS0VSTl9XQVJOSU5HIFwmIzM0O3Z4ZnM6IGlub2RlICVsbHUgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxcblwmIzM0Oyxcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdEJVRygpO1xuLVxuLXVuc3VwcDpcbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCYjMzQ7dnhmczogaW5vZGUgJWxsdSBoYXMgYW4gdW5zdXBwb3J0ZWQgb3JndHlwZSAoJXgpXFxuXCYjMzQ7LFxuLVx0XHRcdGlwLVx1MDAzZWlfaW5vLCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLVx0cmV0dXJuIDA7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDhjNjc2MjdmMmEzZDkuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmhcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDY4ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19ESVJfSF9cbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci5cbi0gKlxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cbi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlc1xuLSAqIGEgaGFzaCBmb3Igc3BlZWRpbmcgdXAgZGlyZWN0b3J5IHNlYXJjaCAobG9va3VwKS5cbi0gKlxuLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGVcbi0gKiBMaW51eCBkcml2ZXIgZm9yIG5vdy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaXJibGsge1xuLVx0X19mczE2XHRcdGRfZnJlZTtcdFx0LyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqL1xuLVx0X19mczE2XHRcdGRfbmhhc2g7XHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xuLVx0X19mczE2XHRcdGRfaGFzaFtdO1x0LyogaGFzaCBjaGFpbiAqL1xuLX07XG4tXG4tLypcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcbi0gKlx0b2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tI2RlZmluZSBWWEZTX05BTUVMRU5cdDI1NlxuLVxuLS8qXG4tICogVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tc3RydWN0IHZ4ZnNfZGlyZWN0IHtcbi1cdF9fZnMzMlx0XHRkX2lubztcdFx0XHQvKiBpbm9kZSBudW1iZXIgKi9cbi1cdF9fZnMxNlx0XHRkX3JlY2xlbjtcdFx0LyogcmVjb3JkIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfbmFtZWxlbjtcdFx0LyogZF9uYW1lIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfaGFzaG5leHQ7XHRcdC8qIG5leHQgaGFzaCBlbnRyeSAqL1xuLVx0Y2hhclx0XHRkX25hbWVbVlhGU19OQU1FTEVOXTtcdC8qIG5hbWUgKi9cbi19O1xuLVxuLS8qXG4tICogVlhGU19ESVJQQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJ5IGJvdW5kYXJpZXMsIGlzIF9tdXN0XyBiZVxuLSAqXHRhIG11bHRpcGxlIG9mIGZvdXIuXG4tICogVlhGU19OQU1FTUlOIGlzIHRoZSBsZW5ndGggb2YgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIE5VTEwgZF9uYW1lLlxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcbi0gKlx0dXNhYmxlIGZvciBkaXJlY3Rvcnkgc2l6ZXMuXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcbi0gKlx0YSBkX25hbWUgd2l0aCBzaXplIGxlbi5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSUEFEXHRcdDRcbi0jZGVmaW5lIFZYRlNfTkFNRU1JTlx0XHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcbi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKVx0KChWWEZTX0RJUlBBRCAmIzQzOyAobGVuKSAtIDEpIFx1MDAyNiB+KFZYRlNfRElSUEFEIC0xKSlcbi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbilcdChWWEZTX0RJUlJPVU5EKFZYRlNfTkFNRU1JTiAmIzQzOyAobGVuKSkpXG4tXG4tLypcbi0gKiBWWEZTX0RJUkJMS09WIGlzIHRoZSBvdmVyaGVhZCBvZiBhIHNwZWNpZmljIGRpcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19ESVJCTEtPVihzYmksIGRicClcdFxcXG4tXHQoKHNpemVvZihzaG9ydCkgKiBmczE2X3RvX2NwdShzYmksIGRicC1cdTAwM2VkX25oYXNoKSkgJiM0MzsgNClcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsNDkgJiM0MzswLDAgQEBcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0VYVEVSTl9IX1xuLSNkZWZpbmUgX1ZYRlNfRVhURVJOX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZXh0ZXJuYWwgcHJvdG90eXBlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyBwcm90b3R5cGVzIGZvciBhbGwgdnhmcyBmdW5jdGlvbnMgdXNlZFxuLSAqIG91dHNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBzb3VyY2UgZmlsZXMuXG4tICovXG4tXG4tXG4tc3RydWN0IGttZW1fY2FjaGU7XG4tc3RydWN0IHN1cGVyX2Jsb2NrO1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm87XG4tc3RydWN0IGlub2RlO1xuLVxuLVxuLS8qIHZ4ZnNfYm1hcC5jICovXG4tZXh0ZXJuIGRhZGRyX3RcdFx0XHR2eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqLCBsb25nKTtcbi1cbi0vKiB2eGZzX2ZzaGVhZC5jICovXG4tZXh0ZXJuIGludFx0XHRcdHZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICopO1xuLVxuLS8qIHZ4ZnNfaW5vZGUuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfaW1tZWRfYW9wcztcbi1leHRlcm4gdm9pZFx0XHRcdHZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqLCBpbm9fdCk7XG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVx0XHQqdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1X2xvbmcsIGlub190KTtcbi1leHRlcm4gc3RydWN0IGlub2RlXHRcdCp2eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpO1xuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcdFx0KnZ4ZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpO1xuLWV4dGVybiB2b2lkXHRcdFx0dnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7XG4tXG4tLyogdnhmc19sb29rdXAuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9uc1x0dnhmc19kaXJfaW5vZGVfb3BzO1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zXHR2eGZzX2Rpcl9vcGVyYXRpb25zO1xuLVxuLS8qIHZ4ZnNfb2x0LmMgKi9cbi1leHRlcm4gaW50XHRcdFx0dnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTtcbi1cbi0vKiB2eGZzX3N1YnIuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wcztcbi1leHRlcm4gc3RydWN0IHBhZ2UgKlx0XHR2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7XG4tZXh0ZXJuIHZvaWRcdFx0XHR2eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICopO1xuLWV4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlx0dnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRVhURVJOX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZTZhYjhiZGY3YTZjYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTY2ICYjNDM7MCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzZXQgaGVhZGVyIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnMuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2ZzaGVhZC5oXCYjMzQ7XG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfZHVtcGZzaChzdHJ1Y3Qgdnhmc19mc2ggKmZocClcbi17XG4tXHRwcmludGsoXCYjMzQ7XFxuXFxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcXG5cJiMzNDspO1xuLVx0cHJpbnRrKFwmIzM0Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cJiMzNDspO1xuLVx0cHJpbnRrKFwmIzM0O3ZlcnNpb246ICV1XFxuXCYjMzQ7LCBmaHAtXHUwMDNlZnNoX3ZlcnNpb24pO1xuLVx0cHJpbnRrKFwmIzM0O2ZzaW5kZXg6ICV1XFxuXCYjMzQ7LCBmaHAtXHUwMDNlZnNoX2ZzaW5kZXgpO1xuLVx0cHJpbnRrKFwmIzM0O2lhdWlubzogJXVcXHRuaW5vZGVzOiV1XFxuXCYjMzQ7LFxuLVx0XHRcdGZocC1cdTAwM2Vmc2hfaWF1aW5vLCBmaHAtXHUwMDNlZnNoX25pbm9kZXMpO1xuLVx0cHJpbnRrKFwmIzM0O21heGlub2RlOiAldVxcdGxjdGlubzogJXVcXG5cJiMzNDssXG4tXHRcdFx0ZmhwLVx1MDAzZWZzaF9tYXhpbm9kZSwgZmhwLVx1MDAzZWZzaF9sY3Rpbm8pO1xuLVx0cHJpbnRrKFwmIzM0O25hdTogJXVcXG5cJiMzNDssIGZocC1cdTAwM2Vmc2hfbmF1KTtcbi1cdHByaW50ayhcJiMzNDtpbGlzdGlub1swXTogJXVcXHRpbGlzdGlub1sxXTogJXVcXG5cJiMzNDssXG4tXHRcdFx0ZmhwLVx1MDAzZWZzaF9pbGlzdGlub1swXSwgZmhwLVx1MDAzZWZzaF9pbGlzdGlub1sxXSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeVxuLSAqIEBpcDpcdFx0dGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZVxuLSAqIEB3aGljaDpcdDAgZm9yIHRoZSBzdHJ1Y3R1cmFsLCAxIGZvciB0aGUgcHJpbWFyeSBmc2guXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfZ2V0ZnNoIHJlYWRzIGVpdGhlciB0aGUgc3RydWN0dXJhbCBvciBwcmltYXJ5IGZpbGVzZXQgaGVhZGVyXG4tICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19mc2ggKlxuLXZ4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaClcbi17XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwO1xuLVxuLVx0YnAgPSB2eGZzX2JyZWFkKGlwLCB3aGljaCk7XG4tXHRpZiAoYnApIHtcbi1cdFx0c3RydWN0IHZ4ZnNfZnNoXHRcdCpmaHA7XG4tXG4tXHRcdGlmICghKGZocCA9IGttYWxsb2Nfb2JqKCpmaHApKSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0bWVtY3B5KGZocCwgYnAtXHUwMDNlYl9kYXRhLCBzaXplb2YoKmZocCkpO1xuLVxuLVx0XHRwdXRfYmgoYnApO1xuLVx0XHRyZXR1cm4gKGZocCk7XG4tXHR9XG4tb3V0OlxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRfZnNoZWFkIC0gcmVhZCB0aGUgZmlsZXNldCBoZWFkZXJzXG4tICogQHNicDpcdHN1cGVyYmxvY2sgdG8gd2hpY2ggdGhlIGZpbGVzZXQgYmVsb25nc1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3JlYWRfZnNoZWFkIHdpbGwgZmlsbCB0aGUgaW5vZGUgYW5kIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbiBAc2IuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSAoLUVJTlZBTCkuXG4tICovXG4taW50XG4tdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicClcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCppbmZwID0gVlhGU19TQkkoc2JwKTtcbi1cdHN0cnVjdCB2eGZzX2ZzaFx0XHRcdCpwZnAsICpzZnA7XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXA7XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9mc2hpcCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsIGluZnAtXHUwMDNldnNpX2ZzaGlubyk7XG4tXHRpZiAoIWluZnAtXHUwMDNldnNpX2ZzaGlwKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2ggaW5vZGVcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbi1cbi1cdHZpcCA9IFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2ZzaGlwKTtcbi1cdGlmICghVlhGU19JU0ZTSCh2aXApKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiBmc2ggbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXG5cJiMzNDssXG4tXHRcdFx0XHR2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHByaW50ayhcJiMzNDt2eGZzOiBmc2ggaW5vZGUgZHVtcDpcXG5cJiMzNDspO1xuLVx0dnhmc19kdW1waSh2aXAsIGluZnAtXHUwMDNldnNpX2ZzaGlubyk7XG4tI2VuZGlmXG4tXG4tXHRzZnAgPSB2eGZzX2dldGZzaChpbmZwLVx1MDAzZXZzaV9mc2hpcCwgMCk7XG4tXHRpZiAoIXNmcCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxcblwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9IFxuLVxuLSNpZmRlZiBESUFHTk9TVElDXG4tXHR2eGZzX2R1bXBmc2goc2ZwKTtcbi0jZW5kaWZcbi1cbi1cdHBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtXHUwMDNldnNpX2ZzaGlwLCAxKTtcbi1cdGlmICghcGZwKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IHByaW1hcnkgZnNoXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBvdXRfZnJlZV9zZnA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChwZnApO1xuLSNlbmRpZlxuLVxuLVx0aW5mcC1cdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsXG4tXHRcdFx0ZnMzMl90b19jcHUoaW5mcCwgc2ZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IHN0cnVjdHVyYWwgbGlzdCBpbm9kZVxcblwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X2ZyZWVfcGZwO1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX3N0aWxpc3QpKSkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogc3RydWN0dXJhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxcblwmIzM0Oyxcbi1cdFx0XHRcdFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX3N0aWxpc3QpLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7IFxuLVx0XHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XG4tXHR9XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9pbGlzdCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBpbm9kZSBsaXN0IGlub2RlXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBvdXRfaXB1dF9zdGlsaXN0O1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O3Z4ZnM6IGlub2RlIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxuXCYjMzQ7LFxuLVx0XHRcdFx0VlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfaWxpc3QpLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7XG4tXHRcdGdvdG8gb3V0X2lwdXRfaWxpc3Q7XG4tXHR9XG4tXG4tXHRrZnJlZShwZnApO1xuLVx0a2ZyZWUoc2ZwKTtcbi1cdHJldHVybiAwO1xuLVxuLSBvdXRfaXB1dF9pbGlzdDpcbi0gXHRpcHV0KGluZnAtXHUwMDNldnNpX2lsaXN0KTtcbi0gb3V0X2lwdXRfc3RpbGlzdDpcbi0gXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLSBvdXRfZnJlZV9wZnA6XG4tXHRrZnJlZShwZnApO1xuLSBvdXRfZnJlZV9zZnA6XG4tIFx0a2ZyZWUoc2ZwKTtcbi0gb3V0X2lwdXRfZnNoaXA6XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX2ZzaGlwKTtcbi1cdHJldHVybiAtRUlOVkFMO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBkZmQyMTQ3NTk5YzQ5Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSw0MyAmIzQzOzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0ZTSEVBRF9IX1xuLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTXG4tICogZmlsZXNldCBoZWFkZXIuXG4tICovXG4tXG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19mc2gge1xuLVx0X19mczMyXHRcdGZzaF92ZXJzaW9uO1x0XHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2ZzaW5kZXg7XHRcdC8qIGZpbGVzZXQgaW5kZXggKi9cbi1cdF9fZnMzMlx0XHRmc2hfdGltZTtcdFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cbi1cdF9fZnMzMlx0XHRmc2hfdXRpbWU7XHRcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdGZzaF9leHRvcDtcdFx0LyogZXh0b3AgZmxhZ3MgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbmlub2RlcztcdFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdGZzaF9uYXU7XHRcdC8qIG51bWJlciBvZiBJQVVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX29sZF9pbGVzaXplO1x0Lyogb2xkIHNpemUgb2YgaWxpc3QgKi9cbi1cdF9fZnMzMlx0XHRmc2hfZGZsYWdzO1x0XHQvKiBmbGFncyAqL1xuLVx0X19mczMyXHRcdGZzaF9xdW90YTtcdFx0LyogcXVvdGEgbGltaXQgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbWF4aW5vZGU7XHRcdC8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lhdWlubztcdFx0LyogSUFVIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lsaXN0aW5vWzJdO1x0LyogaWxpc3QgaW5vZGVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2xjdGlubztcdFx0LyogbGluayBjb3VudCB0YWJsZSBpbm9kZSAqL1xuLVxuLVx0Lypcbi1cdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcbi1cdCAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZFxuLVx0ICogIGIpIGRpZmZlciBhIGxvdCBpbiBkaWZmZXJlbnQgdnhmcyB2ZXJzaW9ucy9wb3J0c1xuLVx0ICovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsNTMgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBwb3J0IGZvciAmIzM5O2ltbWVkJiMzOTsgaW5vZGVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19pbm9kZS5oXCYjMzQ7XG4tXG4tLyoqXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXG4tICogQGZwOlx0XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ltbWVkX3JlYWRfZm9saW8gcmVhZHMgYSBwYXJ0IG9mIHRoZSBpbW1lZCBhcmVhIG9mIHRoZVxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKlxuLSAqIExvY2tpbmcgc3RhdHVzOlxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2Vob3N0KTtcbi1cdHZvaWQgKnNyYyA9IHZpcC1cdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQgJiM0MzsgZm9saW9fcG9zKGZvbGlvKTtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsgaSYjNDM7JiM0MzspIHtcbi1cdFx0bWVtY3B5X3RvX3BhZ2UoZm9saW9fcGFnZShmb2xpbywgaSksIDAsIHNyYywgUEFHRV9TSVpFKTtcbi1cdFx0c3JjICYjNDM7PSBQQUdFX1NJWkU7XG4tXHR9XG4tXG4tXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbi1cdGZvbGlvX3VubG9jayhmb2xpbyk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tLypcbi0gKiBBZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy5cbi0gKi9cbi1jb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfaW1tZWRfYW9wcyA9IHtcbi1cdC5yZWFkX2ZvbGlvID1cdHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyxcbi19O1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyMWZjOTRiOTgyMDlmLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDMxNCAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBpbm9kZSByb3V0aW5lcy5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnMuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLS8qXG4tICogRHVtcCBpbm9kZSBjb250ZW50cyAocGFydGlhbGx5KS5cbi0gKi9cbi12b2lkXG4tdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubylcbi17XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtcXG5cXG5cJiMzNDspO1xuLVx0aWYgKGlubylcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7ZHVtcGluZyB2eGZzIGlub2RlICVsZFxcblwmIzM0OywgaW5vKTtcbi1cdGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7ZHVtcGluZyB1bmtub3duIHZ4ZnMgaW5vZGVcXG5cJiMzNDspO1xuLVxuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCYjMzQ7KTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O21vZGUgaXMgJXhcXG5cJiMzNDssIHZpcC1cdTAwM2V2aWlfbW9kZSk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcXG5cJiMzNDssXG4tXHRcdFx0dmlwLVx1MDAzZXZpaV9ubGluaywgdmlwLVx1MDAzZXZpaV91aWQsIHZpcC1cdTAwM2V2aWlfZ2lkKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3NpemU6JUx4LCBibG9ja3M6JXVcXG5cJiMzNDssXG4tXHRcdFx0dmlwLVx1MDAzZXZpaV9zaXplLCB2aXAtXHUwMDNldmlpX2Jsb2Nrcyk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtvcmd0eXBlOiV1XFxuXCYjMzQ7LCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX3RyYW5zbW9kIC0gbW9kZSBmb3IgYSBWeEZTIGlub2RlXG4tICogQHZpcDpcdFZ4RlMgaW5vZGVcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cbi0gKiAgVnhGUyBpbm9kZSBzdHJ1Y3R1cmUuXG4tICovXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxuLXZ4ZnNfdHJhbnNtb2Qoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKVxuLXtcbi1cdHVtb2RlX3RcdFx0XHRyZXQgPSB2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcbi1cbi1cdGlmIChWWEZTX0lTRklGTyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRklGTztcbi1cdGlmIChWWEZTX0lTQ0hSKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGQ0hSO1xuLVx0aWYgKFZYRlNfSVNESVIodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZESVI7XG4tXHRpZiAoVlhGU19JU0JMSyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRkJMSztcbi1cdGlmIChWWEZTX0lTTE5LKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGTE5LO1xuLVx0aWYgKFZYRlNfSVNSRUcodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZSRUc7XG4tXHRpZiAoVlhGU19JU1NPQyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRlNPQ0s7XG4tXG4tXHRyZXR1cm4gKHJldCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXG4te1xuLVx0c3RydWN0IGlub2RlICppbm9kZSA9IFx1MDAyNnZpcC1cdTAwM2V2ZnNfaW5vZGU7XG4tXG4tXHR2aXAtXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfbW9kZSk7XG4tXHR2aXAtXHUwMDNldmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX25saW5rKTtcbi1cdHZpcC1cdTAwM2V2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3VpZCk7XG4tXHR2aXAtXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9naWQpO1xuLVx0dmlwLVx1MDAzZXZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3NpemUpO1xuLVx0dmlwLVx1MDAzZXZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9vcmd0eXBlID0gZGlwLVx1MDAzZXZkaV9vcmd0eXBlO1xuLVxuLVx0dmlwLVx1MDAzZXZpaV9ibG9ja3MgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfYmxvY2tzKTtcbi1cdHZpcC1cdTAwM2V2aWlfZ2VuID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX2dlbik7XG4tXG4tXHRpZiAoVlhGU19JU0RJUih2aXApKVxuLVx0XHR2aXAtXHUwMDNldmlpX2RvdGRvdCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9kb3Rkb3QpO1xuLVx0ZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSBcdTAwMjZcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcbi1cdFx0dmlwLVx1MDAzZXZpaV9yZGV2ID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3JkZXYpO1xuLVxuLVx0LyogZG9uJiMzOTt0IGVuZGlhbiBzd2FwIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYnkgb3JndHlwZSAqL1xuLVx0bWVtY3B5KFx1MDAyNnZpcC1cdTAwM2V2aWlfb3JnLCBcdTAwMjZkaXAtXHUwMDNldmRpX29yZywgc2l6ZW9mKHZpcC1cdTAwM2V2aWlfb3JnKSk7XG4tXG4tXHRpbm9kZS1cdTAwM2VpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7XG4tXHRpX3VpZF93cml0ZShpbm9kZSwgKHVpZF90KXZpcC1cdTAwM2V2aWlfdWlkKTtcbi1cdGlfZ2lkX3dyaXRlKGlub2RlLCAoZ2lkX3QpdmlwLVx1MDAzZXZpaV9naWQpO1xuLVxuLVx0c2V0X25saW5rKGlub2RlLCB2aXAtXHUwMDNldmlpX25saW5rKTtcbi1cdGlub2RlLVx1MDAzZWlfc2l6ZSA9IHZpcC1cdTAwM2V2aWlfc2l6ZTtcbi1cbi1cdGlub2RlX3NldF9hdGltZShpbm9kZSwgdmlwLVx1MDAzZXZpaV9hdGltZSwgMCk7XG4tXHRpbm9kZV9zZXRfY3RpbWUoaW5vZGUsIHZpcC1cdTAwM2V2aWlfY3RpbWUsIDApO1xuLVx0aW5vZGVfc2V0X210aW1lKGlub2RlLCB2aXAtXHUwMDNldmlpX210aW1lLCAwKTtcbi1cbi1cdGlub2RlLVx1MDAzZWlfYmxvY2tzID0gdmlwLVx1MDAzZXZpaV9ibG9ja3M7XG4tXHRpbm9kZS1cdTAwM2VpX2dlbmVyYXRpb24gPSB2aXAtXHUwMDNldmlpX2dlbjtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibGtpZ2V0IC0gZmluZCBpbm9kZSBiYXNlZCBvbiBleHRlbnQgI1xuLSAqIEBzYnA6XHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpblxuLSAqIEBleHRlbnQ6XHRudW1iZXIgb2YgdGhlIGV4dGVudCB0byBzZWFyY2hcbi0gKiBAaW5vOlx0aW5vZGUgbnVtYmVyIHRvIHNlYXJjaFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIHZ4ZnNfYmxraWdldCBzZWFyY2hlcyBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieVxuLSAqICBAc2JwIGluIHRoZSBleHRlbnQgQGV4dGVudC5cbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqXG4tICogTk9URTpcbi0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZVxuLSAqICBidWZmZXJjYWNoZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUgdGhlXG4tICogIHJlYWRfc3VwZXIoKSBtZXRob2QsIG90aGVyd2lzZSB0aGUgZGF0YSBtYXkgYmUgaW5jb2hlcmVudC5cbi0gKi9cbi1zdHJ1Y3QgaW5vZGUgKlxuLXZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGV4dGVudCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZFx0XHQqYnA7XG4tXHRzdHJ1Y3QgaW5vZGVcdFx0XHQqaW5vZGU7XG4tXHR1X2xvbmdcdFx0XHRcdGJsb2NrLCBvZmZzZXQ7XG4tXG4tXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xuLVx0aWYgKCFpbm9kZSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRpbm9kZS1cdTAwM2VpX2lubyA9IGdldF9uZXh0X2lubygpO1xuLVxuLVx0YmxvY2sgPSBleHRlbnQgJiM0MzsgKChpbm8gKiBWWEZTX0lTSVpFKSAvIHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4tXHRvZmZzZXQgPSAoKGlubyAlIChzYnAtXHUwMDNlc19ibG9ja3NpemUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFKTtcbi1cdGJwID0gc2JfYnJlYWQoc2JwLCBibG9jayk7XG4tXG4tXHRpZiAoYnAgXHUwMDI2XHUwMDI2IGJ1ZmZlcl9tYXBwZWQoYnApKSB7XG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cdCp2aXAgPSBWWEZTX0lOTyhpbm9kZSk7XG4tXHRcdHN0cnVjdCB2eGZzX2Rpbm9kZVx0KmRpcDtcbi1cbi1cdFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShicC1cdTAwM2ViX2RhdGEgJiM0Mzsgb2Zmc2V0KTtcbi1cdFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xuLVx0XHR2aXAtXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcbi0jZW5kaWZcbi1cdFx0YnJlbHNlKGJwKTtcbi1cdFx0cmV0dXJuIGlub2RlO1xuLVx0fVxuLVxuLVx0cHJpbnRrKEtFUk5fV0FSTklORyBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBibG9jayAlbGRcXG5cJiMzNDssIGJsb2NrKTtcbi1cdGJyZWxzZShicCk7XG4tXHRpcHV0KGlub2RlKTtcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi0vKipcbi0gKiBfX3Z4ZnNfaWdldCAtIGdlbmVyaWMgZmluZCBpbm9kZSBmYWNpbGl0eVxuLSAqIEBpbGlzdHA6XHRcdGlub2RlIGxpc3Rcbi0gKiBAdmlwOlx0XHRWeEZTIGlub2RlIHRvIGZpbGwgaW5cbi0gKiBAaW5vOlx0XHRpbm9kZSBudW1iZXJcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbVxuLSAqICBkZXNjcmliZWQgYnkgQHNicC4gIFVzZSB0aGUgc3BlY2lmaWVkIGlub2RlIHRhYmxlIChAaWxpc3RwKS5cbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhbiBlcnJvciBjb2RlLlxuLSAqL1xuLXN0YXRpYyBpbnRcbi1fX3Z4ZnNfaWdldChzdHJ1Y3QgaW5vZGUgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IHBhZ2VcdFx0XHQqcHA7XG4tXHR1X2xvbmdcdFx0XHRcdG9mZnNldDtcbi1cbi1cdG9mZnNldCA9IChpbm8gJSAoUEFHRV9TSVpFIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRTtcbi1cdHBwID0gdnhmc19nZXRfcGFnZShpbGlzdHAtXHUwMDNlaV9tYXBwaW5nLCBpbm8gKiBWWEZTX0lTSVpFIC8gUEFHRV9TSVpFKTtcbi1cbi1cdGlmICghSVNfRVJSKHBwKSkge1xuLVx0XHRzdHJ1Y3Qgdnhmc19kaW5vZGVcdCpkaXA7XG4tXHRcdGNhZGRyX3RcdFx0XHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcbi1cbi1cdFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShrYWRkciAmIzQzOyBvZmZzZXQpO1xuLVx0XHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXHUwMDNlaV9zYiksIHZpcCwgZGlwKTtcbi1cdFx0dmlwLVx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc19kdW1waSh2aXAsIGlubyk7XG4tI2VuZGlmXG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCYjMzQ7dnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcXG5cJiMzNDssXG4tXHRcdHBwLCAodW5zaWduZWQgbG9uZylpbm8pO1xuLVx0cmV0dXJuIFBUUl9FUlIocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3N0aWdldCAtIGZpbmQgaW5vZGUgdXNpbmcgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdFxuLSAqIEBzYnA6XHRWRlMgc3VwZXJibG9ja1xuLSAqIEBpbm86XHRpbm9kZSAjXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nXG4tICogIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QuXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICovXG4tc3RydWN0IGlub2RlICpcbi12eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xuLVx0aWYgKCFpbm9kZSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRpbm9kZS1cdTAwM2VpX2lubyA9IGdldF9uZXh0X2lubygpO1xuLVxuLVx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVx1MDAzZXZzaV9zdGlsaXN0LCBWWEZTX0lOTyhpbm9kZSksIGlubyk7XG4tXHRpZiAoZXJyb3IpIHtcbi1cdFx0aXB1dChpbm9kZSk7XG4tXHRcdHJldHVybiBOVUxMO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGlub2RlO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2lnZXQgLSBnZXQgYW4gaW5vZGVcbi0gKiBAc2JwOlx0dGhlIHN1cGVyYmxvY2sgdG8gZ2V0IHRoZSBpbm9kZSBmb3Jcbi0gKiBAaW5vOlx0dGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gZ2V0XG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19yZWFkX2lub2RlIGNyZWF0ZXMgYW4gaW5vZGUsIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaW5vIGFuZCBmaWxsc1xuLSAqICBpbiBhbGwgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBuZXcgaW5vZGUuXG4tICovXG4tc3RydWN0IGlub2RlICpcbi12eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXA7XG4tXHRjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zXHQqYW9wcztcbi1cdHN0cnVjdCBpbm9kZSAqaXA7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpcCA9IGlnZXRfbG9ja2VkKHNicCwgaW5vKTtcbi1cdGlmICghaXApXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuLVx0aWYgKCEoaW5vZGVfc3RhdGVfcmVhZF9vbmNlKGlwKSBcdTAwMjYgSV9ORVcpKVxuLVx0XHRyZXR1cm4gaXA7XG4tXG4tXHR2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXHRlcnJvciA9IF9fdnhmc19pZ2V0KFZYRlNfU0JJKHNicCktXHUwMDNldnNpX2lsaXN0LCB2aXAsIGlubyk7XG4tXHRpZiAoZXJyb3IpIHtcbi1cdFx0aWdldF9mYWlsZWQoaXApO1xuLVx0XHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XG4tXHR9XG4tXG4tXHRpZiAoVlhGU19JU0lNTUVEKHZpcCkpXG4tXHRcdGFvcHMgPSBcdTAwMjZ2eGZzX2ltbWVkX2FvcHM7XG4tXHRlbHNlXG4tXHRcdGFvcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tXG4tXHRpZiAoU19JU1JFRyhpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlwLVx1MDAzZWlfZm9wID0gXHUwMDI2Z2VuZXJpY19yb19mb3BzO1xuLVx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBhb3BzO1xuLVx0fSBlbHNlIGlmIChTX0lTRElSKGlwLVx1MDAzZWlfbW9kZSkpIHtcbi1cdFx0aXAtXHUwMDNlaV9vcCA9IFx1MDAyNnZ4ZnNfZGlyX2lub2RlX29wcztcbi1cdFx0aXAtXHUwMDNlaV9mb3AgPSBcdTAwMjZ2eGZzX2Rpcl9vcGVyYXRpb25zO1xuLVx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBhb3BzO1xuLVx0fSBlbHNlIGlmIChTX0lTTE5LKGlwLVx1MDAzZWlfbW9kZSkpIHtcbi1cdFx0aWYgKCFWWEZTX0lTSU1NRUQodmlwKSkge1xuLVx0XHRcdGlwLVx1MDAzZWlfb3AgPSBcdTAwMjZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcbi1cdFx0XHRpbm9kZV9ub2hpZ2htZW0oaXApO1xuLVx0XHRcdGlwLVx1MDAzZWlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRpcC1cdTAwM2VpX29wID0gXHUwMDI2c2ltcGxlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcbi1cdFx0XHRpcC1cdTAwM2VpX2xpbmsgPSB2aXAtXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkO1xuLVx0XHRcdG5kX3Rlcm1pbmF0ZV9saW5rKGlwLVx1MDAzZWlfbGluaywgaXAtXHUwMDNlaV9zaXplLFxuLVx0XHRcdFx0XHQgIHNpemVvZih2aXAtXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpO1xuLVx0XHR9XG4tXHR9IGVsc2Vcbi1cdFx0aW5pdF9zcGVjaWFsX2lub2RlKGlwLCBpcC1cdTAwM2VpX21vZGUsIG9sZF9kZWNvZGVfZGV2KHZpcC1cdTAwM2V2aWlfcmRldikpO1xuLVxuLVx0dW5sb2NrX25ld19pbm9kZShpcCk7XG4tXHRyZXR1cm4gaXA7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfZXZpY3RfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeVxuLSAqIEBpcDpcdFx0aW5vZGUgdG8gZGlzY2FyZC5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX2V2aWN0X2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZVxuLSAqICBpbm9kZSBhcmVhLlxuLSAqL1xuLXZvaWRcbi12eGZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaXApXG4te1xuLVx0dHJ1bmNhdGVfaW5vZGVfcGFnZXNfZmluYWwoXHUwMDI2aXAtXHUwMDNlaV9kYXRhKTtcbi1cdGNsZWFyX2lub2RlKGlwKTtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDFlOWUxMzhkMmIzMzguLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTY5ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cbi0jZGVmaW5lIF9WWEZTX0lOT0RFX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uXG4tICovXG4tXG4tXG4tI2RlZmluZSBWWEZTX0lTSVpFXHRcdDB4MTAwXHRcdC8qIElub2RlIHNpemUgKi9cbi1cbi0jZGVmaW5lIFZYRlNfTkRBRERSXHRcdDEwXHRcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cbi0jZGVmaW5lIFZYRlNfTklBRERSXHRcdDJcdFx0LyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05JTU1FRFx0XHQ5Nlx0XHQvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05UWVBFRFx0XHQ2XHRcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0tcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXG4tI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLXHQoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKVxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcdDU2XG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXG4tXHQoKHNicCktXHUwMDNlc19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKVxuLVxuLS8qXG4tICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19UWVBFRF9JTkRJUkVDVFx0XHQ9IDEsXG4tXHRWWEZTX1RZUEVEX0RBVEFcdFx0XHQ9IDIsXG4tXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcdD0gMyxcbi1cdFZYRlNfVFlQRURfREFUQV9ERVY0XHRcdD0gNCxcbi19O1xuLVxuLS8qXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxuLSAqL1xuLXN0cnVjdCB2eGZzX2ltbWVkIHtcbi1cdF9fdThcdFx0XHR2aV9pbW1lZFtWWEZTX05JTU1FRF07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc19leHQ0IHtcbi1cdF9fZnMzMlx0XHRcdHZlNF9zcGFyZTtcdFx0LyogPz8gKi9cbi1cdF9fZnMzMlx0XHRcdHZlNF9pbmRzaXplO1x0XHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xuLVx0X19mczMyXHRcdFx0dmU0X2luZGlyW1ZYRlNfTklBRERSXTtcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cbi1cdHN0cnVjdCBkaXJlY3Qge1x0XHRcdFx0XHQvKiBEaXJlY3QgZXh0ZW50cyAqL1xuLVx0XHRfX2ZzMzJcdFx0ZXh0ZW50O1x0XHRcdC8qIEV4dGVudCBudW1iZXIgKi9cbi1cdFx0X19mczMyXHRcdHNpemU7XHRcdFx0LyogU2l6ZSBvZiBleHRlbnQgKi9cbi1cdH0gdmU0X2RpcmVjdFtWWEZTX05EQUREUl07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZCB7XG4tXHRfX2ZzNjRcdFx0dnRfaGRyO1x0XHQvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqL1xuLVx0X19mczMyXHRcdHZ0X2Jsb2NrO1x0LyogRXh0ZW50IGJsb2NrICovXG4tXHRfX2ZzMzJcdFx0dnRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHtcbi1cdF9fZnM2NFx0XHR2ZDRfaGRyO1x0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfYmxvY2s7XHQvKiBFeHRlbnQgYmxvY2sgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dmQ0X2RldjtcdC8qIERldmljZSBJRCAqL1xuLVx0X191OFx0XHRfX3BhZDE7XG4tfTtcbi1cbi0vKlxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaW5vZGUge1xuLVx0X19mczMyXHRcdHZkaV9tb2RlO1xuLVx0X19mczMyXHRcdHZkaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfdWlkO1x0LyogVUlEICovXG4tXHRfX2ZzMzJcdFx0dmRpX2dpZDtcdC8qIEdJRCAqL1xuLVx0X19mczY0XHRcdHZkaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdGltZTtcdC8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdXRpbWU7XHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9tdXRpbWU7XHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9jdGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2ZGlfYWZsYWdzO1x0LyogQWxsb2NhdGlvbiBmbGFncyAqL1xuLVx0X191OFx0XHR2ZGlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHRfX2ZzMTZcdFx0dmRpX2VvcGZsYWdzO1xuLVx0X19mczMyXHRcdHZkaV9lb3BkYXRhO1xuLVx0dW5pb24ge1xuLVx0XHRfX2ZzMzJcdFx0XHRyZGV2O1xuLVx0XHRfX2ZzMzJcdFx0XHRkb3Rkb3Q7XG4tXHRcdHN0cnVjdCB7XG4tXHRcdFx0X191MzJcdFx0cmVzZXJ2ZWQ7XG4tXHRcdFx0X19mczMyXHRcdGZpeGV4dHNpemU7XG4tXHRcdH0gaV9yZWd1bGFyO1xuLVx0XHRzdHJ1Y3Qge1xuLVx0XHRcdF9fZnMzMlx0XHRtYXRjaGlubztcbi1cdFx0XHRfX2ZzMzJcdFx0ZnNldGluZGV4O1xuLVx0XHR9IGlfdnhzcGVjO1xuLVx0XHRfX3U2NFx0XHRcdGFsaWduO1xuLVx0fSB2ZGlfZnRhcmVhO1xuLVx0X19mczMyXHRcdHZkaV9ibG9ja3M7XHQvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0X19mczY0XHRcdHZkaV92ZXJzaW9uO1x0LyogVmVyc2lvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZkaV9vcmc7XG4tXHRfX2ZzMzJcdFx0dmRpX2lhdHRyaW5vO1xuLX07XG4tXG4tI2RlZmluZSB2ZGlfcmRldlx0dmRpX2Z0YXJlYS5yZGV2XG4tI2RlZmluZSB2ZGlfZG90ZG90XHR2ZGlfZnRhcmVhLmRvdGRvdFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcdHZkaV9mdGFyZWEucmVndWxhci5maXhleHRzaXplXG4tI2RlZmluZSB2ZGlfbWF0Y2hpbm9cdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXG4tI2RlZmluZSB2ZGlfZnNldGluZGV4XHR2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXhcbi1cbi0jZGVmaW5lIHZkaV9pbW1lZFx0dmRpX29yZy5pbW1lZFxuLSNkZWZpbmUgdmRpX2V4dDRcdHZkaV9vcmcuZXh0NFxuLSNkZWZpbmUgdmRpX3R5cGVkXHR2ZGlfb3JnLnR5cGVkXG4tXG4tXG4tLypcbi0gKiBUaGUgaW5vZGUgYXMgcmVwcmVzZW50ZWQgaW4gdGhlIG1haW4gbWVtb3J5LlxuLSAqL1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xuLVx0c3RydWN0IGlub2RlXHR2ZnNfaW5vZGU7XG4tXG4tXHRfX3UzMlx0XHR2aWlfbW9kZTtcbi1cdF9fdTMyXHRcdHZpaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fdTMyXHRcdHZpaV91aWQ7XHQvKiBVSUQgKi9cbi1cdF9fdTMyXHRcdHZpaV9naWQ7XHQvKiBHSUQgKi9cbi1cdF9fdTY0XHRcdHZpaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X191MzJcdFx0dmlpX2F0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXG4tXHRfX3UzMlx0XHR2aWlfYXV0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqL1xuLVx0X191MzJcdFx0dmlpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX211dGltZTtcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXG4tXHRfX3UzMlx0XHR2aWlfY3RpbWU7XHQvKiBDcmVhdGUgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2aWlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHR1bmlvbiB7XG4tXHRcdF9fdTMyXHRcdFx0cmRldjtcbi1cdFx0X191MzJcdFx0XHRkb3Rkb3Q7XG4tXHR9IHZpaV9mdGFyZWE7XG4tXHRfX3UzMlx0XHR2aWlfYmxvY2tzO1x0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXG4tXHRfX3UzMlx0XHR2aWlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZpaV9vcmc7XG4tfTtcbi1cbi0jZGVmaW5lIHZpaV9yZGV2XHR2aWlfZnRhcmVhLnJkZXZcbi0jZGVmaW5lIHZpaV9kb3Rkb3RcdHZpaV9mdGFyZWEuZG90ZG90XG4tXG4tI2RlZmluZSB2aWlfaW1tZWRcdHZpaV9vcmcuaW1tZWRcbi0jZGVmaW5lIHZpaV9leHQ0XHR2aWlfb3JnLmV4dDRcbi0jZGVmaW5lIHZpaV90eXBlZFx0dmlpX29yZy50eXBlZFxuLVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xuLX1cbi1cbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwyNzMgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gbG9va3VwIGFuZCBvdGhlciBkaXJlY3RvcnkgcmVsYXRlZCBjb2RlLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGltZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2hpZ2htZW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCYjMzQ7dnhmcy5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19kaXIuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi0vKlxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS1cdTAwM2VzX2Jsb2Nrc2l6ZSkpXG4tXG4tXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlx0dnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTtcbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7XG4tXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xuLVx0Lmxvb2t1cCA9XHRcdHZ4ZnNfbG9va3VwLFxuLX07XG4tXG4tY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0ge1xuLVx0Lmxsc2VlayA9XHRcdGdlbmVyaWNfZmlsZV9sbHNlZWssXG4tXHQucmVhZCA9XHRcdFx0Z2VuZXJpY19yZWFkX2Rpcixcbi1cdC5pdGVyYXRlX3NoYXJlZCA9XHR2eGZzX3JlYWRkaXIsXG4tXHQuc2V0bGVhc2UgPVx0XHRnZW5lcmljX3NldGxlYXNlLFxuLX07XG4tXG4tXG4tLyoqXG4tICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeVxuLSAqIEBpcDpcdFx0ZGlyZWN0b3J5IGlub2RlXG4tICogQGRwOlx0XHRkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdFxuLSAqIEBwcHA6XHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcdTAwMjZzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5XG4tICogICBjYWNoZSBlbnRyeSBAZHAuICBAcHBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBhZ2UgdGhlIHJldHVyblxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19kaXJlY3QgKlxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXG4te1xuLVx0dV9sb25nIGJzaXplID0gaXAtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNvbnN0IGNoYXIgKm5hbWUgPSBkcC1cdTAwM2VkX25hbWUubmFtZTtcbi1cdGludCBuYW1lbGVuID0gZHAtXHUwMDNlZF9uYW1lLmxlbjtcbi1cdGxvZmZfdCBsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXHUwMDNlaV9zaXplKTtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGVfZXhpdCA9IE5VTEw7XG4tXHRsb2ZmX3QgcG9zID0gMDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLVx1MDAzZWlfc2IpO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICYjNDM7IChwb3MgXHUwMDI2IH5QQUdFX01BU0spKTtcbi1cdFx0XHRcdGludCBvdmVyaGVhZCA9IFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApO1xuLVxuLVx0XHRcdFx0cG9zICYjNDM7PSBvdmVyaGVhZDtcbi1cdFx0XHRcdHBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciAmIzQzOyBwZ19vZnMpO1xuLVxuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9yZWNsZW4pIHtcbi1cdFx0XHRcdHBvcyAmIzQzOz0gYnNpemUgLSAxO1xuLVx0XHRcdFx0cG9zIFx1MDAyNj0gfihic2l6ZSAtIDEpO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdHBnX29mcyAmIzQzOz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfcmVjbGVuKTtcbi1cdFx0XHRpZiAoIWRlLVx1MDAzZWRfaW5vKVxuLVx0XHRcdFx0Y29udGludWU7XG4tXG4tXHRcdFx0aWYgKG5hbWVsZW4gIT0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX25hbWVsZW4pKVxuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0aWYgKCFtZW1jbXAobmFtZSwgZGUtXHUwMDNlZF9uYW1lLCBuYW1lbGVuKSkge1xuLVx0XHRcdFx0KnBwcCA9IHBwO1xuLVx0XHRcdFx0ZGVfZXhpdCA9IGRlO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHRcdGlmICghZGVfZXhpdClcbi1cdFx0XHR2eGZzX3B1dF9wYWdlKHBwKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGRlX2V4aXQ7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfaW5vZGVfYnlfbmFtZSAtIGZpbmQgaW5vZGUgbnVtYmVyIGZvciBkZW50cnlcbi0gKiBAZGlwOlx0ZGlyZWN0b3J5IHRvIHNlYXJjaCBpblxuLSAqIEBkcDpcdFx0ZGVudHJ5IHdlIHNlYXJjaCBmb3Jcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mXG4tICogICB0aGUgcGF0aCBjb21wb25lbnQgZGVzY3JpYmVkIGJ5IEBkcCBpbiBAZGlwLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSB3YW50ZWQgaW5vZGUgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgaW5vX3Rcbi12eGZzX2lub2RlX2J5X25hbWUoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwKVxuLXtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdFx0XHQqZGU7XG4tXHRzdHJ1Y3QgcGFnZVx0XHRcdCpwcDtcbi1cdGlub190XHRcdFx0XHRpbm8gPSAwO1xuLVxuLVx0ZGUgPSB2eGZzX2ZpbmRfZW50cnkoZGlwLCBkcCwgXHUwMDI2cHApO1xuLVx0aWYgKGRlKSB7XG4tXHRcdGlubyA9IGZzMzJfdG9fY3B1KFZYRlNfU0JJKGRpcC1cdTAwM2VpX3NiKSwgZGUtXHUwMDNlZF9pbm8pO1xuLVx0XHRrdW5tYXAocHApO1xuLVx0XHRwdXRfcGFnZShwcCk7XG4tXHR9XG4tXHRcbi1cdHJldHVybiAoaW5vKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19sb29rdXAgLSBsb29rdXAgcGF0aG5hbWUgY29tcG9uZW50XG4tICogQGRpcDpcdGRpciBpbiB3aGljaCB3ZSBsb29rdXBcbi0gKiBAZHA6XHRcdGRlbnRyeSB3ZSBsb29rdXBcbi0gKiBAZmxhZ3M6XHRsb29rdXAgZmxhZ3Ncbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkXG4tICogICBieSBAZHAgaW4gQGRpcC5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBBIE5VTEwtcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBlbmNvZGVkXG4tICogICBpbiB0aGUgcmV0dXJuIHBvaW50ZXIuXG4tICovXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlxuLXZ4ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgdW5zaWduZWQgaW50IGZsYWdzKVxuLXtcbi1cdHN0cnVjdCBpbm9kZVx0XHQqaXAgPSBOVUxMO1xuLVx0aW5vX3RcdFx0XHRpbm87XG4tXHRcdFx0IFxuLVx0aWYgKGRwLVx1MDAzZWRfbmFtZS5sZW4gXHUwMDNlIFZYRlNfTkFNRUxFTilcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7XG4tXHRcdFx0XHQgXG4tXHRpbm8gPSB2eGZzX2lub2RlX2J5X25hbWUoZGlwLCBkcCk7XG4tXHRpZiAoaW5vKVxuLVx0XHRpcCA9IHZ4ZnNfaWdldChkaXAtXHUwMDNlaV9zYiwgaW5vKTtcbi1cdHJldHVybiBkX3NwbGljZV9hbGlhcyhpcCwgZHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5XG4tICogQGZwOlx0XHR0aGUgZGlyZWN0b3J5IHRvIHJlYWRcbi0gKiBAY3R4Olx0ZGlyX2NvbnRleHQgZm9yIGZpbGxkaXIvcmVhZGRpclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3JlYWRkaXIgZmlsbHMgQHJldHAgd2l0aCBkaXJlY3RvcnkgZW50cmllcyBmcm9tIEBmcFxuLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8uXG4tICovXG4tc3RhdGljIGludFxuLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuLXtcbi1cdHN0cnVjdCBpbm9kZVx0XHQqaXAgPSBmaWxlX2lub2RlKGZwKTtcbi1cdHN0cnVjdCBzdXBlcl9ibG9ja1x0KnNicCA9IGlwLVx1MDAzZWlfc2I7XG4tXHR1X2xvbmdcdFx0XHRic2l6ZSA9IHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGxvZmZfdFx0XHRcdHBvcywgbGltaXQ7XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqc2JpID0gVlhGU19TQkkoc2JwKTtcbi1cbi1cdGlmIChjdHgtXHUwMDNlcG9zID09IDApIHtcbi1cdFx0aWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdGN0eC1cdTAwM2Vwb3MmIzQzOyYjNDM7O1xuLVx0fVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMSkge1xuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgXCYjMzQ7Li5cJiMzNDssIDIsIFZYRlNfSU5PKGlwKS1cdTAwM2V2aWlfZG90ZG90LCBEVF9ESVIpKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRjdHgtXHUwMDNlcG9zJiM0MzsmIzQzOztcbi1cdH1cbi1cbi1cdGxpbWl0ID0gVlhGU19ESVJST1VORChpcC1cdTAwM2VpX3NpemUpO1xuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgXHUwMDNlIGxpbWl0KVxuLVx0XHRnb3RvIG91dDtcbi1cbi1cdHBvcyA9IGN0eC1cdTAwM2Vwb3MgXHUwMDI2IH4zTDtcbi1cbi1cdHdoaWxlIChwb3MgXHUwMDNjIGxpbWl0KSB7XG4tXHRcdHN0cnVjdCBwYWdlICpwcDtcbi1cdFx0Y2hhciAqa2FkZHI7XG4tXHRcdGludCBwZ19vZnMgPSBwb3MgXHUwMDI2IH5QQUdFX01BU0s7XG4tXHRcdGludCByYyA9IDA7XG4tXG4tXHRcdHBwID0gdnhmc19nZXRfcGFnZShpcC1cdTAwM2VpX21hcHBpbmcsIHBvcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4tXHRcdGlmIChJU19FUlIocHApKVxuLVx0XHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0XHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcbi1cbi1cdFx0d2hpbGUgKHBnX29mcyBcdTAwM2MgUEFHRV9TSVpFIFx1MDAyNlx1MDAyNiBwb3MgXHUwMDNjIGxpbWl0KSB7XG4tXHRcdFx0c3RydWN0IHZ4ZnNfZGlyZWN0ICpkZTtcbi1cbi1cdFx0XHRpZiAoKHBvcyBcdTAwMjYgKGJzaXplIC0gMSkpIFx1MDAzYyA0KSB7XG4tXHRcdFx0XHRzdHJ1Y3Qgdnhmc19kaXJibGsgKmRicCA9XG4tXHRcdFx0XHRcdChzdHJ1Y3Qgdnhmc19kaXJibGsgKilcbi1cdFx0XHRcdFx0IChrYWRkciAmIzQzOyAocG9zIFx1MDAyNiB+UEFHRV9NQVNLKSk7XG4tXHRcdFx0XHRpbnQgb3ZlcmhlYWQgPSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKTtcbi1cbi1cdFx0XHRcdHBvcyAmIzQzOz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgJiM0Mzs9IG92ZXJoZWFkO1xuLVx0XHRcdH1cbi1cdFx0XHRkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTtcbi1cbi1cdFx0XHRpZiAoIWRlLVx1MDAzZWRfcmVjbGVuKSB7XG4tXHRcdFx0XHRwb3MgJiM0Mzs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdHBvcyAmIzQzOz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX2lubylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdHJjID0gZGlyX2VtaXQoY3R4LCBkZS1cdTAwM2VkX25hbWUsXG4tXHRcdFx0XHRcdGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9uYW1lbGVuKSxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX2lubyksXG4tXHRcdFx0XHRcdERUX1VOS05PV04pO1xuLVx0XHRcdGlmICghcmMpIHtcbi1cdFx0XHRcdC8qIHRoZSBkaXIgZW50cnkgd2FzIG5vdCByZWFkLCBmaXggcG9zLiAqL1xuLVx0XHRcdFx0cG9zIC09IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRpZiAoIXJjKVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0Y3R4LVx1MDAzZXBvcyA9IHBvcyB8IDI7XG4tXG4tb3V0OlxuLVx0cmV0dXJuIDA7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIzZjM1MTg3YzI4OTYuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDEwNSAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qIFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCYjMzQ7dnhmcy5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19vbHQuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9mc2hlYWQoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICpmc2hwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cdTAwM2VvbHRfZnNpbm9bMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9pbGlzdChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9pZXh0KTtcbi1cdGluZnAtXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXHUwMDNlb2x0X2lleHRbMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHVfbG9uZ1xuLXZ4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0QlVHX09OKHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcbi1cdHJldHVybiAoYmxvY2sgKiAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcbi19XG4tXG4tXG4tLyoqXG4tICogdnhmc19yZWFkX29sdCAtIHJlYWQgb2x0XG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKiBAYnNpemU6XHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXG4tICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKi9cbi1pbnRcbi12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19vbHRcdFx0Km9wO1xuLVx0Y2hhclx0XHRcdCpvYWRkciwgKmVhZGRyO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC1cdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xuLVx0aWYgKCFicCB8fCAhYnAtXHUwMDNlYl9kYXRhKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X21hZ2ljKSAhPSBWWEZTX09MVF9NQUdJQykge1xuLVx0XHRwcmludGsoS0VSTl9OT1RJQ0UgXCYjMzQ7dnhmczogaXZhbGlkIG9sdCBtYWdpYyBudW1iZXJcXG5cJiMzNDspO1xuLVx0XHRnb3RvIGZhaWw7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogSXQgaXMgaW4gdGhlb3J5IHBvc3NpYmxlIHRoYXQgdnNpX29sdHNpemUgaXMgXHUwMDNlIDEuXG4tXHQgKiBJJiMzOTt2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSYjMzk7bSBsYXp5Li4gIC0taGNoXG4tXHQgKi9cbi1cdGlmIChpbmZwLVx1MDAzZXZzaV9vbHRzaXplIFx1MDAzZSAxKSB7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcJiMzNDt2eGZzOiBvbHRzaXplIFx1MDAzZSAxIGRldGVjdGVkLlxcblwmIzM0Oyk7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcJiMzNDt2eGZzOiBwbGVhc2Ugbm90aWZ5IGhjaEBpbmZyYWRlYWQub3JnXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBmYWlsO1xuLVx0fVxuLVxuLVx0b2FkZHIgPSBicC1cdTAwM2ViX2RhdGEgJiM0MzsgZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0ZWFkZHIgPSBicC1cdTAwM2ViX2RhdGEgJiM0MzsgKGluZnAtXHUwMDNldnNpX29sdHNpemUgKiBzYnAtXHUwMDNlc19ibG9ja3NpemUpO1xuLVxuLVx0d2hpbGUgKG9hZGRyIFx1MDAzYyBlYWRkcikge1xuLVx0XHRzdHJ1Y3Qgdnhmc19vbHRjb21tb25cdCpvY3AgPVxuLVx0XHRcdChzdHJ1Y3Qgdnhmc19vbHRjb21tb24gKilvYWRkcjtcbi1cdFx0XG4tXHRcdHN3aXRjaCAoZnMzMl90b19jcHUoaW5mcCwgb2NwLVx1MDAzZW9sdF90eXBlKSkge1xuLVx0XHRjYXNlIFZYRlNfT0xUX0ZTSEVBRDpcbi1cdFx0XHR2eGZzX2dldF9mc2hlYWQoKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqKW9hZGRyLCBpbmZwKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX09MVF9JTElTVDpcbi1cdFx0XHR2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0b2FkZHIgJiM0Mzs9IGZzMzJfdG9fY3B1KGluZnAsIG9jcC1cdTAwM2VvbHRfc2l6ZSk7XG4tXHR9XG4tXG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIChpbmZwLVx1MDAzZXZzaV9mc2hpbm8gXHUwMDI2XHUwMDI2IGluZnAtXHUwMDNldnNpX2lleHQpID8gMCA6IC1FSU5WQUw7XG4tXG4tZmFpbDpcbi1cdGJyZWxzZShicCk7XG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggNTNhZmJhMDhkNjE3Zi4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTIwICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cbi0jZGVmaW5lIF9WWEZTX09MVF9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxuLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVx1MDAzZW9sdF9tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1x0XHQweGE1MDRGQ0Y1XG4tXG4tLypcbi0gKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy5cbi0gKi9cbi1lbnVtIHtcbi1cdFZYRlNfT0xUX0ZSRUVcdD0gMSxcbi1cdFZYRlNfT0xUX0ZTSEVBRFx0PSAyLFxuLVx0VlhGU19PTFRfQ1VUXHQ9IDMsXG4tXHRWWEZTX09MVF9JTElTVFx0PSA0LFxuLVx0VlhGU19PTFRfREVWXHQ9IDUsXG4tXHRWWEZTX09MVF9TQlx0PSA2XG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgT0xUIGhlYWRlci5cbi0gKlxuLSAqIFRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgaGVhZGVyIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2hcbi0gKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHQge1xuLVx0X19mczMyXHRcdG9sdF9tYWdpYztcdC8qIG1hZ2ljIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgZW50cnlcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfY2hlY2tzdW07XHQvKiBjaGVja3N1bSBvZiBleHRlbnRcdFx0Ki9cbi1cdF9fdTMyXHRcdF9fdW51c2VkMTtcdC8qID8/P1x0XHRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXRpbWU7XHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAoc2VjKVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXV0aW1lO1x0LyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpXHQqL1xuLVx0X19mczMyXHRcdG9sdF90b3RmcmVlO1x0LyogZnJlZSBzcGFjZSBpbiBPTFQgZXh0ZW50XHQqL1xuLVx0X19mczMyXHRcdG9sdF9leHRlbnRzWzJdO1x0LyogYWRkciBvZiB0aGlzIGV4dGVudCwgcmVwbGljYVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfZXNpemU7XHQvKiBzaXplIG9mIHRoaXMgZXh0ZW50XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25leHRbMl07ICAgIC8qIGFkZHIgb2YgbmV4dCBleHRlbnQsIHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25zaXplO1x0Lyogc2l6ZSBvZiBuZXh0IGV4dGVudFx0XHQqL1xuLVx0X191MzJcdFx0X191bnVzZWQyO1x0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XHQqL1xuLX07XG4tXG4tLypcbi0gKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGNvbW1vbiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgZnJlZSBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFx0Ki9cbi19O1xuLVxuLS8qXG4tICogVnhGUyBpbml0aWFsLWlub2RlIGxpc3QgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGlsaXN0IHtcbi1cdF9fZnMzMlx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9pZXh0WzJdO1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXHQqL1xuLX07XG4tXG4tLypcbi0gKiBDdXJyZW50IFVzYWdlIFRhYmxlIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGN1dCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2N1dGlubztcdC8qIGlub2RlIG9mIGN1cnJlbnQgdXNhZ2UgdGFibGVcdCovXG4tXHRfX3U4XHRcdF9fcGFkO1x0XHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblx0XHQqL1xuLX07XG4tXG4tLypcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdHNiIHtcbi1cdF9fZnMzMlx0XHRvbHRfdHlwZTtcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2Jpbm87XHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcdCovXG4tXHRfX3UzMlx0XHRfX3VudXNlZDE7XHQvKiA/Pz9cdFx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2xvZ2lub1syXTtcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X29sdGlub1syXTtcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVx0Ki9cbi19O1xuLVxuLS8qXG4tICogSW5vZGUgY29udGFpbmluZyBkZXZpY2UgY29uZmlndXJhdGlvbiAmIzQzOyBpdCYjMzk7cyByZXBsaWNhIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGRldiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2Rldmlub1syXTtcdC8qIGlub2RlIG9mIGRldmljZSBjb25maWcgZmlsZXNcdCovXG4tfTtcbi1cbi0vKlxuLSAqIEZpbGVzZXQgaGVhZGVyIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZzaGVhZCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2ZzaW5vWzJdOyAgIC8qIGlub2RlcyBvZiBmaWxlc2V0IGhlYWRlclx0Ki9cbi19O1xuLVxuLSNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGY0Mzk4NzdlYTZlODAuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwxNTIgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZm9saW8gKik7XG4tc3RhdGljIHNlY3Rvcl90XHRcdHZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7XG4tXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2FvcHMgPSB7XG4tXHQucmVhZF9mb2xpbyA9XHRcdHZ4ZnNfcmVhZF9mb2xpbyxcbi1cdC5ibWFwID1cdFx0XHR2eGZzX2JtYXAsXG4tfTtcbi1cbi1pbmxpbmUgdm9pZFxuLXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBwKVxuLXtcbi1cdGt1bm1hcChwcCk7XG4tXHRwdXRfcGFnZShwcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS5cbi0gKiBAbWFwcGluZzpcdG1hcHBpbmcgdG8gcmVhZCBmcm9tXG4tICogQG46XHRcdHBhZ2UgbnVtYmVyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfZ2V0X3BhZ2UgcmVhZHMgdGhlIEBuIHRoIHBhZ2Ugb2YgQGlwIGludG8gdGhlIHBhZ2VjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIHBhZ2Ugb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci5cbi0gKi9cbi1zdHJ1Y3QgcGFnZSAqXG4tdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdV9sb25nIG4pXG4te1xuLVx0c3RydWN0IHBhZ2UgKlx0XHRcdHBwO1xuLVxuLVx0cHAgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBuLCBOVUxMKTtcbi1cbi1cdGlmICghSVNfRVJSKHBwKSkge1xuLVx0XHRrbWFwKHBwKTtcbi1cdFx0LyoqIGlmICghUGFnZUNoZWNrZWQocHApKSAqKi9cbi1cdFx0XHQvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovXG4tXHR9XG4tXHRcbi1cdHJldHVybiAocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JyZWFkIC0gcmVhZCBidWZmZXIgZm9yIGEgZ2l2ZSBpbm9kZSxibG9jayB0dXBsZVxuLSAqIEBpcDpcdFx0aW5vZGVcbi0gKiBAYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX2JyZWFkIGZ1bmN0aW9uIHJlYWRzIGJsb2NrIG5vIEBibG9jayAgb2Zcbi0gKiAgIEBpcCBpbnRvIHRoZSBidWZmZXJjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcmVzdWx0aW5nIFx1MDAyNnN0cnVjdCBidWZmZXJfaGVhZC5cbi0gKi9cbi1zdHJ1Y3QgYnVmZmVyX2hlYWQgKlxuLXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICppcCwgaW50IGJsb2NrKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZFx0KmJwO1xuLVx0ZGFkZHJfdFx0XHRcdHBibG9jaztcbi1cbi1cdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGJsb2NrKTtcbi1cdGJwID0gc2JfYnJlYWQoaXAtXHUwMDNlaV9zYiwgcGJsb2NrKTtcbi1cbi1cdHJldHVybiAoYnApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2dldGJsayAtIGxvY2F0ZSBidWZmZXIgZm9yIGdpdmVuIGlub2RlLGJsb2NrIHR1cGxlXG4tICogQGlwOlx0XHRpbm9kZVxuLSAqIEBpYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICogQGJwOlx0XHRidWZmZXIgc2tlbGV0b25cbi0gKiBAY3JlYXRlOlx0JVRSVUUgaWYgYmxvY2tzIG1heSBiZSBuZXdseSBhbGxvY2F0ZWQuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX2dldGJsayBmdW5jdGlvbiBmaWxscyBAYnAgd2l0aCB0aGUgcmlnaHQgcGh5c2ljYWxcbi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uXG4tICogICBpdC5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2IGVycm9yIGNvZGUgKC1FSU8pLlxuLSAqL1xuLXN0YXRpYyBpbnRcbi12eGZzX2dldGJsayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBpYmxvY2ssXG4tXHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSlcbi17XG4tXHRkYWRkcl90XHRcdFx0cGJsb2NrO1xuLVxuLVx0cGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTtcbi1cdGlmIChwYmxvY2sgIT0gMCkge1xuLVx0XHRtYXBfYmgoYnAsIGlwLVx1MDAzZWlfc2IsIHBibG9jayk7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0cmV0dXJuIC1FSU87XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfcmVhZF9mb2xpbyAtIHJlYWQgb25lIHBhZ2Ugc3luY2hyb25vdXNseSBpbnRvIHRoZSBwYWdlY2FjaGVcbi0gKiBAZmlsZTpcdGZpbGUgY29udGV4dCAodW51c2VkKVxuLSAqIEBmb2xpbzpcdGZvbGlvIHRvIGZpbGwgaW4uXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX3JlYWRfZm9saW8gcm91dGluZSByZWFkcyBAZm9saW8gc3luY2hyb25vdXNseSBpbnRvIHRoZVxuLSAqICAgcGFnZWNhY2hlLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICpcbi0gKiBMb2NraW5nIHN0YXR1czpcbi0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuXG4tICovXG4tc3RhdGljIGludCB2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0cmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9mb2xpbyhmb2xpbywgdnhmc19nZXRibGspO1xuLX1cbi0gXG4tLyoqXG4tICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmdcbi0gKiBAbWFwcGluZzpcdGxvZ2ljYWwgdG8gcGh5c2ljYWwgbWFwcGluZyB0byB1c2Vcbi0gKiBAYmxvY2s6XHRsb2dpY2FsIGJsb2NrIChyZWxhdGl2ZSB0byBAbWFwcGluZykuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFZ4ZnNfYm1hcCBmaW5kIG91dCB0aGUgY29ycmVzcG9uZGluZyBwaHNpY2FsIGJsb2NrIHRvIHRoZVxuLSAqICAgQG1hcHBpbmcsIEBibG9jayBwYWlyLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICpcbi0gKiBMb2NraW5nIHN0YXR1czpcbi0gKiAgIFdlIGFyZSB1bmRlciB0aGUgYmtsLlxuLSAqL1xuLXN0YXRpYyBzZWN0b3JfdFxuLXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spXG4te1xuLVx0cmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgdnhmc19nZXRibGspO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZDdkODQ3ZDc1YzNkNS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwzNDcgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrZGV2LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdmZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19kaXIuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLVxuLVxuLU1PRFVMRV9BVVRIT1IoXCYjMzQ7Q2hyaXN0b3BoIEhlbGx3aWcsIEtyenlzenRvZiBCbGFzemtvd3NraVwmIzM0Oyk7XG4tTU9EVUxFX0RFU0NSSVBUSU9OKFwmIzM0O1Zlcml0YXMgRmlsZXN5c3RlbSAoVnhGUykgZHJpdmVyXCYjMzQ7KTtcbi1NT0RVTEVfTElDRU5TRShcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuLVxuLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdnhmc19pbm9kZV9jYWNoZXA7XG4tXG4tLyoqXG4tICogdnhmc19wdXRfc3VwZXIgLSBmcmVlIHN1cGVyYmxvY2sgcmVzb3VyY2VzXG4tICogQHNicDpcdFZGUyBzdXBlcmJsb2NrLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3B1dF9zdXBlciBmcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgQHNicFxuLSAqICAgYWZ0ZXIgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkLlxuLSAqL1xuLVxuLXN0YXRpYyB2b2lkXG4tdnhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVxuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9mc2hpcCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX2lsaXN0KTtcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfc3RpbGlzdCk7XG4tXG4tXHRicmVsc2UoaW5mcC1cdTAwM2V2c2lfYnApO1xuLVx0a2ZyZWUoaW5mcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfc3RhdGZzIC0gZ2V0IGZpbGVzeXN0ZW0gaW5mb3JtYXRpb25cbi0gKiBAZGVudHJ5Olx0VkZTIGRlbnRyeSB0byBsb2NhdGUgc3VwZXJibG9ja1xuLSAqIEBidWZwOlx0b3V0cHV0IGJ1ZmZlclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3N0YXRmcyBmaWxscyB0aGUgc3RhdGZzIGJ1ZmZlciBAYnVmcCB3aXRoIGluZm9ybWF0aW9uXG4tICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQGRlbnRyeS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvLlxuLSAqXG4tICogTG9ja2luZzpcbi0gKiAgIE5vIGxvY2tzIGhlbGQuXG4tICpcbi0gKiBOb3Rlczpcbi0gKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmcClcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCppbmZwID0gVlhGU19TQkkoZGVudHJ5LVx1MDAzZWRfc2IpO1xuLVx0c3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtXHUwMDNldnNpX3Jhdztcbi1cdHU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihkZW50cnktXHUwMDNlZF9zYi1cdTAwM2VzX2JkZXYtXHUwMDNlYmRfZGV2KTtcbi1cbi1cdGJ1ZnAtXHUwMDNlZl90eXBlID0gVlhGU19TVVBFUl9NQUdJQztcbi1cdGJ1ZnAtXHUwMDNlZl9ic2l6ZSA9IGRlbnRyeS1cdTAwM2VkX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0YnVmcC1cdTAwM2VmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cdTAwM2V2c19kc2l6ZSk7XG4tXHRidWZwLVx1MDAzZWZfYmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfZnJlZSk7XG4tXHRidWZwLVx1MDAzZWZfYmF2YWlsID0gMDtcbi1cdGJ1ZnAtXHUwMDNlZl9maWxlcyA9IDA7XG4tXHRidWZwLVx1MDAzZWZfZmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfaWZyZWUpO1xuLVx0YnVmcC1cdTAwM2VmX2ZzaWQgPSB1NjRfdG9fZnNpZChpZCk7XG4tXHRidWZwLVx1MDAzZWZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHN5bmNfZmlsZXN5c3RlbShmYy1cdTAwM2Vyb290LVx1MDAzZWRfc2IpO1xuLVx0ZmMtXHUwMDNlc2JfZmxhZ3MgfD0gU0JfUkRPTkxZO1xuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnZ4ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aTtcbi1cbi1cdHZpID0gYWxsb2NfaW5vZGVfc2Ioc2IsIHZ4ZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdmkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0aW5vZGVfaW5pdF9vbmNlKFx1MDAyNnZpLVx1MDAzZXZmc19pbm9kZSk7XG4tXHRyZXR1cm4gXHUwMDI2dmktXHUwMDNldmZzX2lub2RlO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCB2eGZzX2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRrbWVtX2NhY2hlX2ZyZWUodnhmc19pbm9kZV9jYWNoZXAsIFZYRlNfSU5PKGlub2RlKSk7XG4tfVxuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2eGZzX3N1cGVyX29wcyA9IHtcbi1cdC5hbGxvY19pbm9kZVx0XHQ9IHZ4ZnNfYWxsb2NfaW5vZGUsXG4tXHQuZnJlZV9pbm9kZVx0XHQ9IHZ4ZnNfZnJlZV9pbm9kZSxcbi1cdC5ldmljdF9pbm9kZVx0XHQ9IHZ4ZnNfZXZpY3RfaW5vZGUsXG4tXHQucHV0X3N1cGVyXHRcdD0gdnhmc19wdXRfc3VwZXIsXG4tXHQuc3RhdGZzXHRcdFx0PSB2eGZzX3N0YXRmcyxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc190cnlfc2JfbWFnaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYyxcbi1cdFx0dW5zaWduZWQgYmxrLCBfX2ZzMzIgbWFnaWMpXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkICpicDtcbi1cdHN0cnVjdCB2eGZzX3NiICpyc2JwO1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCA9IFZYRlNfU0JJKHNicCk7XG4tXHRpbnQgc2lsZW50ID0gZmMtXHUwMDNlc2JfZmxhZ3MgXHUwMDI2IFNCX1NJTEVOVDtcbi1cdGludCByYyA9IC1FTk9NRU07XG4tXG4tXHRicCA9IHNiX2JyZWFkKHNicCwgYmxrKTtcbi1cdGRvIHtcbi1cdFx0aWYgKCFicCB8fCAhYnVmZmVyX21hcHBlZChicCkpIHtcbi1cdFx0XHRpZiAoIXNpbGVudCkge1xuLVx0XHRcdFx0d2FybmYoZmMsXG4tXHRcdFx0XHQgICAgICBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2sgYXQgJXVcJiMzNDssXG4tXHRcdFx0XHQgICAgICBibGspO1xuLVx0XHRcdH1cbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVxuLVx0XHRyYyA9IC1FSU5WQUw7XG4tXHRcdHJzYnAgPSAoc3RydWN0IHZ4ZnNfc2IgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRcdGlmIChyc2JwLVx1MDAzZXZzX21hZ2ljICE9IG1hZ2ljKSB7XG4tXHRcdFx0aWYgKCFzaWxlbnQpXG4tXHRcdFx0XHRpbmZvZihmYyxcbi1cdFx0XHRcdCAgICAgIFwmIzM0O3Z4ZnM6IFdST05HIHN1cGVyYmxvY2sgbWFnaWMgJTA4eCBhdCAldVwmIzM0Oyxcbi1cdFx0XHRcdCAgICAgIHJzYnAtXHUwMDNldnNfbWFnaWMsIGJsayk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0cmMgPSAwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9yYXcgPSByc2JwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9icCA9IGJwO1xuLVx0fSB3aGlsZSAoMCk7XG4tXG4tXHRpZiAocmMpIHtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfcmF3ID0gTlVMTDtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfYnAgPSBOVUxMO1xuLVx0XHRicmVsc2UoYnApO1xuLVx0fVxuLVxuLVx0cmV0dXJuIHJjO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2ZpbGxfc3VwZXIgLSByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGluaXRpYWxpemUgZmlsZXN5c3RlbVxuLSAqIEBzYnA6XHRcdFZGUyBzdXBlcmJsb2NrICh0byBmaWxsKVxuLSAqIEBmYzpcdFx0XHRmaWxlc3l0ZW0gY29udGV4dFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGVcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cdTAwM2VzX2xvY2suXG4tICovXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqaW5mcDtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCpyc2JwO1xuLVx0dV9sb25nXHRcdFx0YnNpemU7XG4tXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XG4tXHRpbnQgcmV0ID0gLUVJTlZBTDtcbi1cdGludCBzaWxlbnQgPSBmYy1cdTAwM2VzYl9mbGFncyBcdTAwMjYgU0JfU0lMRU5UO1xuLVx0dTMyIGo7XG4tXG4tXHRzYnAtXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XG4tXG4tXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xuLVx0aWYgKCFpbmZwKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdH1cbi1cbi1cdGJzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYnAsIEJMT0NLX1NJWkUpO1xuLVx0aWYgKCFic2l6ZSkge1xuLVx0XHR3YXJuZihmYywgXCYjMzQ7dnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdHNicC1cdTAwM2VzX29wID0gXHUwMDI2dnhmc19zdXBlcl9vcHM7XG4tXHRzYnAtXHUwMDNlc19mc19pbmZvID0gaW5mcDtcbi1cdHNicC1cdTAwM2VzX3RpbWVfbWluID0gMDtcbi1cdHNicC1cdTAwM2VzX3RpbWVfbWF4ID0gVTMyX01BWDtcbi1cbi1cdGlmICghdnhmc190cnlfc2JfbWFnaWMoc2JwLCBmYywgMSxcbi1cdFx0XHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XG4tXHRcdC8qIFVuaXh3YXJlLCB4ODYgKi9cbi1cdFx0aW5mcC1cdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19MRTtcbi1cdH0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsXG4tXHRcdFx0KF9fZm9yY2UgX19mczMyKWNwdV90b19iZTMyKFZYRlNfU1VQRVJfTUFHSUMpKSkge1xuLVx0XHQvKiBIUC1VWCwgcGFyaXNjICovXG4tXHRcdGluZnAtXHUwMDNlYnl0ZV9vcmRlciA9IFZYRlNfQk9fQkU7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoIXNpbGVudClcbi1cdFx0XHRpbmZvZihmYywgXCYjMzQ7dnhmczogY2FuJiMzOTt0IGZpbmQgc3VwZXJibG9jay5cJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdHJzYnAgPSBpbmZwLVx1MDAzZXZzaV9yYXc7XG4tXHRqID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c192ZXJzaW9uKTtcbi1cdGlmICgoaiBcdTAwM2MgMiB8fCBqIFx1MDAzZSA0KSBcdTAwMjZcdTAwMjYgIXNpbGVudCkge1xuLVx0XHRpbmZvZihmYywgXCYjMzQ7dnhmczogdW5zdXBwb3J0ZWQgVnhGUyB2ZXJzaW9uICglZClcJiMzNDssIGopO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7dnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxuXCYjMzQ7LCBqKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3Z4ZnM6IGJsb2Nrc2l6ZTogJWRcXG5cJiMzNDssXG4tXHRcdGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfYnNpemUpKTtcbi0jZW5kaWZcbi1cbi1cdHNicC1cdTAwM2VzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19tYWdpYyk7XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9vbHRleHQgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX29sdGV4dFswXSk7XG4tXHRpbmZwLVx1MDAzZXZzaV9vbHRzaXplID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19vbHRzaXplKTtcbi1cbi1cdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX2JzaXplKTtcbi1cdGlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYnAsIGopKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gc2V0IGZpbmFsIGJsb2NrIHNpemVcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHRcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHtcbi1cdFx0d2FybmYoZmMsIFwmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGZzaGVhZFwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0cm9vdCA9IHZ4ZnNfaWdldChzYnAsIFZYRlNfUk9PVF9JTk8pO1xuLVx0aWYgKElTX0VSUihyb290KSkge1xuLVx0XHRyZXQgPSBQVFJfRVJSKHJvb3QpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cdHNicC1cdTAwM2VzX3Jvb3QgPSBkX21ha2Vfcm9vdChyb290KTtcbi1cdGlmICghc2JwLVx1MDAzZXNfcm9vdCkge1xuLVx0XHR3YXJuZihmYywgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCByb290IGRlbnRyeS5cJiMzNDspO1xuLVx0XHRnb3RvIG91dF9mcmVlX2lsaXN0O1xuLVx0fVxuLVxuLVx0cmV0dXJuIDA7XG4tXHRcbi1vdXRfZnJlZV9pbGlzdDpcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLW91dDpcbi1cdGJyZWxzZShpbmZwLVx1MDAzZXZzaV9icCk7XG4tXHRrZnJlZShpbmZwKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLS8qXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfZ2V0X3RyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHJldHVybiBnZXRfdHJlZV9iZGV2KGZjLCB2eGZzX2ZpbGxfc3VwZXIpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGZzX2NvbnRleHRfb3BlcmF0aW9ucyB2eGZzX2NvbnRleHRfb3BzID0ge1xuLVx0LmdldF90cmVlXHQ9IHZ4ZnNfZ2V0X3RyZWUsXG4tXHQucmVjb25maWd1cmVcdD0gdnhmc19yZWNvbmZpZ3VyZSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdGZjLVx1MDAzZW9wcyA9IFx1MDAyNnZ4ZnNfY29udGV4dF9vcHM7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZ4ZnNfZnNfdHlwZSA9IHtcbi1cdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuLVx0Lm5hbWVcdFx0PSBcJiMzNDt2eGZzXCYjMzQ7LFxuLVx0LmtpbGxfc2JcdD0ga2lsbF9ibG9ja19zdXBlcixcbi1cdC5mc19mbGFnc1x0PSBGU19SRVFVSVJFU19ERVYsXG4tXHQuaW5pdF9mc19jb250ZXh0ID0gdnhmc19pbml0X2ZzX2NvbnRleHQsXG4tfTtcbi1NT0RVTEVfQUxJQVNfRlMoXCYjMzQ7dnhmc1wmIzM0Oyk7IC8qIG1ha2VzIG1vdW50IC10IHZ4ZnMgYXV0b2xvYWQgdGhlIG1vZHVsZSAqL1xuLU1PRFVMRV9BTElBUyhcJiMzNDt2eGZzXCYjMzQ7KTtcbi1cbi1zdGF0aWMgaW50IF9faW5pdFxuLXZ4ZnNfaW5pdCh2b2lkKVxuLXtcbi1cdGludCBydjtcbi1cbi1cdHZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoXCYjMzQ7dnhmc19pbm9kZVwmIzM0Oyxcbi1cdFx0XHRzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsXG4tXHRcdFx0U0xBQl9SRUNMQUlNX0FDQ09VTlQsXG4tXHRcdFx0b2Zmc2V0b2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbywgdmlpX2ltbWVkLnZpX2ltbWVkKSxcbi1cdFx0XHRzaXplb2ZfZmllbGQoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyxcbi1cdFx0XHRcdHZpaV9pbW1lZC52aV9pbW1lZCksXG4tXHRcdFx0TlVMTCk7XG4tXHRpZiAoIXZ4ZnNfaW5vZGVfY2FjaGVwKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdHJ2ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbShcdTAwMjZ2eGZzX2ZzX3R5cGUpO1xuLVx0aWYgKHJ2IFx1MDAzYyAwKVxuLVx0XHRrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApO1xuLVx0cmV0dXJuIHJ2O1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBfX2V4aXRcbi12eGZzX2NsZWFudXAodm9pZClcbi17XG4tXHR1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oXHUwMDI2dnhmc19mc190eXBlKTtcbi1cdC8qXG4tXHQgKiBNYWtlIHN1cmUgYWxsIGRlbGF5ZWQgcmN1IGZyZWUgaW5vZGVzIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZVxuLVx0ICogZGVzdHJveSBjYWNoZS5cbi1cdCAqL1xuLVx0cmN1X2JhcnJpZXIoKTtcbi1cdGttZW1fY2FjaGVfZGVzdHJveSh2eGZzX2lub2RlX2NhY2hlcCk7XG4tfVxuLVxuLW1vZHVsZV9pbml0KHZ4ZnNfaW5pdCk7XG4tbW9kdWxlX2V4aXQodnhmc19jbGVhbnVwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8zMCAxODo0MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOGRhZTUxNDhjMTA0NWZkMDBlNWFhOTEzMWY3ZDM1ODQ2NGMwYzhlNQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgSnVsIDMwIDE4OjQwOjA5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtMTA1NjUsMTIgJiM0MzsxMDU2NSw2IEBAIEw6CWxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnCiBTOglPcnBoYW4KIEY6CWRyaXZlcnMvdXNiL3BoeS9waHktZnNsLXVzYioKIAotRlJFRVZYRlMgRklMRVNZU1RFTQotTToJQ2hyaXN0b3BoIEhlbGx3aWcgJmx0O2hjaEBpbmZyYWRlYWQub3JnJmd0OwotUzoJTWFpbnRhaW5lZAotVzoJZnRwOi8vZnRwLm9wZW5saW51eC5vcmcvcHViL3Blb3BsZS9oY2gvdnhmcwotRjoJZnMvZnJlZXZ4ZnMvCi0KIEZSRUVaRVIKIE06CSYjMzQ7UmFmYWVsIEouIFd5c29ja2kmIzM0OyAmbHQ7cmFmYWVsQGtlcm5lbC5vcmcmZ3Q7CiBSOglQYXZlbCBNYWNoZWsgJmx0O3BhdmVsQGtlcm5lbC5vcmcmZ3Q7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBjZjZhZTY0Nzc2ZTYyLi42ZTdlNjNhZmFlMmIyIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL0tjb25maWcKQEAgLTMyMSw3ICYjNDM7MzIxLDYgQEAgc291cmNlICYjMzQ7ZnMvamZmczIvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy91Ymlmcy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL2NyYW1mcy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL3NxdWFzaGZzL0tjb25maWcmIzM0Owotc291cmNlICYjMzQ7ZnMvZnJlZXZ4ZnMvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy9taW5peC9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL29tZnMvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy9ocGZzL0tjb25maWcmIzM0OwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA4OWE4YTlkMjA3ZDFjLi5hYzBkMWMwMDUyM2YwIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9mcy9NYWtlZmlsZQpAQCAtODAsNyAmIzQzOzgwLDYgQEAgb2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpCSYjNDM7PSBpc29mcy8KIG9iai0kKENPTkZJR19IRlNQTFVTX0ZTKQkmIzQzOz0gaGZzcGx1cy8gIyBCZWZvcmUgaGZzIHRvIGZpbmQgd3JhcHBlZCBIRlMmIzQzOwogb2JqLSQoQ09ORklHX0hGU19GUykJCSYjNDM7PSBoZnMvCiBvYmotJChDT05GSUdfRUNSWVBUX0ZTKQkJJiM0Mzs9IGVjcnlwdGZzLwotb2JqLSQoQ09ORklHX1ZYRlNfRlMpCQkmIzQzOz0gZnJlZXZ4ZnMvCiBvYmotJChDT05GSUdfTkZTX0ZTKQkJJiM0Mzs9IG5mcy8KIG9iai0kKENPTkZJR19FWFBPUlRGUykJCSYjNDM7PSBleHBvcnRmcy8KIG9iai0kKENPTkZJR19ORlNEKQkJJiM0Mzs9IG5mc2QvCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyMTA3ZWJlYTZmNC4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMjcgJiM0MzswLDAgQEAKLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotY29uZmlnIFZYRlNfRlMKLQl0cmlzdGF0ZSAmIzM0O0ZyZWVWeEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKFZFUklUQVMgVnhGUyhUTSkgY29tcGF0aWJsZSkmIzM0OwotCWRlcGVuZHMgb24gQkxPQ0sKLQlzZWxlY3QgQlVGRkVSX0hFQUQKLQloZWxwCi0JICBGcmVlVnhGUyBpcyBhIGZpbGUgc3lzdGVtIGRyaXZlciB0aGF0IHN1cHBvcnQgdGhlIFZFUklUQVMgVnhGUyhUTSkKLQkgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtCi0JICBvZiBTQ08gVW5peFdhcmUgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGFuZCBvcHRpb25hbGx5IGF2YWlsYWJsZQotCSAgZm9yIFN1bnNvZnQgU29sYXJpcywgSFAtVVggYW5kIG1hbnkgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIEhvd2V2ZXIKLQkgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrCi0JICBkYXRhIGVuZGlhbm5lc3MgYW5kL29yIHN1cGVyYmxvY2sgb2Zmc2V0LiBUaGUgdnhmcyBtb2R1bGUgaGFzIGJlZW4KLQkgIHRlc3RlZCB3aXRoIFNDTyBVbml4V2FyZSBhbmQgSFAtVVggQi4xMC4yMCAocGEtcmlzYyAxLjEgYXJjaC4pCi0JICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zCi0JICAyLCAzIGFuZCA0LiBUZXN0cyB3ZXJlIHBlcmZvcm1lZCB3aXRoIEhQLVVYIFZ4RlMgdmVyc2lvbiAzLgotCi0JICBOT1RFOiB0aGUgZmlsZSBzeXN0ZW0gdHlwZSBhcyB1c2VkIGJ5IG1vdW50KDEpLCBtb3VudCgyKSBhbmQKLQkgIGZzdGFiKDUpIGlzICYjMzk7dnhmcyYjMzk7IGFzIGl0IGRlc2NyaWJlcyB0aGUgZmlsZSBzeXN0ZW0gZm9ybWF0LCBub3QKLQkgIHRoZSBhY3R1YWwgZHJpdmVyLgotCi0JICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXMKLQkgIGNyZWF0aW5nIEhQLVVYIGxvZ2ljYWwgdm9sdW1lcyBlYXN5IGZyb20gSFAtVVggZGlzayBibG9jayBkZXZpY2UgZmlsZQotCSAgb3IgcmVndWxhciBmaWxlIHdpdGggaW1hZ2Ugb2YgdGhlIGRpc2suIFNlZToKLQkgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzLwotCi0JICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGZyZWV2eGZzLiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWU1OTI5MTUyMWMuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw5ICYjNDM7MCwwIEBACi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLSMKLSMgVnhGUyBNYWtlZmlsZQotIwotCi1vYmotJChDT05GSUdfVlhGU19GUykgJiM0Mzs9IGZyZWV2eGZzLm8KLQotZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXAotCQkgdnhmc19sb29rdXAubyB2eGZzX29sdC5vIHZ4ZnNfc3Vici5vIHZ4ZnNfc3VwZXIubwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZkMTU2ZDY0MzRjLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDI1NyAmIzQzOzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0jaWZuZGVmIF9WWEZTX1NVUEVSX0hfCi0jZGVmaW5lIF9WWEZTX1NVUEVSX0hfCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayBzdHJ1Y3R1cmUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlCi0gKiBzdXBlcmJsb2NrcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLgotICovCi0jaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKLQotLyoKLSAqIFN1cGVyYmxvY2sgbWFnaWMgbnVtYmVyICh2eGZzX3N1cGVyLSZndDt2c19tYWdpYykuCi0gKi8KLSNkZWZpbmUgVlhGU19TVVBFUl9NQUdJQwkweGE1MDFGQ0Y1Ci0KLS8qCi0gKiBUaGUgcm9vdCBpbm9kZS4KLSAqLwotI2RlZmluZSBWWEZTX1JPT1RfSU5PCQkyCi0KLS8qCi0gKiBOdW0gb2YgZW50cmllcyBpbiBmcmVlIGV4dGVudCBhcnJheQotICovCi0jZGVmaW5lIFZYRlNfTkVGUkVFCQkzMgotCi1lbnVtIHZ4ZnNfYnl0ZV9vcmRlciB7Ci0JVlhGU19CT19MRSwKLQlWWEZTX0JPX0JFLAotfTsKLQotdHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2OwotdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyOwotdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19mczY0OwotCi0vKgotICogVnhGUyBzdXBlcmJsb2NrIChkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfc2IgewotCS8qCi0JICogUmVhZG9ubHkgZmllbGRzIGZvciB0aGUgdmVyc2lvbiAxIHN1cGVyYmxvY2suCi0JICoKLQkgKiBMb3RzIG9mIHRoaXMgZmllbGRzIGFyZSBubyBtb3JlIHVzZWQgYnkgdmVyc2lvbiAyCi0JICogYW5kIG5ldmVyIGZpbGVzeXN0ZW1zLgotCSAqLwotCV9fZnMzMgkJdnNfbWFnaWM7CQkvKiBNYWdpYyBudW1iZXIgKi8KLQlfX2ZzMzIJCXZzX3ZlcnNpb247CQkvKiBWeEZTIHZlcnNpb24gKi8KLQlfX2ZzMzIJCXZzX2N0aW1lOwkJLyogY3JlYXRlIHRpbWUgLSBzZWNzICovCi0JX19mczMyCQl2c19jdXRpbWU7CQkvKiBjcmVhdGUgdGltZSAtIHVzZWNzICovCi0JX19mczMyCQlfX3VudXNlZDE7CQkvKiB1bnVzZWQgKi8KLQlfX2ZzMzIJCV9fdW51c2VkMjsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfb2xkX2xvZ3N0YXJ0OwkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfb2xkX2xvZ2VuZDsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19ic2l6ZTsJCS8qIGJsb2NrIHNpemUgKi8KLQlfX2ZzMzIJCXZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzICovCi0JX19mczMyCQl2c19kc2l6ZTsJCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqLwotCV9fZnMzMgkJdnNfb2xkX25pbm9kZTsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfbmF1OwkJLyogb2Jzb2xldGUgKi8KLQlfX2ZzMzIJCV9fdW51c2VkMzsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfb2xkX2RlZmlleHRzaXplOwkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfb2xkX2lsYnNpemU7CQkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfaW1tZWRsZW47CQkvKiBzaXplIG9mIGltbWVkaWF0ZSBkYXRhIGFyZWEgKi8KLQlfX2ZzMzIJCXZzX25kYWRkcjsJCS8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi8KLQlfX2ZzMzIJCXZzX2ZpcnN0YXU7CQkvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovCi0JX19mczMyCQl2c19lbWFwOwkJLyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX2ltYXA7CQkvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovCi0JX19mczMyCQl2c19pZXh0b3A7CQkvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqLwotCV9fZnMzMgkJdnNfaXN0YXJ0OwkJLyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX2JzdGFydDsJCS8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovCi0JX19mczMyCQl2c19mZW1hcDsJCS8qIGF1Zmlyc3QgJiM0MzsgZW1hcCAqLwotCV9fZnMzMgkJdnNfZmltYXA7CQkvKiBhdWZpcnN0ICYjNDM7IGltYXAgKi8KLQlfX2ZzMzIJCXZzX2ZpZXh0b3A7CQkvKiBhdWZpcnN0ICYjNDM7IGlleHRvcCAqLwotCV9fZnMzMgkJdnNfZmlzdGFydDsJCS8qIGF1Zmlyc3QgJiM0MzsgaXN0YXJ0ICovCi0JX19mczMyCQl2c19mYnN0YXJ0OwkJLyogYXVmaXJzdCAmIzQzOyBic3RhcnQgKi8KLQlfX2ZzMzIJCXZzX25pbmRpcjsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGluZGlyICovCi0JX19mczMyCQl2c19hdWxlbjsJCS8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1aW1sZW47CQkvKiBsZW5ndGggb2YgaW1hcCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1ZW1sZW47CQkvKiBsZW5ndGggb2YgZW1hcCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1aWxlbjsJCS8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1cGFkOwkJLyogbGVuZ3RoIG9mIHBhZCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1YmxvY2tzOwkJLyogZGF0YSBibG9ja3MgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX21heHRpZXI7CQkvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovCi0JX19mczMyCQl2c19pbm9wYjsJCS8qIG51bWJlciBvZiBpbm9kZXMgcGVyIGJsayAqLwotCV9fZnMzMgkJdnNfb2xkX2lub3BhdTsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfaW5vcGlsYjsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfbmRpcmlwYXU7CS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19pYWRkcmxlbjsJCS8qIHNpemUgb2YgaW5kaXJlY3QgYWRkciBleHQuICovCi0JX19mczMyCQl2c19ic2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovCi0JX19mczMyCQl2c19pbm9zaGlmdDsJCS8qIGxvZyBiYXNlIDIgb2YgaW5vYnAgKi8KLQlfX2ZzMzIJCXZzX2JtYXNrOwkJLyogfiggYnNpemUgLSAxICkgKi8KLQlfX2ZzMzIJCXZzX2JvZmZtYXNrOwkJLyogYnNpemUgLSAxICovCi0JX19mczMyCQl2c19vbGRfaW5vbWFzazsJCS8qIG9sZF9pbm9waWxiIC0gMSAqLwotCV9fZnMzMgkJdnNfY2hlY2tzdW07CQkvKiBjaGVja3N1bSBvZiBWMSBkYXRhICovCi0JCi0JLyoKLQkgKiBWZXJzaW9uIDEsIHdyaXRhYmxlCi0JICovCi0JX19mczMyCQl2c19mcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCi0JX19mczMyCQl2c19pZnJlZTsJCS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLwotCV9fZnMzMgkJdnNfZWZyZWVbVlhGU19ORUZSRUVdOwkvKiBudW1iZXIgb2YgZnJlZSBleHRlbnRzIGJ5IHNpemUgKi8KLQlfX2ZzMzIJCXZzX2ZsYWdzOwkJLyogZmxhZ3MgPyE/ICovCi0JX191OAkJdnNfbW9kOwkJCS8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLwotCV9fdTgJCXZzX2NsZWFuOwkJLyogY2xlYW4gRlMgKi8KLQlfX2ZzMTYJCV9fdW51c2VkNDsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfZmlyc3Rsb2dpZDsJCS8qIG1vdW50IHRpbWUgbG9nIElEICovCi0JX19mczMyCQl2c193dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovCi0JX19mczMyCQl2c193dXRpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHVzZWMgKi8KLQlfX3U4CQl2c19mbmFtZVs2XTsJCS8qIEZTIG5hbWUgKi8KLQlfX3U4CQl2c19mcGFja1s2XTsJCS8qIEZTIHBhY2sgbmFtZSAqLwotCV9fZnMzMgkJdnNfbG9ndmVyc2lvbjsJCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqLwotCV9fdTMyCQlfX3VudXNlZDU7CQkvKiB1bnVzZWQgKi8KLQkKLQkvKgotCSAqIFZlcnNpb24gMiwgUmVhZC1vbmx5Ci0JICovCi0JX19mczMyCQl2c19vbHRleHRbMl07CQkvKiBPTFQgZXh0ZW50IGFuZCByZXBsaWNhICovCi0JX19mczMyCQl2c19vbHRzaXplOwkJLyogT0xUIGV4dGVudCBzaXplICovCi0JX19mczMyCQl2c19pYXVpbWxlbjsJCS8qIHNpemUgb2YgaW5vZGUgbWFwICovCi0JX19mczMyCQl2c19pYXVzaXplOwkJLyogc2l6ZSBvZiBJQVUgaW4gYmxvY2tzICovCi0JX19mczMyCQl2c19kaW5vc2l6ZTsJCS8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi8KLQlfX2ZzMzIJCXZzX29sZF9kbmlhZGRyOwkJLyogaW5kaXIgbGV2ZWxzIHBlciBpbm9kZSAqLwotCV9fZnMzMgkJdnNfY2hlY2tzdW0yOwkJLyogY2hlY2tzdW0gb2YgVjIgUk8gKi8KLQotCS8qCi0JICogQWN0dWFsbHkgbXVjaCBtb3JlLi4uCi0JICovCi19OwotCi0KLS8qCi0gKiBJbiBjb3JlIHN1cGVyYmxvY2sgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZm9yIFZ4RlMuCi0gKi8KLXN0cnVjdCB2eGZzX3NiX2luZm8gewotCXN0cnVjdCB2eGZzX3NiCQkqdnNpX3JhdzsJLyogcmF3IChvbiBkaXNrKSBzdXBlcmJsb2NrICovCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSp2c2lfYnA7CS8qIGJ1ZmZlciBmb3IgcmF3IHN1cGVyYmxvY2sqLwotCXN0cnVjdCBpbm9kZQkJKnZzaV9mc2hpcDsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KLQlzdHJ1Y3QgaW5vZGUJCSp2c2lfaWxpc3Q7CS8qIGlub2RlIGxpc3QgaW5vZGUgKi8KLQlzdHJ1Y3QgaW5vZGUJCSp2c2lfc3RpbGlzdDsJLyogc3RydWN0dXJhbCBpbm9kZSBsaXN0IGlub2RlICovCi0JdV9sb25nCQkJdnNpX2lleHQ7CS8qIGluaXRpYWwgaW5vZGUgbGlzdCAqLwotCWlub190CQkJdnNpX2ZzaGlubzsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KLQlkYWRkcl90CQkJdnNpX29sdGV4dDsJLyogT0xUIGV4dGVudCAqLwotCWRhZGRyX3QJCQl2c2lfb2x0c2l6ZTsJLyogT0xUIHNpemUgKi8KLQllbnVtIHZ4ZnNfYnl0ZV9vcmRlcglieXRlX29yZGVyOwotfTsKLQotc3RhdGljIGlubGluZSB1MTYgZnMxNl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMTYgYSkKLXsKLQlpZiAoc2JpLSZndDtieXRlX29yZGVyID09IFZYRlNfQk9fQkUpCi0JCXJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7Ci0JZWxzZQotCQlyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgX19sZTE2KWEpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBmczMyX3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMzMiBhKQotewotCWlmIChzYmktJmd0O2J5dGVfb3JkZXIgPT0gVlhGU19CT19CRSkKLQkJcmV0dXJuIGJlMzJfdG9fY3B1KChfX2ZvcmNlIF9fYmUzMilhKTsKLQllbHNlCi0JCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpYSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IGZzNjRfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczY0IGEpCi17Ci0JaWYgKHNiaS0mZ3Q7Ynl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKQotCQlyZXR1cm4gYmU2NF90b19jcHUoKF9fZm9yY2UgX19iZTY0KWEpOwotCWVsc2UKLQkJcmV0dXJuIGxlNjRfdG9fY3B1KChfX2ZvcmNlIF9fbGU2NClhKTsKLX0KLQotLyoKLSAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZAotICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0Ci0gKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuCi0gKi8KLWVudW0gdnhmc19tb2RlIHsKLQlWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCwJLyogc2V0dWlkICovCi0JVlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsCS8qIHNldGdpZCAqLwotCVZYRlNfSVNWVFggPSAweDAwMDAwMjAwLAkvKiBzdGlja3kgYml0ICovCi0JVlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsCS8qIHJlYWQgKi8KLQlWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsCS8qIHdyaXRlICovCi0JVlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsCS8qIGV4ZWMgKi8KLQotCVZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLAkvKiBOYW1lZCBwaXBlICovCi0JVlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KLQlWWEZTX0lGRElSID0gMHgwMDAwNDAwMCwJLyogRGlyZWN0b3J5ICovCi0JVlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsCS8qIFhlbml4IGRldmljZSA/PyAqLwotCVZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLAkvKiBCbG9jayBkZXZpY2UgKi8KLQlWWEZTX0lGUkVHID0gMHgwMDAwODAwMCwJLyogUmVndWxhciBmaWxlICovCi0JVlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsCS8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi8KLQlWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCwJLyogU3ltbGluayAqLwotCVZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLAkvKiBTb2NrZXQgKi8KLQotCS8qIFZ4RlMgaW50ZXJuYWwgKi8KLQlWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCwJLyogRmlsZXNldCBoZWFkZXIgKi8KLQlWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCwJLyogSW5vZGUgbGlzdCAqLwotCVZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLAkvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi8KLQlWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCwJLyogQ3VycmVudCB1c2FnZSB0YWJsZSAqLwotCVZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLAkvKiBBdHRyLiBpbm9kZSAqLwotCVZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLAkvKiBMaW5rIGNvdW50IHRhYmxlICovCi0JVlhGU19JRklBVCA9IDB4NzAwMDAwMDAsCS8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovCi0JVlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsCS8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqLwotCVZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLAkvKiBCU0QgcXVvdGEgZmlsZSAqLwotCVZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLAkvKiAmIzM0O1Bhc3MgdGhyb3VnaCYjMzQ7IGlub2RlICovCi0JVlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsCS8qIERldmljZSBsYWJlbCBmaWxlICovCi0JVlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsCS8qIE9MVCBmaWxlICovCi0JVlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsCS8qIExvZyBmaWxlICovCi0JVlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsCS8qIEV4dGVudCBtYXAgZmlsZSAqLwotCVZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLAkvKiBFeHRlbnQgQVUgZmlsZSAqLwotCVZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLAkvKiBFeHRlbnQgQVUgc3VtbWFyeSBmaWxlICovCi0JVlhGU19JRkRFViA9IDB4MTcwMDAwMDAsCS8qIERldmljZSBjb25maWcgZmlsZSAqLwotCi19OwotCi0jZGVmaW5lCVZYRlNfVFlQRV9NQVNLCQkweGZmZmZmMDAwCi0KLSNkZWZpbmUgVlhGU19JU19UWVBFKGlwLHR5cGUpCSgoKGlwKS0mZ3Q7dmlpX21vZGUgJmFtcDsgVlhGU19UWVBFX01BU0spID09ICh0eXBlKSkKLSNkZWZpbmUgVlhGU19JU0ZJRk8oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRklGTykKLSNkZWZpbmUgVlhGU19JU0NIUih4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ0hSKQotI2RlZmluZSBWWEZTX0lTRElSKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZESVIpCi0jZGVmaW5lIFZYRlNfSVNOQU0oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRk5BTSkKLSNkZWZpbmUgVlhGU19JU0JMSyh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQkxLKQotI2RlZmluZSBWWEZTX0lTTE5LKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZMTkspCi0jZGVmaW5lIFZYRlNfSVNSRUcoeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlJFRykKLSNkZWZpbmUgVlhGU19JU0NNUCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ01QKQotI2RlZmluZSBWWEZTX0lTU09DKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZTT0MpCi0KLSNkZWZpbmUgVlhGU19JU0ZTSCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKQotI2RlZmluZSBWWEZTX0lTSUxUKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpCi0KLS8qCi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLgotICovCi1lbnVtIHsKLQlWWEZTX09SR19OT05FCT0gMCwJLyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqLwotCVZYRlNfT1JHX0VYVDQJPSAxLAkvKiBFeHQ0ICovCi0JVlhGU19PUkdfSU1NRUQJPSAyLAkvKiBBbGwgZGF0YSBzdG9yZWQgaW4gaW5vZGUgKi8KLQlWWEZTX09SR19UWVBFRAk9IDMsCS8qIFR5cGVkIGV4dGVudHMgKi8KLX07Ci0KLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKQkoKGlwKS0mZ3Q7dmlpX29yZ3R5cGUgPT0gKG9yZykpCi0jZGVmaW5lIFZYRlNfSVNOT05FKGlwKQkJVlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSkKLSNkZWZpbmUgVlhGU19JU0VYVDQoaXApCQlWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KQotI2RlZmluZSBWWEZTX0lTSU1NRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX0lNTUVEKQotI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX1RZUEVEKQotCi0vKgotICogR2V0IGZpbGVzeXN0ZW0gcHJpdmF0ZSBkYXRhIGZyb20gVkZTIHN1cGVyYmxvY2suCi0gKi8KLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcCi0JKChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktJmd0O3NfZnNfaW5mbykKLQotI2VuZGlmIC8qIF9WWEZTX1NVUEVSX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2JtYXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgyMTZlYjFkOTBhLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMjcyICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc3lzdGVtIHRvIGRpc2sgYmxvY2sgbWFwcGluZy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvYnVmZmVyX2hlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLQotI2luY2x1ZGUgJiMzNDt2eGZzLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2lub2RlLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2V4dGVybi5oJiMzNDsKLQotCi0jaWZkZWYgRElBR05PU1RJQwotc3RhdGljIHZvaWQKLXZ4ZnNfdHlwZHVtcChzdHJ1Y3Qgdnhmc190eXBlZCAqdHlwKQotewotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7dHlwZT0lTHUgJiMzNDssIHR5cC0mZ3Q7dnRfaGRyICZndDsmZ3Q7IFZYRlNfVFlQRURfVFlQRVNISUZUKTsKLQlwcmludGsoJiMzNDtvZmZzZXQ9JUx4ICYjMzQ7LCB0eXAtJmd0O3Z0X2hkciAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0spOwotCXByaW50aygmIzM0O2Jsb2NrPSV4ICYjMzQ7LCB0eXAtJmd0O3Z0X2Jsb2NrKTsKLQlwcmludGsoJiMzNDtzaXplPSV4XG4mIzM0OywgdHlwLSZndDt2dF9zaXplKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzCi0gKiBAaXA6CQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGJuOgkJbG9naWNhbCBibG9jay4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aAotICogICBleHQ0LXN0eWxlIGV4dGVudHMgKHdoaWNoIGFyZSBtdWNoIGxpa2UgdGhlIHRyYWRpdGlvbmFsIFVOSVgKLSAqICAgaW5vZGUgb3JnYW5pc2F0aW9uKS4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KLSAqLwotc3RhdGljIGRhZGRyX3QKLXZ4ZnNfYm1hcF9leHQ0KHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgYm4pCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLSZndDtpX3NiOwotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmkgPSBWWEZTX1NCSShzYik7Ci0JdW5zaWduZWQgbG9uZyBic2l6ZSA9IHNiLSZndDtzX2Jsb2Nrc2l6ZTsKLQl1MzIgaW5kc2l6ZSA9IGZzMzJfdG9fY3B1KHNiaSwgdmlwLSZndDt2aWlfZXh0NC52ZTRfaW5kc2l6ZSk7Ci0JaW50IGk7Ci0KLQlpZiAoaW5kc2l6ZSAmZ3Q7IHNiLSZndDtzX2Jsb2Nrc2l6ZSkKLQkJZ290byBmYWlsX3NpemU7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgVlhGU19OREFERFI7IGkmIzQzOyYjNDM7KSB7Ci0JCXN0cnVjdCBkaXJlY3QgKmQgPSB2aXAtJmd0O3ZpaV9leHQ0LnZlNF9kaXJlY3QgJiM0MzsgaTsKLQkJaWYgKGJuICZndDs9IDAgJmFtcDsmYW1wOyBibiAmbHQ7IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7c2l6ZSkpCi0JCQlyZXR1cm4gKGJuICYjNDM7IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7ZXh0ZW50KSk7Ci0JCWJuIC09IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7c2l6ZSk7Ci0JfQotCi0JaWYgKChibiAvIChpbmRzaXplICogaW5kc2l6ZSAqIGJzaXplIC8gNCkpID09IDApIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpidWY7Ci0JCWRhZGRyX3QJYm5vOwotCQlfX2ZzMzIgKmluZGlyOwotCi0JCWJ1ZiA9IHNiX2JyZWFkKHNiLAotCQkJZnMzMl90b19jcHUoc2JpLCB2aXAtJmd0O3ZpaV9leHQ0LnZlNF9pbmRpclswXSkpOwotCQlpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKQotCQkJZ290byBmYWlsX2J1ZjsKLQotCQlpbmRpciA9IChfX2ZzMzIgKilidWYtJmd0O2JfZGF0YTsKLQkJYm5vID0gZnMzMl90b19jcHUoc2JpLCBpbmRpclsoYm4gLyBpbmRzaXplKSAlIChpbmRzaXplICogYm4pXSkgJiM0MzsKLQkJCShibiAlIGluZHNpemUpOwotCi0JCWJyZWxzZShidWYpOwotCQlyZXR1cm4gYm5vOwotCX0gZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7bm8gbWF0Y2hpbmcgaW5kaXI/JiMzNDspOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfc2l6ZToKLQlwcmludGsoJiMzNDt2eGZzOiBpbmRpcmVjdCBleHRlbnQgdG9vIGJpZyFcbiYjMzQ7KTsKLWZhaWxfYnVmOgotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHZ4ZnNfYm1hcF9pbmRpciAtIHJlY3Vyc2lvbiBmb3Igdnhmc19ibWFwX3R5cGVkCi0gKiBAaXA6CQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGluZGlyOglpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0Ci0gKiBAc2l6ZToJc2l6ZSBvZiB0aGUgdHlwZWQgYXJlYSB0byBzZWFyY2gKLSAqIEBibG9jazoJcGFydGlhbGx5IHJlc3VsdCBmcm9tIGZ1cnRoZXIgc2VhcmNoZXMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwX2luZGlyIHJlYWRzIGEgJmFtcDtzdHJ1Y3Qgdnhmc190eXBlZCBhdCBAaW5kaXIKLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICoKLSAqIE5vdGU6Ci0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/Ci0gKi8KLXN0YXRpYyBkYWRkcl90Ci12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkJKnNiaSA9IFZYRlNfU0JJKGlwLSZndDtpX3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicCA9IE5VTEw7Ci0JZGFkZHJfdAkJCQlwYmxvY2sgPSAwOwotCWludAkJCQlpOwotCi0JZm9yIChpID0gMDsgaSAmbHQ7IHNpemUgKiBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0mZ3Q7aV9zYik7IGkmIzQzOyYjNDM7KSB7Ci0JCXN0cnVjdCB2eGZzX3R5cGVkCSp0eXA7Ci0JCWludDY0X3QJCQlvZmY7Ci0KLQkJYnAgPSBzYl9icmVhZChpcC0mZ3Q7aV9zYiwKLQkJCQlpbmRpciAmIzQzOyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLSZndDtpX3NiKSkpOwotCQlpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkKLQkJCXJldHVybiAwOwotCi0JCXR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC0mZ3Q7Yl9kYXRhKSAmIzQzOwotCQkJKGkgJSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0mZ3Q7aV9zYikpOwotCQlvZmYgPSBmczY0X3RvX2NwdShzYmksIHR5cC0mZ3Q7dnRfaGRyKSAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0s7Ci0KLQkJaWYgKGJsb2NrICZsdDsgb2ZmKSB7Ci0JCQlicmVsc2UoYnApOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2ggKCh1X2ludDMyX3QpKGZzNjRfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9oZHIpICZndDsmZ3Q7Ci0JCQkJVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7Ci0JCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDoKLQkJCXBibG9jayA9IHZ4ZnNfYm1hcF9pbmRpcihpcCwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpLAotCQkJCQlibG9jayAtIG9mZik7Ci0JCQlpZiAocGJsb2NrID09IC0yKQotCQkJCWJyZWFrOwotCQkJZ290byBvdXQ7Ci0JCWNhc2UgVlhGU19UWVBFRF9EQVRBOgotCQkJaWYgKChibG9jayAtIG9mZikgJmd0Oz0gZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpKQotCQkJCWJyZWFrOwotCQkJcGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSAmIzQzOyBibG9jayAtIG9mZjsKLQkJCWdvdG8gb3V0OwotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDoKLQkJY2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDogewotCQkJc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NAkqdHlwNCA9Ci0JCQkJKHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7Ci0KLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtcblxuVFlQRURfREVWNCBkZXRlY3RlZCFcbiYjMzQ7KTsKLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtibG9jazogJWxsdVx0c2l6ZTogJWxsZFx0ZGV2OiAlZFxuJiMzNDssCi0JCQkgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LSZndDt2ZDRfYmxvY2spLAotCQkJICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X3NpemUpLAotCQkJICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X2RldikpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgJiMzNDslczolZCB2dF9oZHIgJWxsdVxuJiMzNDssIF9fZnVuY19fLAotCQkJCV9fTElORV9fLCBmczY0X3RvX2NwdShzYmksIHR5cC0mZ3Q7dnRfaGRyKSk7Ci0JCQlCVUcoKTsKLQkJfQotCQlicmVsc2UoYnApOwotCX0KLQotZmFpbDoKLQlwYmxvY2sgPSAwOwotb3V0OgotCWJyZWxzZShicCk7Ci0JcmV0dXJuIChwYmxvY2spOwotfQotCi0vKioKLSAqIHZ4ZnNfYm1hcF90eXBlZCAtIGJtYXAgZm9yIHR5cGVkIGV4dGVudHMKLSAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCi0gKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFBlcmZvcm1zIHRoZSBibWFwIG9wZXJhdGlvbiBmb3IgdHlwZWQgZXh0ZW50cy4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KLSAqLwotc3RhdGljIGRhZGRyX3QKLXZ4ZnNfYm1hcF90eXBlZChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaykKLXsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oaXApOwotCXN0cnVjdCB2eGZzX3NiX2luZm8JCSpzYmkgPSBWWEZTX1NCSShpcC0mZ3Q7aV9zYik7Ci0JZGFkZHJfdAkJCQlwYmxvY2sgPSAwOwotCWludAkJCQlpOwotCi0JZm9yIChpID0gMDsgaSAmbHQ7IFZYRlNfTlRZUEVEOyBpJiM0MzsmIzQzOykgewotCQlzdHJ1Y3Qgdnhmc190eXBlZAkqdHlwID0gdmlwLSZndDt2aWlfb3JnLnR5cGVkICYjNDM7IGk7Ci0JCXU2NAkJCWhkciA9IGZzNjRfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9oZHIpOwotCQlpbnQ2NF90CQkJb2ZmID0gKGhkciAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0spOwotCi0jaWZkZWYgRElBR05PU1RJQwotCQl2eGZzX3R5cGR1bXAodHlwKTsKLSNlbmRpZgotCQlpZiAoaWJsb2NrICZsdDsgb2ZmKQotCQkJY29udGludWU7Ci0JCXN3aXRjaCAoKHUzMikoaGRyICZndDsmZ3Q7IFZYRlNfVFlQRURfVFlQRVNISUZUKSkgewotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6Ci0JCQlwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsCi0JCQkJCWZzMzJfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9ibG9jayksCi0JCQkJCWZzMzJfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9zaXplKSwKLQkJCQkJaWJsb2NrIC0gb2ZmKTsKLQkJCWlmIChwYmxvY2sgPT0gLTIpCi0JCQkJYnJlYWs7Ci0JCQlyZXR1cm4gKHBibG9jayk7Ci0JCWNhc2UgVlhGU19UWVBFRF9EQVRBOgotCQkJaWYgKChpYmxvY2sgLSBvZmYpICZsdDsgZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpKQotCQkJCXJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSAmIzQzOwotCQkJCQkJaWJsb2NrIC0gb2ZmKTsKLQkJCWJyZWFrOwotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDoKLQkJY2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDogewotCQkJc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NAkqdHlwNCA9Ci0JCQkJKHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7Ci0KLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtcblxuVFlQRURfREVWNCBkZXRlY3RlZCFcbiYjMzQ7KTsKLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtibG9jazogJWxsdVx0c2l6ZTogJWxsZFx0ZGV2OiAlZFxuJiMzNDssCi0JCQkgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LSZndDt2ZDRfYmxvY2spLAotCQkJICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X3NpemUpLAotCQkJICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X2RldikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCVdBUk5fT05fT05DRSgxKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdnhmc19ibWFwMSAtIHZ4ZnMtaW50ZXJuYWwgYm1hcCBvcGVyYXRpb24KLSAqIEBpcDoJCQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGlibG9jazoJCWxvZ2ljYWwgYmxvY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nCi0gKiAgIGZvciB2eGZzLWludGVybmFsIHB1cnBvc2VzLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICovCi1kYWRkcl90Ci12eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgaWJsb2NrKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXAgPSBWWEZTX0lOTyhpcCk7Ci0KLQlpZiAoVlhGU19JU0VYVDQodmlwKSkKLQkJcmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spOwotCWlmIChWWEZTX0lTVFlQRUQodmlwKSkKLQkJcmV0dXJuIHZ4ZnNfYm1hcF90eXBlZChpcCwgaWJsb2NrKTsKLQlpZiAoVlhGU19JU05PTkUodmlwKSkKLQkJZ290byB1bnN1cHA7Ci0JaWYgKFZYRlNfSVNJTU1FRCh2aXApKQotCQlnb3RvIHVuc3VwcDsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgJiMzNDt2eGZzOiBpbm9kZSAlbGx1IGhhcyBubyB2YWxpZCBvcmd0eXBlICgleClcbiYjMzQ7LAotCQkJaXAtJmd0O2lfaW5vLCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLQlCVUcoKTsKLQotdW5zdXBwOgotCXByaW50ayhLRVJOX1dBUk5JTkcgJiMzNDt2eGZzOiBpbm9kZSAlbGx1IGhhcyBhbiB1bnN1cHBvcnRlZCBvcmd0eXBlICgleClcbiYjMzQ7LAotCQkJaXAtJmd0O2lfaW5vLCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw2OCAmIzQzOzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICovCi0jaWZuZGVmIF9WWEZTX0RJUl9IXwotI2RlZmluZSBfVlhGU19ESVJfSF8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdnhmcyBkaXJlY3RvcnkgZm9ybWF0LgotICovCi0KLQotLyoKLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci4KLSAqCi0gKiBUaGlzIGVudHJ5IGlzIHRoZSBoZWFkIG9mIGV2ZXJ5IGZpbGVzeXN0ZW0gYmxvY2sgaW4gYSBkaXJlY3RvcnkuCi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlcwotICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLgotICoKLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGUKLSAqIExpbnV4IGRyaXZlciBmb3Igbm93LgotICovCi1zdHJ1Y3Qgdnhmc19kaXJibGsgewotCV9fZnMxNgkJZF9mcmVlOwkJLyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqLwotCV9fZnMxNgkJZF9uaGFzaDsJLyogbm8gb2YgaGFzaCBjaGFpbnMgKi8KLQlfX2ZzMTYJCWRfaGFzaFtdOwkvKiBoYXNoIGNoYWluICovCi19OwotCi0vKgotICogVlhGU19OQU1FTEVOIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZF9uYW1lIGZpZWxkCi0gKglvZiBhbiBWeEZTIGRpcmVjdG9yeSBlbnRyeS4KLSAqLwotI2RlZmluZSBWWEZTX05BTUVMRU4JMjU2Ci0KLS8qCi0gKiBWeEZTIGRpcmVjdG9yeSBlbnRyeS4KLSAqLwotc3RydWN0IHZ4ZnNfZGlyZWN0IHsKLQlfX2ZzMzIJCWRfaW5vOwkJCS8qIGlub2RlIG51bWJlciAqLwotCV9fZnMxNgkJZF9yZWNsZW47CQkvKiByZWNvcmQgbGVuZ3RoICovCi0JX19mczE2CQlkX25hbWVsZW47CQkvKiBkX25hbWUgbGVuZ3RoICovCi0JX19mczE2CQlkX2hhc2huZXh0OwkJLyogbmV4dCBoYXNoIGVudHJ5ICovCi0JY2hhcgkJZF9uYW1lW1ZYRlNfTkFNRUxFTl07CS8qIG5hbWUgKi8KLX07Ci0KLS8qCi0gKiBWWEZTX0RJUlBBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cnkgYm91bmRhcmllcywgaXMgX211c3RfIGJlCi0gKglhIG11bHRpcGxlIG9mIGZvdXIuCi0gKiBWWEZTX05BTUVNSU4gaXMgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeSB3aXRoIGEgTlVMTCBkX25hbWUuCi0gKiBWWEZTX0RJUlJPVU5EIGlzIGFuIGludGVybmFsIG1hY3JvcyB0aGF0IHJvdW5kcyBhIGxlbmd0aCB0byBhIHZhbHVlCi0gKgl1c2FibGUgZm9yIGRpcmVjdG9yeSBzaXplcy4KLSAqIFZYRlNfRElSTEVOIGNhbGN1bGF0ZXMgdGhlIGRpcmVjdG9yeSBlbnRyeSBzaXplIGZvciBhbiBlbnRyeSB3aXRoCi0gKglhIGRfbmFtZSB3aXRoIHNpemUgbGVuLgotICovCi0jZGVmaW5lIFZYRlNfRElSUEFECQk0Ci0jZGVmaW5lIFZYRlNfTkFNRU1JTgkJb2Zmc2V0b2Yoc3RydWN0IHZ4ZnNfZGlyZWN0LCBkX25hbWUpCi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKQkoKFZYRlNfRElSUEFEICYjNDM7IChsZW4pIC0gMSkgJmFtcDsgfihWWEZTX0RJUlBBRCAtMSkpCi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbikJKFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICYjNDM7IChsZW4pKSkKLQotLyoKLSAqIFZYRlNfRElSQkxLT1YgaXMgdGhlIG92ZXJoZWFkIG9mIGEgc3BlY2lmaWMgZGlyYmxvY2suCi0gKi8KLSNkZWZpbmUgVlhGU19ESVJCTEtPVihzYmksIGRicCkJXAotCSgoc2l6ZW9mKHNob3J0KSAqIGZzMTZfdG9fY3B1KHNiaSwgZGJwLSZndDtkX25oYXNoKSkgJiM0MzsgNCkKLQotI2VuZGlmIC8qIF9WWEZTX0RJUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjE4MGM1ZTIwOGQuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDQ5ICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLSNpZm5kZWYgX1ZYRlNfRVhURVJOX0hfCi0jZGVmaW5lIF9WWEZTX0VYVEVSTl9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGV4dGVybmFsIHByb3RvdHlwZXMuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yIGFsbCB2eGZzIGZ1bmN0aW9ucyB1c2VkCi0gKiBvdXRzaWRlIHRoZWlyIHJlc3BlY3RpdmUgc291cmNlIGZpbGVzLgotICovCi0KLQotc3RydWN0IGttZW1fY2FjaGU7Ci1zdHJ1Y3Qgc3VwZXJfYmxvY2s7Ci1zdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvOwotc3RydWN0IGlub2RlOwotCi0KLS8qIHZ4ZnNfYm1hcC5jICovCi1leHRlcm4gZGFkZHJfdAkJCXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICosIGxvbmcpOwotCi0vKiB2eGZzX2ZzaGVhZC5jICovCi1leHRlcm4gaW50CQkJdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0KLS8qIHZ4ZnNfaW5vZGUuYyAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzOwotZXh0ZXJuIHZvaWQJCQl2eGZzX2R1bXBpKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKiwgaW5vX3QpOwotZXh0ZXJuIHN0cnVjdCBpbm9kZQkJKnZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nLCBpbm9fdCk7Ci1leHRlcm4gc3RydWN0IGlub2RlCQkqdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKLWV4dGVybiBzdHJ1Y3QgaW5vZGUJCSp2eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKLWV4dGVybiB2b2lkCQkJdnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci0KLS8qIHZ4ZnNfbG9va3VwLmMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucwl2eGZzX2Rpcl9pbm9kZV9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwl2eGZzX2Rpcl9vcGVyYXRpb25zOwotCi0vKiB2eGZzX29sdC5jICovCi1leHRlcm4gaW50CQkJdnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTsKLQotLyogdnhmc19zdWJyLmMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wczsKLWV4dGVybiBzdHJ1Y3QgcGFnZSAqCQl2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7Ci1leHRlcm4gdm9pZAkJCXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKik7Ci1leHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICoJdnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLQotI2VuZGlmIC8qIF9WWEZTX0VYVEVSTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWI4YmRmN2E2Y2EuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDE2NiAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2ZzaGVhZC5oJiMzNDsKLQotCi0jaWZkZWYgRElBR05PU1RJQwotc3RhdGljIHZvaWQKLXZ4ZnNfZHVtcGZzaChzdHJ1Y3Qgdnhmc19mc2ggKmZocCkKLXsKLQlwcmludGsoJiMzNDtcblxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcbiYjMzQ7KTsKLQlwcmludGsoJiMzNDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4mIzM0Oyk7Ci0JcHJpbnRrKCYjMzQ7dmVyc2lvbjogJXVcbiYjMzQ7LCBmaHAtJmd0O2ZzaF92ZXJzaW9uKTsKLQlwcmludGsoJiMzNDtmc2luZGV4OiAldVxuJiMzNDssIGZocC0mZ3Q7ZnNoX2ZzaW5kZXgpOwotCXByaW50aygmIzM0O2lhdWlubzogJXVcdG5pbm9kZXM6JXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfaWF1aW5vLCBmaHAtJmd0O2ZzaF9uaW5vZGVzKTsKLQlwcmludGsoJiMzNDttYXhpbm9kZTogJXVcdGxjdGlubzogJXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfbWF4aW5vZGUsIGZocC0mZ3Q7ZnNoX2xjdGlubyk7Ci0JcHJpbnRrKCYjMzQ7bmF1OiAldVxuJiMzNDssIGZocC0mZ3Q7ZnNoX25hdSk7Ci0JcHJpbnRrKCYjMzQ7aWxpc3Rpbm9bMF06ICV1XHRpbGlzdGlub1sxXTogJXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfaWxpc3Rpbm9bMF0sIGZocC0mZ3Q7ZnNoX2lsaXN0aW5vWzFdKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeQotICogQGlwOgkJdGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZQotICogQHdoaWNoOgkwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlcgotICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICovCi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICoKLXZ4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaCkKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKLQotCWJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpOwotCWlmIChicCkgewotCQlzdHJ1Y3Qgdnhmc19mc2gJCSpmaHA7Ci0KLQkJaWYgKCEoZmhwID0ga21hbGxvY19vYmooKmZocCkpKQotCQkJZ290byBvdXQ7Ci0JCW1lbWNweShmaHAsIGJwLSZndDtiX2RhdGEsIHNpemVvZigqZmhwKSk7Ci0KLQkJcHV0X2JoKGJwKTsKLQkJcmV0dXJuIChmaHApOwotCX0KLW91dDoKLQlicmVsc2UoYnApOwotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHZ4ZnNfcmVhZF9mc2hlYWQgLSByZWFkIHRoZSBmaWxlc2V0IGhlYWRlcnMKLSAqIEBzYnA6CXN1cGVyYmxvY2sgdG8gd2hpY2ggdGhlIGZpbGVzZXQgYmVsb25ncwotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX3JlYWRfZnNoZWFkIHdpbGwgZmlsbCB0aGUgaW5vZGUgYW5kIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbiBAc2IuCi0gKgotICogUmV0dXJuczoKLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSAoLUVJTlZBTCkuCi0gKi8KLWludAotdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCkKLXsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCQkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0Jc3RydWN0IHZ4ZnNfZnNoCQkJKnBmcCwgKnNmcDsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwOwotCi0JaW5mcC0mZ3Q7dnNpX2ZzaGlwID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0mZ3Q7dnNpX2lleHQsIGluZnAtJmd0O3ZzaV9mc2hpbm8pOwotCWlmICghaW5mcC0mZ3Q7dnNpX2ZzaGlwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGZzaCBpbm9kZVxuJiMzNDspOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2aXAgPSBWWEZTX0lOTyhpbmZwLSZndDt2c2lfZnNoaXApOwotCWlmICghVlhGU19JU0ZTSCh2aXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IGZzaCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuJiMzNDssCi0JCQkJdmlwLSZndDt2aWlfbW9kZSAmYW1wOyBWWEZTX1RZUEVfTUFTSyk7IAotCQlnb3RvIG91dF9pcHV0X2ZzaGlwOwotCX0KLQotI2lmZGVmIERJQUdOT1NUSUMKLQlwcmludGsoJiMzNDt2eGZzOiBmc2ggaW5vZGUgZHVtcDpcbiYjMzQ7KTsKLQl2eGZzX2R1bXBpKHZpcCwgaW5mcC0mZ3Q7dnNpX2ZzaGlubyk7Ci0jZW5kaWYKLQotCXNmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtJmd0O3ZzaV9mc2hpcCwgMCk7Ci0JaWYgKCFzZnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxuJiMzNDspOwotCQlnb3RvIG91dF9pcHV0X2ZzaGlwOwotCX0gCi0KLSNpZmRlZiBESUFHTk9TVElDCi0Jdnhmc19kdW1wZnNoKHNmcCk7Ci0jZW5kaWYKLQotCXBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtJmd0O3ZzaV9mc2hpcCwgMSk7Ci0JaWYgKCFwZnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxuJiMzNDspOwotCQlnb3RvIG91dF9mcmVlX3NmcDsKLQl9Ci0KLSNpZmRlZiBESUFHTk9TVElDCi0Jdnhmc19kdW1wZnNoKHBmcCk7Ci0jZW5kaWYKLQotCWluZnAtJmd0O3ZzaV9zdGlsaXN0ID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0mZ3Q7dnNpX2lleHQsCi0JCQlmczMyX3RvX2NwdShpbmZwLCBzZnAtJmd0O2ZzaF9pbGlzdGlub1swXSkpOwotCWlmICghaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGxpc3QgaW5vZGVcbiYjMzQ7KTsKLQkJZ290byBvdXRfZnJlZV9wZnA7Ci0JfQotCWlmICghVlhGU19JU0lMVChWWEZTX0lOTyhpbmZwLSZndDt2c2lfc3RpbGlzdCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IHN0cnVjdHVyYWwgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcbiYjMzQ7LAotCQkJCVZYRlNfSU5PKGluZnAtJmd0O3ZzaV9zdGlsaXN0KS0mZ3Q7dmlpX21vZGUgJmFtcDsgVlhGU19UWVBFX01BU0spOyAKLQkJZ290byBvdXRfaXB1dF9zdGlsaXN0OwotCX0KLQotCWluZnAtJmd0O3ZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLSZndDtmc2hfaWxpc3Rpbm9bMF0pKTsKLQlpZiAoIWluZnAtJmd0O3ZzaV9pbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcbiYjMzQ7KTsKLQkJZ290byBvdXRfaXB1dF9zdGlsaXN0OwotCX0KLQlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0mZ3Q7dnNpX2lsaXN0KSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcbiYjMzQ7LAotCQkJCVZYRlNfSU5PKGluZnAtJmd0O3ZzaV9pbGlzdCktJmd0O3ZpaV9tb2RlICZhbXA7IFZYRlNfVFlQRV9NQVNLKTsKLQkJZ290byBvdXRfaXB1dF9pbGlzdDsKLQl9Ci0KLQlrZnJlZShwZnApOwotCWtmcmVlKHNmcCk7Ci0JcmV0dXJuIDA7Ci0KLSBvdXRfaXB1dF9pbGlzdDoKLSAJaXB1dChpbmZwLSZndDt2c2lfaWxpc3QpOwotIG91dF9pcHV0X3N0aWxpc3Q6Ci0gCWlwdXQoaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpOwotIG91dF9mcmVlX3BmcDoKLQlrZnJlZShwZnApOwotIG91dF9mcmVlX3NmcDoKLSAJa2ZyZWUoc2ZwKTsKLSBvdXRfaXB1dF9mc2hpcDoKLQlpcHV0KGluZnAtJmd0O3ZzaV9mc2hpcCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkMjE0NzU5OWM0OS4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsNDMgJiM0MzswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotI2lmbmRlZiBfVlhGU19GU0hFQURfSF8KLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBoeXNpY2FsIHN0cnVjdHVyZSBvZiB0aGUgVnhGUwotICogZmlsZXNldCBoZWFkZXIuCi0gKi8KLQotCi0vKgotICogRmlsZXNldCBoZWFkZXIgCi0gKi8KLXN0cnVjdCB2eGZzX2ZzaCB7Ci0JX19mczMyCQlmc2hfdmVyc2lvbjsJCS8qIGZpbGVzZXQgaGVhZGVyIHZlcnNpb24gKi8KLQlfX2ZzMzIJCWZzaF9mc2luZGV4OwkJLyogZmlsZXNldCBpbmRleCAqLwotCV9fZnMzMgkJZnNoX3RpbWU7CQkvKiBtb2RpZmljYXRpb24gdGltZSAtIHNlYyAqLwotCV9fZnMzMgkJZnNoX3V0aW1lOwkJLyogbW9kaWZpY2F0aW9uIHRpbWUgLSB1c2VjICovCi0JX19mczMyCQlmc2hfZXh0b3A7CQkvKiBleHRvcCBmbGFncyAqLwotCV9fZnMzMgkJZnNoX25pbm9kZXM7CQkvKiBhbGxvY2F0ZWQgaW5vZGVzICovCi0JX19mczMyCQlmc2hfbmF1OwkJLyogbnVtYmVyIG9mIElBVXMgKi8KLQlfX2ZzMzIJCWZzaF9vbGRfaWxlc2l6ZTsJLyogb2xkIHNpemUgb2YgaWxpc3QgKi8KLQlfX2ZzMzIJCWZzaF9kZmxhZ3M7CQkvKiBmbGFncyAqLwotCV9fZnMzMgkJZnNoX3F1b3RhOwkJLyogcXVvdGEgbGltaXQgKi8KLQlfX2ZzMzIJCWZzaF9tYXhpbm9kZTsJCS8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovCi0JX19mczMyCQlmc2hfaWF1aW5vOwkJLyogSUFVIGlub2RlICovCi0JX19mczMyCQlmc2hfaWxpc3Rpbm9bMl07CS8qIGlsaXN0IGlub2RlcyAqLwotCV9fZnMzMgkJZnNoX2xjdGlubzsJCS8qIGxpbmsgY291bnQgdGFibGUgaW5vZGUgKi8KLQotCS8qCi0JICogU2xpZ2h0bHkgbW9yZSBmaWVsZHMgZm9sbG93LCBidXQgdGhleQotCSAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZAotCSAqICBiKSBkaWZmZXIgYSBsb3QgaW4gZGlmZmVyZW50IHZ4ZnMgdmVyc2lvbnMvcG9ydHMKLQkgKi8KLX07Ci0KLSNlbmRpZiAvKiBfVlhGU19GU0hFQURfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1MWZjZDM0NzU3Mi4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw1MyAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwcG9ydCBmb3IgJiMzOTtpbW1lZCYjMzk7IGlub2Rlcy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2lub2RlLmgmIzM0OwotCi0vKioKLSAqIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyAtIHJlYWQgcGFydCBvZiBhbiBpbW1lZCBpbm9kZSBpbnRvIHBhZ2VjYWNoZQotICogQGZwOgkJZmlsZSBjb250ZXh0ICh1bnVzZWQpCi0gKiBAZm9saW86CWZvbGlvIHRvIGZpbGwgaW4uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlCi0gKiAgIGZpbGUgdGhhdCBob3N0cyBAZm9saW8gaW50byB0aGUgcGFnZWNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKgotICogTG9ja2luZyBzdGF0dXM6Ci0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19pbW1lZF9yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGZvbGlvICpmb2xpbykKLXsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAgPSBWWEZTX0lOTyhmb2xpby0mZ3Q7bWFwcGluZy0mZ3Q7aG9zdCk7Ci0Jdm9pZCAqc3JjID0gdmlwLSZndDt2aWlfaW1tZWQudmlfaW1tZWQgJiM0MzsgZm9saW9fcG9zKGZvbGlvKTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgZm9saW9fbnJfcGFnZXMoZm9saW8pOyBpJiM0MzsmIzQzOykgewotCQltZW1jcHlfdG9fcGFnZShmb2xpb19wYWdlKGZvbGlvLCBpKSwgMCwgc3JjLCBQQUdFX1NJWkUpOwotCQlzcmMgJiM0Mzs9IFBBR0VfU0laRTsKLQl9Ci0KLQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKLQlmb2xpb191bmxvY2soZm9saW8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KLSAqLwotY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7Ci0JLnJlYWRfZm9saW8gPQl2eGZzX2ltbWVkX3JlYWRfZm9saW8sCi19OwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWZjOTRiOTgyMDlmLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDMxNCAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9uYW1laS5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLSNpZmRlZiBESUFHTk9TVElDCi0vKgotICogRHVtcCBpbm9kZSBjb250ZW50cyAocGFydGlhbGx5KS4KLSAqLwotdm9pZAotdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubykKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O1xuXG4mIzM0Oyk7Ci0JaWYgKGlubykKLQkJcHJpbnRrKEtFUk5fREVCVUcgJiMzNDtkdW1waW5nIHZ4ZnMgaW5vZGUgJWxkXG4mIzM0OywgaW5vKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7ZHVtcGluZyB1bmtub3duIHZ4ZnMgaW5vZGVcbiYjMzQ7KTsKLQotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4mIzM0Oyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDttb2RlIGlzICV4XG4mIzM0OywgdmlwLSZndDt2aWlfbW9kZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDtubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcbiYjMzQ7LAotCQkJdmlwLSZndDt2aWlfbmxpbmssIHZpcC0mZ3Q7dmlpX3VpZCwgdmlwLSZndDt2aWlfZ2lkKTsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O3NpemU6JUx4LCBibG9ja3M6JXVcbiYjMzQ7LAotCQkJdmlwLSZndDt2aWlfc2l6ZSwgdmlwLSZndDt2aWlfYmxvY2tzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O29yZ3R5cGU6JXVcbiYjMzQ7LCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfdHJhbnNtb2QgLSBtb2RlIGZvciBhIFZ4RlMgaW5vZGUKLSAqIEB2aXA6CVZ4RlMgaW5vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW4KLSAqICBWeEZTIGlub2RlIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW1vZGVfdAotdnhmc190cmFuc21vZChzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXApCi17Ci0JdW1vZGVfdAkJCXJldCA9IHZpcC0mZ3Q7dmlpX21vZGUgJmFtcDsgflZYRlNfVFlQRV9NQVNLOwotCi0JaWYgKFZYRlNfSVNGSUZPKHZpcCkpCi0JCXJldCB8PSBTX0lGSUZPOwotCWlmIChWWEZTX0lTQ0hSKHZpcCkpCi0JCXJldCB8PSBTX0lGQ0hSOwotCWlmIChWWEZTX0lTRElSKHZpcCkpCi0JCXJldCB8PSBTX0lGRElSOwotCWlmIChWWEZTX0lTQkxLKHZpcCkpCi0JCXJldCB8PSBTX0lGQkxLOwotCWlmIChWWEZTX0lTTE5LKHZpcCkpCi0JCXJldCB8PSBTX0lGTE5LOwotCWlmIChWWEZTX0lTUkVHKHZpcCkpCi0JCXJldCB8PSBTX0lGUkVHOwotCWlmIChWWEZTX0lTU09DKHZpcCkpCi0JCXJldCB8PSBTX0lGU09DSzsKLQotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpcDJ2aXBfY3B5KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwKLQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBzdHJ1Y3Qgdnhmc19kaW5vZGUgKmRpcCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmFtcDt2aXAtJmd0O3Zmc19pbm9kZTsKLQotCXZpcC0mZ3Q7dmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX21vZGUpOwotCXZpcC0mZ3Q7dmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV9ubGluayk7Ci0JdmlwLSZndDt2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV91aWQpOwotCXZpcC0mZ3Q7dmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfZ2lkKTsKLQl2aXAtJmd0O3ZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV9zaXplKTsKLQl2aXAtJmd0O3ZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYXRpbWUpOwotCXZpcC0mZ3Q7dmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYXV0aW1lKTsKLQl2aXAtJmd0O3ZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfbXRpbWUpOwotCXZpcC0mZ3Q7dmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfbXV0aW1lKTsKLQl2aXAtJmd0O3ZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfY3RpbWUpOwotCXZpcC0mZ3Q7dmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfY3V0aW1lKTsKLQl2aXAtJmd0O3ZpaV9vcmd0eXBlID0gZGlwLSZndDt2ZGlfb3JndHlwZTsKLQotCXZpcC0mZ3Q7dmlpX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYmxvY2tzKTsKLQl2aXAtJmd0O3ZpaV9nZW4gPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX2dlbik7Ci0KLQlpZiAoVlhGU19JU0RJUih2aXApKQotCQl2aXAtJmd0O3ZpaV9kb3Rkb3QgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX2RvdGRvdCk7Ci0JZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSAmYW1wOyZhbXA7ICFWWEZTX0lTTE5LKHZpcCkpCi0JCXZpcC0mZ3Q7dmlpX3JkZXYgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX3JkZXYpOwotCi0JLyogZG9uJiMzOTt0IGVuZGlhbiBzd2FwIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYnkgb3JndHlwZSAqLwotCW1lbWNweSgmYW1wO3ZpcC0mZ3Q7dmlpX29yZywgJmFtcDtkaXAtJmd0O3ZkaV9vcmcsIHNpemVvZih2aXAtJmd0O3ZpaV9vcmcpKTsKLQotCWlub2RlLSZndDtpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7Ci0JaV91aWRfd3JpdGUoaW5vZGUsICh1aWRfdCl2aXAtJmd0O3ZpaV91aWQpOwotCWlfZ2lkX3dyaXRlKGlub2RlLCAoZ2lkX3QpdmlwLSZndDt2aWlfZ2lkKTsKLQotCXNldF9ubGluayhpbm9kZSwgdmlwLSZndDt2aWlfbmxpbmspOwotCWlub2RlLSZndDtpX3NpemUgPSB2aXAtJmd0O3ZpaV9zaXplOwotCi0JaW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9hdGltZSwgMCk7Ci0JaW5vZGVfc2V0X2N0aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9jdGltZSwgMCk7Ci0JaW5vZGVfc2V0X210aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9tdGltZSwgMCk7Ci0KLQlpbm9kZS0mZ3Q7aV9ibG9ja3MgPSB2aXAtJmd0O3ZpaV9ibG9ja3M7Ci0JaW5vZGUtJmd0O2lfZ2VuZXJhdGlvbiA9IHZpcC0mZ3Q7dmlpX2dlbjsKLX0KLQotLyoqCi0gKiB2eGZzX2Jsa2lnZXQgLSBmaW5kIGlub2RlIGJhc2VkIG9uIGV4dGVudCAjCi0gKiBAc2JwOglzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpbgotICogQGV4dGVudDoJbnVtYmVyIG9mIHRoZSBleHRlbnQgdG8gc2VhcmNoCi0gKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gc2VhcmNoCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgdnhmc19ibGtpZ2V0IHNlYXJjaGVzIGlub2RlIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5Ci0gKiAgQHNicCBpbiB0aGUgZXh0ZW50IEBleHRlbnQuCi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgotICoKLSAqIE5PVEU6Ci0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZQotICogIGJ1ZmZlcmNhY2hlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGUKLSAqICByZWFkX3N1cGVyKCkgbWV0aG9kLCBvdGhlcndpc2UgdGhlIGRhdGEgbWF5IGJlIGluY29oZXJlbnQuCi0gKi8KLXN0cnVjdCBpbm9kZSAqCi12eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHVfbG9uZyBleHRlbnQsIGlub190IGlubykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKLQlzdHJ1Y3QgaW5vZGUJCQkqaW5vZGU7Ci0JdV9sb25nCQkJCWJsb2NrLCBvZmZzZXQ7Ci0KLQlpbm9kZSA9IG5ld19pbm9kZShzYnApOwotCWlmICghaW5vZGUpCi0JCXJldHVybiBOVUxMOwotCWlub2RlLSZndDtpX2lubyA9IGdldF9uZXh0X2lubygpOwotCi0JYmxvY2sgPSBleHRlbnQgJiM0MzsgKChpbm8gKiBWWEZTX0lTSVpFKSAvIHNicC0mZ3Q7c19ibG9ja3NpemUpOwotCW9mZnNldCA9ICgoaW5vICUgKHNicC0mZ3Q7c19ibG9ja3NpemUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFKTsKLQlicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spOwotCi0JaWYgKGJwICZhbXA7JmFtcDsgYnVmZmVyX21hcHBlZChicCkpIHsKLQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwID0gVlhGU19JTk8oaW5vZGUpOwotCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKLQotCQlkaXAgPSAoc3RydWN0IHZ4ZnNfZGlub2RlICopKGJwLSZndDtiX2RhdGEgJiM0Mzsgb2Zmc2V0KTsKLQkJZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApOwotCQl2aXAtJmd0O3Zmc19pbm9kZS5pX21hcHBpbmctJmd0O2Ffb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0jaWZkZWYgRElBR05PU1RJQwotCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKLSNlbmRpZgotCQlicmVsc2UoYnApOwotCQlyZXR1cm4gaW5vZGU7Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxuJiMzNDssIGJsb2NrKTsKLQlicmVsc2UoYnApOwotCWlwdXQoaW5vZGUpOwotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIF9fdnhmc19pZ2V0IC0gZ2VuZXJpYyBmaW5kIGlub2RlIGZhY2lsaXR5Ci0gKiBAaWxpc3RwOgkJaW5vZGUgbGlzdAotICogQHZpcDoJCVZ4RlMgaW5vZGUgdG8gZmlsbCBpbgotICogQGlubzoJCWlub2RlIG51bWJlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogIFNlYXJjaCB0aGUgZm9yIGlub2RlIG51bWJlciBAaW5vIGluIHRoZSBmaWxlc3lzdGVtCi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuCi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhbiBlcnJvciBjb2RlLgotICovCi1zdGF0aWMgaW50Ci1fX3Z4ZnNfaWdldChzdHJ1Y3QgaW5vZGUgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pCi17Ci0Jc3RydWN0IHBhZ2UJCQkqcHA7Ci0JdV9sb25nCQkJCW9mZnNldDsKLQotCW9mZnNldCA9IChpbm8gJSAoUEFHRV9TSVpFIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRTsKLQlwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLSZndDtpX21hcHBpbmcsIGlubyAqIFZYRlNfSVNJWkUgLyBQQUdFX1NJWkUpOwotCi0JaWYgKCFJU19FUlIocHApKSB7Ci0JCXN0cnVjdCB2eGZzX2Rpbm9kZQkqZGlwOwotCQljYWRkcl90CQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShrYWRkciAmIzQzOyBvZmZzZXQpOwotCQlkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtJmd0O2lfc2IpLCB2aXAsIGRpcCk7Ci0JCXZpcC0mZ3Q7dmZzX2lub2RlLmlfbWFwcGluZy0mZ3Q7YV9vcHMgPSAmYW1wO3Z4ZnNfYW9wczsKLSNpZmRlZiBESUFHTk9TVElDCi0JCXZ4ZnNfZHVtcGkodmlwLCBpbm8pOwotI2VuZGlmCi0JCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7dnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcbiYjMzQ7LAotCQlwcCwgKHVuc2lnbmVkIGxvbmcpaW5vKTsKLQlyZXR1cm4gUFRSX0VSUihwcCk7Ci19Ci0KLS8qKgotICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QKLSAqIEBzYnA6CVZGUyBzdXBlcmJsb2NrCi0gKiBAaW5vOglpbm9kZSAjCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nCi0gKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC4KLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgotICovCi1zdHJ1Y3QgaW5vZGUgKgotdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubykKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCWludCBlcnJvcjsKLQotCWlub2RlID0gbmV3X2lub2RlKHNicCk7Ci0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5vZGUtJmd0O2lfaW5vID0gZ2V0X25leHRfaW5vKCk7Ci0KLQllcnJvciA9IF9fdnhmc19pZ2V0KFZYRlNfU0JJKHNicCktJmd0O3ZzaV9zdGlsaXN0LCBWWEZTX0lOTyhpbm9kZSksIGlubyk7Ci0JaWYgKGVycm9yKSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gaW5vZGU7Ci19Ci0KLS8qKgotICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlCi0gKiBAc2JwOgl0aGUgc3VwZXJibG9jayB0byBnZXQgdGhlIGlub2RlIGZvcgotICogQGlubzoJdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gZ2V0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgdnhmc19yZWFkX2lub2RlIGNyZWF0ZXMgYW4gaW5vZGUsIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaW5vIGFuZCBmaWxscwotICogIGluIGFsbCByZWxldmFudCBmaWVsZHMgaW4gdGhlIG5ldyBpbm9kZS4KLSAqLwotc3RydWN0IGlub2RlICoKLXZ4ZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXA7Ci0JY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkqYW9wczsKLQlzdHJ1Y3QgaW5vZGUgKmlwOwotCWludCBlcnJvcjsKLQotCWlwID0gaWdldF9sb2NrZWQoc2JwLCBpbm8pOwotCWlmICghaXApCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgJmFtcDsgSV9ORVcpKQotCQlyZXR1cm4gaXA7Ci0KLQl2aXAgPSBWWEZTX0lOTyhpcCk7Ci0JZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLSZndDt2c2lfaWxpc3QsIHZpcCwgaW5vKTsKLQlpZiAoZXJyb3IpIHsKLQkJaWdldF9mYWlsZWQoaXApOwotCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JfQotCi0JaWYgKFZYRlNfSVNJTU1FRCh2aXApKQotCQlhb3BzID0gJmFtcDt2eGZzX2ltbWVkX2FvcHM7Ci0JZWxzZQotCQlhb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0KLQlpZiAoU19JU1JFRyhpcC0mZ3Q7aV9tb2RlKSkgewotCQlpcC0mZ3Q7aV9mb3AgPSAmYW1wO2dlbmVyaWNfcm9fZm9wczsKLQkJaXAtJmd0O2lfbWFwcGluZy0mZ3Q7YV9vcHMgPSBhb3BzOwotCX0gZWxzZSBpZiAoU19JU0RJUihpcC0mZ3Q7aV9tb2RlKSkgewotCQlpcC0mZ3Q7aV9vcCA9ICZhbXA7dnhmc19kaXJfaW5vZGVfb3BzOwotCQlpcC0mZ3Q7aV9mb3AgPSAmYW1wO3Z4ZnNfZGlyX29wZXJhdGlvbnM7Ci0JCWlwLSZndDtpX21hcHBpbmctJmd0O2Ffb3BzID0gYW9wczsKLQl9IGVsc2UgaWYgKFNfSVNMTksoaXAtJmd0O2lfbW9kZSkpIHsKLQkJaWYgKCFWWEZTX0lTSU1NRUQodmlwKSkgewotCQkJaXAtJmd0O2lfb3AgPSAmYW1wO3BhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQkJaW5vZGVfbm9oaWdobWVtKGlwKTsKLQkJCWlwLSZndDtpX21hcHBpbmctJmd0O2Ffb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0JCX0gZWxzZSB7Ci0JCQlpcC0mZ3Q7aV9vcCA9ICZhbXA7c2ltcGxlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJCWlwLSZndDtpX2xpbmsgPSB2aXAtJmd0O3ZpaV9pbW1lZC52aV9pbW1lZDsKLQkJCW5kX3Rlcm1pbmF0ZV9saW5rKGlwLSZndDtpX2xpbmssIGlwLSZndDtpX3NpemUsCi0JCQkJCSAgc2l6ZW9mKHZpcC0mZ3Q7dmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpOwotCQl9Ci0JfSBlbHNlCi0JCWluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtJmd0O2lfbW9kZSwgb2xkX2RlY29kZV9kZXYodmlwLSZndDt2aWlfcmRldikpOwotCi0JdW5sb2NrX25ld19pbm9kZShpcCk7Ci0JcmV0dXJuIGlwOwotfQotCi0vKioKLSAqIHZ4ZnNfZXZpY3RfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeQotICogQGlwOgkJaW5vZGUgdG8gZGlzY2FyZC4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICB2eGZzX2V2aWN0X2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZQotICogIGlub2RlIGFyZWEuCi0gKi8KLXZvaWQKLXZ4ZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppcCkKLXsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19maW5hbCgmYW1wO2lwLSZndDtpX2RhdGEpOwotCWNsZWFyX2lub2RlKGlwKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZTEzOGQyYjMzOC4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmgKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwxNjkgJiM0MzswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotI2lmbmRlZiBfVlhGU19JTk9ERV9IXwotI2RlZmluZSBfVlhGU19JTk9ERV9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmUKLSAqIGlub2RlcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLgotICovCi0KLQotI2RlZmluZSBWWEZTX0lTSVpFCQkweDEwMAkJLyogSW5vZGUgc2l6ZSAqLwotCi0jZGVmaW5lIFZYRlNfTkRBRERSCQkxMAkJLyogTnVtYmVyIG9mIGRpcmVjdCBhZGRycyBpbiBpbm9kZSAqLwotI2RlZmluZSBWWEZTX05JQUREUgkJMgkJLyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovCi0jZGVmaW5lIFZYRlNfTklNTUVECQk5NgkJLyogU2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBpbiBpbm9kZSAqLwotI2RlZmluZSBWWEZTX05UWVBFRAkJNgkJLyogTnVtIG9mIHR5cGVkIGV4dGVudHMgKi8KLQotI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0sJKDB4MDBGRkZGRkZGRkZGRkZGRlVMTCkKLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFTUFTSwkoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKQotI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVTSElGVAk1NgotCi0jZGVmaW5lIFZYRlNfVFlQRURfUEVSX0JMT0NLKHNicCkgXAotCSgoc2JwKS0mZ3Q7c19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKQotCi0vKgotICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLgotICovCi1lbnVtIHsKLQlWWEZTX1RZUEVEX0lORElSRUNUCQk9IDEsCi0JVlhGU19UWVBFRF9EQVRBCQkJPSAyLAotCVZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNAk9IDMsCi0JVlhGU19UWVBFRF9EQVRBX0RFVjQJCT0gNCwKLX07Ci0KLS8qCi0gKiBEYXRhIHN0b3JlZCBpbW1lZGlhdGVseSBpbiB0aGUgaW5vZGUuCi0gKi8KLXN0cnVjdCB2eGZzX2ltbWVkIHsKLQlfX3U4CQkJdmlfaW1tZWRbVlhGU19OSU1NRURdOwotfTsKLQotc3RydWN0IHZ4ZnNfZXh0NCB7Ci0JX19mczMyCQkJdmU0X3NwYXJlOwkJLyogPz8gKi8KLQlfX2ZzMzIJCQl2ZTRfaW5kc2l6ZTsJCS8qIEluZGlyZWN0IGV4dGVudCBzaXplICovCi0JX19mczMyCQkJdmU0X2luZGlyW1ZYRlNfTklBRERSXTsJLyogSW5kaXJlY3QgZXh0ZW50cyAqLwotCXN0cnVjdCBkaXJlY3QgewkJCQkJLyogRGlyZWN0IGV4dGVudHMgKi8KLQkJX19mczMyCQlleHRlbnQ7CQkJLyogRXh0ZW50IG51bWJlciAqLwotCQlfX2ZzMzIJCXNpemU7CQkJLyogU2l6ZSBvZiBleHRlbnQgKi8KLQl9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdOwotfTsKLQotc3RydWN0IHZ4ZnNfdHlwZWQgewotCV9fZnM2NAkJdnRfaGRyOwkJLyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi8KLQlfX2ZzMzIJCXZ0X2Jsb2NrOwkvKiBFeHRlbnQgYmxvY2sgKi8KLQlfX2ZzMzIJCXZ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCi19OwotCi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHsKLQlfX2ZzNjQJCXZkNF9oZHI7CS8qIEhlYWRlciwgMHhUVE9PT09PT09PT09PT09POyBUPXR5cGUsTz1vZmZzICovCi0JX19mczY0CQl2ZDRfYmxvY2s7CS8qIEV4dGVudCBibG9jayAqLwotCV9fZnM2NAkJdmQ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCi0JX19mczMyCQl2ZDRfZGV2OwkvKiBEZXZpY2UgSUQgKi8KLQlfX3U4CQlfX3BhZDE7Ci19OwotCi0vKgotICogVGhlIGlub2RlIGFzIGNvbnRhaW5lZCBvbiB0aGUgcGh5c2ljYWwgZGV2aWNlLgotICovCi1zdHJ1Y3Qgdnhmc19kaW5vZGUgewotCV9fZnMzMgkJdmRpX21vZGU7Ci0JX19mczMyCQl2ZGlfbmxpbms7CS8qIExpbmsgY291bnQgKi8KLQlfX2ZzMzIJCXZkaV91aWQ7CS8qIFVJRCAqLwotCV9fZnMzMgkJdmRpX2dpZDsJLyogR0lEICovCi0JX19mczY0CQl2ZGlfc2l6ZTsJLyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqLwotCV9fZnMzMgkJdmRpX2F0aW1lOwkvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi8KLQlfX2ZzMzIJCXZkaV9hdXRpbWU7CS8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHVzZWMgKi8KLQlfX2ZzMzIJCXZkaV9tdGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqLwotCV9fZnMzMgkJdmRpX211dGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi8KLQlfX2ZzMzIJCXZkaV9jdGltZTsJLyogQ3JlYXRlIHRpbWUgLSBzZWMgKi8KLQlfX2ZzMzIJCXZkaV9jdXRpbWU7CS8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqLwotCV9fdTgJCXZkaV9hZmxhZ3M7CS8qIEFsbG9jYXRpb24gZmxhZ3MgKi8KLQlfX3U4CQl2ZGlfb3JndHlwZTsJLyogT3JnYW5pc2F0aW9uIHR5cGUgKi8KLQlfX2ZzMTYJCXZkaV9lb3BmbGFnczsKLQlfX2ZzMzIJCXZkaV9lb3BkYXRhOwotCXVuaW9uIHsKLQkJX19mczMyCQkJcmRldjsKLQkJX19mczMyCQkJZG90ZG90OwotCQlzdHJ1Y3QgewotCQkJX191MzIJCXJlc2VydmVkOwotCQkJX19mczMyCQlmaXhleHRzaXplOwotCQl9IGlfcmVndWxhcjsKLQkJc3RydWN0IHsKLQkJCV9fZnMzMgkJbWF0Y2hpbm87Ci0JCQlfX2ZzMzIJCWZzZXRpbmRleDsKLQkJfSBpX3Z4c3BlYzsKLQkJX191NjQJCQlhbGlnbjsKLQl9IHZkaV9mdGFyZWE7Ci0JX19mczMyCQl2ZGlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KLQlfX2ZzMzIJCXZkaV9nZW47CS8qIElub2RlIGdlbmVyYXRpb24gKi8KLQlfX2ZzNjQJCXZkaV92ZXJzaW9uOwkvKiBWZXJzaW9uICovCi0JdW5pb24gewotCQlzdHJ1Y3Qgdnhmc19pbW1lZAlpbW1lZDsKLQkJc3RydWN0IHZ4ZnNfZXh0NAlleHQ0OwotCQlzdHJ1Y3Qgdnhmc190eXBlZAl0eXBlZFtWWEZTX05UWVBFRF07Ci0JfSB2ZGlfb3JnOwotCV9fZnMzMgkJdmRpX2lhdHRyaW5vOwotfTsKLQotI2RlZmluZSB2ZGlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKLSNkZWZpbmUgdmRpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAotI2RlZmluZSB2ZGlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQotI2RlZmluZSB2ZGlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KLSNkZWZpbmUgdmRpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKLQotI2RlZmluZSB2ZGlfaW1tZWQJdmRpX29yZy5pbW1lZAotI2RlZmluZSB2ZGlfZXh0NAl2ZGlfb3JnLmV4dDQKLSNkZWZpbmUgdmRpX3R5cGVkCXZkaV9vcmcudHlwZWQKLQotCi0vKgotICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS4KLSAqLwotc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyB7Ci0Jc3RydWN0IGlub2RlCXZmc19pbm9kZTsKLQotCV9fdTMyCQl2aWlfbW9kZTsKLQlfX3UzMgkJdmlpX25saW5rOwkvKiBMaW5rIGNvdW50ICovCi0JX191MzIJCXZpaV91aWQ7CS8qIFVJRCAqLwotCV9fdTMyCQl2aWlfZ2lkOwkvKiBHSUQgKi8KLQlfX3U2NAkJdmlpX3NpemU7CS8qIElub2RlIHNpemUgaW4gYnl0ZXMgKi8KLQlfX3UzMgkJdmlpX2F0aW1lOwkvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi8KLQlfX3UzMgkJdmlpX2F1dGltZTsJLyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqLwotCV9fdTMyCQl2aWlfbXRpbWU7CS8qIExhc3QgbW9kaWZ5IHRpbWUgLSBzZWMgKi8KLQlfX3UzMgkJdmlpX211dGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi8KLQlfX3UzMgkJdmlpX2N0aW1lOwkvKiBDcmVhdGUgdGltZSAtIHNlYyAqLwotCV9fdTMyCQl2aWlfY3V0aW1lOwkvKiBDcmVhdGUgdGltZSAtIHVzZWMgKi8KLQlfX3U4CQl2aWlfb3JndHlwZTsJLyogT3JnYW5pc2F0aW9uIHR5cGUgKi8KLQl1bmlvbiB7Ci0JCV9fdTMyCQkJcmRldjsKLQkJX191MzIJCQlkb3Rkb3Q7Ci0JfSB2aWlfZnRhcmVhOwotCV9fdTMyCQl2aWlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KLQlfX3UzMgkJdmlpX2dlbjsJLyogSW5vZGUgZ2VuZXJhdGlvbiAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHZ4ZnNfaW1tZWQJaW1tZWQ7Ci0JCXN0cnVjdCB2eGZzX2V4dDQJZXh0NDsKLQkJc3RydWN0IHZ4ZnNfdHlwZWQJdHlwZWRbVlhGU19OVFlQRURdOwotCX0gdmlpX29yZzsKLX07Ci0KLSNkZWZpbmUgdmlpX3JkZXYJdmlpX2Z0YXJlYS5yZGV2Ci0jZGVmaW5lIHZpaV9kb3Rkb3QJdmlpX2Z0YXJlYS5kb3Rkb3QKLQotI2RlZmluZSB2aWlfaW1tZWQJdmlpX29yZy5pbW1lZAotI2RlZmluZSB2aWlfZXh0NAl2aWlfb3JnLmV4dDQKLSNkZWZpbmUgdmlpX3R5cGVkCXZpaV9vcmcudHlwZWQKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICpWWEZTX0lOTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Ci19Ci0KLSNlbmRpZiAvKiBfVlhGU19JTk9ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGUwOGRlOTc2ZWEuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDI3MyAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gbG9va3VwIGFuZCBvdGhlciBkaXJlY3RvcnkgcmVsYXRlZCBjb2RlLgotICovCi0jaW5jbHVkZSAmbHQ7bGludXgvZnMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9maWxlbG9jay5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3RpbWUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tbS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2hpZ2htZW0uaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9wYWdlbWFwLmgmZ3Q7Ci0KLSNpbmNsdWRlICYjMzQ7dnhmcy5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19kaXIuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0vKgotICogTnVtYmVyIG9mIFZ4RlMgYmxvY2tzIHBlciBwYWdlLgotICovCi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS0mZ3Q7c19ibG9ja3NpemUpKQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoJdnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQJCXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7Ci0KLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHZ4ZnNfZGlyX2lub2RlX29wcyA9IHsKLQkubG9va3VwID0JCXZ4ZnNfbG9va3VwLAotfTsKLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0gewotCS5sbHNlZWsgPQkJZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9CQkJZ2VuZXJpY19yZWFkX2RpciwKLQkuaXRlcmF0ZV9zaGFyZWQgPQl2eGZzX3JlYWRkaXIsCi0JLnNldGxlYXNlID0JCWdlbmVyaWNfc2V0bGVhc2UsCi19OwotCi0KLS8qKgotICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeQotICogQGlwOgkJZGlyZWN0b3J5IGlub2RlCi0gKiBAZHA6CQlkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdAotICogQHBwcDoJZ2V0cyBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuIHZhbHVlIHNpdHMgaW4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19maW5kX2VudHJ5IGZpbmRzIGEgJmFtcDtzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5Ci0gKiAgIGNhY2hlIGVudHJ5IEBkcC4gIEBwcHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuCi0gKiAgIHZhbHVlIHJlc2lkZXMgaW4uCi0gKgotICogUmV0dXJuczoKLSAqICAgVGhlIHdhbnRlZCBkaXJlY3Qgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KLSAqLwotc3RhdGljIHN0cnVjdCB2eGZzX2RpcmVjdCAqCi12eGZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGRlbnRyeSAqZHAsIHN0cnVjdCBwYWdlICoqcHBwKQotewotCXVfbG9uZyBic2l6ZSA9IGlwLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQljb25zdCBjaGFyICpuYW1lID0gZHAtJmd0O2RfbmFtZS5uYW1lOwotCWludCBuYW1lbGVuID0gZHAtJmd0O2RfbmFtZS5sZW47Ci0JbG9mZl90IGxpbWl0ID0gVlhGU19ESVJST1VORChpcC0mZ3Q7aV9zaXplKTsKLQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlX2V4aXQgPSBOVUxMOwotCWxvZmZfdCBwb3MgPSAwOwotCXN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLSZndDtpX3NiKTsKLQotCXdoaWxlIChwb3MgJmx0OyBsaW1pdCkgewotCQlzdHJ1Y3QgcGFnZSAqcHA7Ci0JCWNoYXIgKmthZGRyOwotCQlpbnQgcGdfb2ZzID0gcG9zICZhbXA7IH5QQUdFX01BU0s7Ci0KLQkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLSZndDtpX21hcHBpbmcsIHBvcyAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKLQkJaWYgKElTX0VSUihwcCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJd2hpbGUgKHBnX29mcyAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IHBvcyAmbHQ7IGxpbWl0KSB7Ci0JCQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlOwotCi0JCQlpZiAoKHBvcyAmYW1wOyAoYnNpemUgLSAxKSkgJmx0OyA0KSB7Ci0JCQkJc3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPQotCQkJCQkoc3RydWN0IHZ4ZnNfZGlyYmxrICopCi0JCQkJCSAoa2FkZHIgJiM0MzsgKHBvcyAmYW1wOyB+UEFHRV9NQVNLKSk7Ci0JCQkJaW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7Ci0KLQkJCQlwb3MgJiM0Mzs9IG92ZXJoZWFkOwotCQkJCXBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7Ci0JCQl9Ci0JCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTsKLQotCQkJaWYgKCFkZS0mZ3Q7ZF9yZWNsZW4pIHsKLQkJCQlwb3MgJiM0Mzs9IGJzaXplIC0gMTsKLQkJCQlwb3MgJmFtcDs9IH4oYnNpemUgLSAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGdfb2ZzICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX3JlY2xlbik7Ci0JCQlwb3MgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtJmd0O2RfcmVjbGVuKTsKLQkJCWlmICghZGUtJmd0O2RfaW5vKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX25hbWVsZW4pKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFtZW1jbXAobmFtZSwgZGUtJmd0O2RfbmFtZSwgbmFtZWxlbikpIHsKLQkJCQkqcHBwID0gcHA7Ci0JCQkJZGVfZXhpdCA9IGRlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZGVfZXhpdCkKLQkJCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZGVfZXhpdDsKLX0KLQotLyoqCi0gKiB2eGZzX2lub2RlX2J5X25hbWUgLSBmaW5kIGlub2RlIG51bWJlciBmb3IgZGVudHJ5Ci0gKiBAZGlwOglkaXJlY3RvcnkgdG8gc2VhcmNoIGluCi0gKiBAZHA6CQlkZW50cnkgd2Ugc2VhcmNoIGZvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2lub2RlX2J5X25hbWUgZmluZHMgb3V0IHRoZSBpbm9kZSBudW1iZXIgb2YKLSAqICAgdGhlIHBhdGggY29tcG9uZW50IGRlc2NyaWJlZCBieSBAZHAgaW4gQGRpcC4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgd2FudGVkIGlub2RlIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uCi0gKi8KLXN0YXRpYyBpbm9fdAotdnhmc19pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCkKLXsKLQlzdHJ1Y3Qgdnhmc19kaXJlY3QJCSpkZTsKLQlzdHJ1Y3QgcGFnZQkJCSpwcDsKLQlpbm9fdAkJCQlpbm8gPSAwOwotCi0JZGUgPSB2eGZzX2ZpbmRfZW50cnkoZGlwLCBkcCwgJmFtcDtwcCk7Ci0JaWYgKGRlKSB7Ci0JCWlubyA9IGZzMzJfdG9fY3B1KFZYRlNfU0JJKGRpcC0mZ3Q7aV9zYiksIGRlLSZndDtkX2lubyk7Ci0JCWt1bm1hcChwcCk7Ci0JCXB1dF9wYWdlKHBwKTsKLQl9Ci0JCi0JcmV0dXJuIChpbm8pOwotfQotCi0vKioKLSAqIHZ4ZnNfbG9va3VwIC0gbG9va3VwIHBhdGhuYW1lIGNvbXBvbmVudAotICogQGRpcDoJZGlyIGluIHdoaWNoIHdlIGxvb2t1cAotICogQGRwOgkJZGVudHJ5IHdlIGxvb2t1cAotICogQGZsYWdzOglsb29rdXAgZmxhZ3MKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkCi0gKiAgIGJ5IEBkcCBpbiBAZGlwLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIEEgTlVMTC1wb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWQKLSAqICAgaW4gdGhlIHJldHVybiBwb2ludGVyLgotICovCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqCi12eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHAsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaW5vZGUJCSppcCA9IE5VTEw7Ci0JaW5vX3QJCQlpbm87Ci0JCQkgCi0JaWYgKGRwLSZndDtkX25hbWUubGVuICZndDsgVlhGU19OQU1FTEVOKQotCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKLQkJCQkgCi0JaW5vID0gdnhmc19pbm9kZV9ieV9uYW1lKGRpcCwgZHApOwotCWlmIChpbm8pCi0JCWlwID0gdnhmc19pZ2V0KGRpcC0mZ3Q7aV9zYiwgaW5vKTsKLQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaXAsIGRwKTsKLX0KLQotLyoqCi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5Ci0gKiBAZnA6CQl0aGUgZGlyZWN0b3J5IHRvIHJlYWQKLSAqIEBjdHg6CWRpcl9jb250ZXh0IGZvciBmaWxsZGlyL3JlYWRkaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19yZWFkZGlyIGZpbGxzIEByZXRwIHdpdGggZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBAZnAKLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8uCi0gKi8KLXN0YXRpYyBpbnQKLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpbm9kZQkJKmlwID0gZmlsZV9pbm9kZShmcCk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrCSpzYnAgPSBpcC0mZ3Q7aV9zYjsKLQl1X2xvbmcJCQlic2l6ZSA9IHNicC0mZ3Q7c19ibG9ja3NpemU7Ci0JbG9mZl90CQkJcG9zLCBsaW1pdDsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSpzYmkgPSBWWEZTX1NCSShzYnApOwotCi0JaWYgKGN0eC0mZ3Q7cG9zID09IDApIHsKLQkJaWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpCi0JCQlnb3RvIG91dDsKLQkJY3R4LSZndDtwb3MmIzQzOyYjNDM7OwotCX0KLQlpZiAoY3R4LSZndDtwb3MgPT0gMSkgewotCQlpZiAoIWRpcl9lbWl0KGN0eCwgJiMzNDsuLiYjMzQ7LCAyLCBWWEZTX0lOTyhpcCktJmd0O3ZpaV9kb3Rkb3QsIERUX0RJUikpCi0JCQlnb3RvIG91dDsKLQkJY3R4LSZndDtwb3MmIzQzOyYjNDM7OwotCX0KLQotCWxpbWl0ID0gVlhGU19ESVJST1VORChpcC0mZ3Q7aV9zaXplKTsKLQlpZiAoY3R4LSZndDtwb3MgJmd0OyBsaW1pdCkKLQkJZ290byBvdXQ7Ci0KLQlwb3MgPSBjdHgtJmd0O3BvcyAmYW1wOyB+M0w7Ci0KLQl3aGlsZSAocG9zICZsdDsgbGltaXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBwOwotCQljaGFyICprYWRkcjsKLQkJaW50IHBnX29mcyA9IHBvcyAmYW1wOyB+UEFHRV9NQVNLOwotCQlpbnQgcmMgPSAwOwotCi0JCXBwID0gdnhmc19nZXRfcGFnZShpcC0mZ3Q7aV9tYXBwaW5nLCBwb3MgJmd0OyZndDsgUEFHRV9TSElGVCk7Ci0JCWlmIChJU19FUlIocHApKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJd2hpbGUgKHBnX29mcyAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IHBvcyAmbHQ7IGxpbWl0KSB7Ci0JCQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlOwotCi0JCQlpZiAoKHBvcyAmYW1wOyAoYnNpemUgLSAxKSkgJmx0OyA0KSB7Ci0JCQkJc3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPQotCQkJCQkoc3RydWN0IHZ4ZnNfZGlyYmxrICopCi0JCQkJCSAoa2FkZHIgJiM0MzsgKHBvcyAmYW1wOyB+UEFHRV9NQVNLKSk7Ci0JCQkJaW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7Ci0KLQkJCQlwb3MgJiM0Mzs9IG92ZXJoZWFkOwotCQkJCXBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7Ci0JCQl9Ci0JCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTsKLQotCQkJaWYgKCFkZS0mZ3Q7ZF9yZWNsZW4pIHsKLQkJCQlwb3MgJiM0Mzs9IGJzaXplIC0gMTsKLQkJCQlwb3MgJmFtcDs9IH4oYnNpemUgLSAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGdfb2ZzICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX3JlY2xlbik7Ci0JCQlwb3MgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtJmd0O2RfcmVjbGVuKTsKLQkJCWlmICghZGUtJmd0O2RfaW5vKQotCQkJCWNvbnRpbnVlOwotCi0JCQlyYyA9IGRpcl9lbWl0KGN0eCwgZGUtJmd0O2RfbmFtZSwKLQkJCQkJZnMxNl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9uYW1lbGVuKSwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9pbm8pLAotCQkJCQlEVF9VTktOT1dOKTsKLQkJCWlmICghcmMpIHsKLQkJCQkvKiB0aGUgZGlyIGVudHJ5IHdhcyBub3QgcmVhZCwgZml4IHBvcy4gKi8KLQkJCQlwb3MgLT0gZnMxNl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9yZWNsZW4pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQlpZiAoIXJjKQotCQkJYnJlYWs7Ci0JfQotCi0JY3R4LSZndDtwb3MgPSBwb3MgfCAyOwotCi1vdXQ6Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMzUxODdjMjg5Ni4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTA1ICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyogCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gb2JqZWN0IGxvY2F0aW9uIHRhYmxlIHN1cHBvcnQuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0KLSNpbmNsdWRlICYjMzQ7dnhmcy5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19vbHQuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdnhmc19nZXRfZnNoZWFkKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqZnNocCwgc3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCkKLXsKLQlCVUdfT04oaW5mcC0mZ3Q7dnNpX2ZzaGlubyk7Ci0JaW5mcC0mZ3Q7dnNpX2ZzaGlubyA9IGZzMzJfdG9fY3B1KGluZnAsIGZzaHAtJmd0O29sdF9mc2lub1swXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdnhmc19nZXRfaWxpc3Qoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCkKLXsKLQlCVUdfT04oaW5mcC0mZ3Q7dnNpX2lleHQpOwotCWluZnAtJmd0O3ZzaV9pZXh0ID0gZnMzMl90b19jcHUoaW5mcCwgaWxpc3RwLSZndDtvbHRfaWV4dFswXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdV9sb25nCi12eGZzX29ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgZGFkZHJfdCBibG9jaywgdV9sb25nIGJzaXplKQotewotCUJVR19PTihzYnAtJmd0O3NfYmxvY2tzaXplICUgYnNpemUpOwotCXJldHVybiAoYmxvY2sgKiAoc2JwLSZndDtzX2Jsb2Nrc2l6ZSAvIGJzaXplKSk7Ci19Ci0KLQotLyoqCi0gKiB2eGZzX3JlYWRfb2x0IC0gcmVhZCBvbHQKLSAqIEBzYnA6CXN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW0KLSAqIEBic2l6ZToJYmxvY2tzaXplIG9mIHRoZSBmaWxlc3lzdGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfcmVhZF9vbHQgcmVhZHMgdGhlIG9sdCBvZiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicAotICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuCi0gKgotICogUmV0dXJuczoKLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50Ci12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpicDsKLQlzdHJ1Y3Qgdnhmc19vbHQJCSpvcDsKLQljaGFyCQkJKm9hZGRyLCAqZWFkZHI7Ci0KLQlicCA9IHNiX2JyZWFkKHNicCwgdnhmc19vYmxvY2soc2JwLCBpbmZwLSZndDt2c2lfb2x0ZXh0LCBic2l6ZSkpOwotCWlmICghYnAgfHwgIWJwLSZndDtiX2RhdGEpCi0JCWdvdG8gZmFpbDsKLQotCW9wID0gKHN0cnVjdCB2eGZzX29sdCAqKWJwLSZndDtiX2RhdGE7Ci0JaWYgKGZzMzJfdG9fY3B1KGluZnAsIG9wLSZndDtvbHRfbWFnaWMpICE9IFZYRlNfT0xUX01BR0lDKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAmIzM0O3Z4ZnM6IGl2YWxpZCBvbHQgbWFnaWMgbnVtYmVyXG4mIzM0Oyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKgotCSAqIEl0IGlzIGluIHRoZW9yeSBwb3NzaWJsZSB0aGF0IHZzaV9vbHRzaXplIGlzICZndDsgMS4KLQkgKiBJJiMzOTt2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSYjMzk7bSBsYXp5Li4gIC0taGNoCi0JICovCi0JaWYgKGluZnAtJmd0O3ZzaV9vbHRzaXplICZndDsgMSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgJiMzNDt2eGZzOiBvbHRzaXplICZndDsgMSBkZXRlY3RlZC5cbiYjMzQ7KTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICYjMzQ7dnhmczogcGxlYXNlIG5vdGlmeSBoY2hAaW5mcmFkZWFkLm9yZ1xuJiMzNDspOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jb2FkZHIgPSBicC0mZ3Q7Yl9kYXRhICYjNDM7IGZzMzJfdG9fY3B1KGluZnAsIG9wLSZndDtvbHRfc2l6ZSk7Ci0JZWFkZHIgPSBicC0mZ3Q7Yl9kYXRhICYjNDM7IChpbmZwLSZndDt2c2lfb2x0c2l6ZSAqIHNicC0mZ3Q7c19ibG9ja3NpemUpOwotCi0Jd2hpbGUgKG9hZGRyICZsdDsgZWFkZHIpIHsKLQkJc3RydWN0IHZ4ZnNfb2x0Y29tbW9uCSpvY3AgPQotCQkJKHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyOwotCQkKLQkJc3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtJmd0O29sdF90eXBlKSkgewotCQljYXNlIFZYRlNfT0xUX0ZTSEVBRDoKLQkJCXZ4ZnNfZ2V0X2ZzaGVhZCgoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICopb2FkZHIsIGluZnApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVlhGU19PTFRfSUxJU1Q6Ci0JCQl2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCW9hZGRyICYjNDM7PSBmczMyX3RvX2NwdShpbmZwLCBvY3AtJmd0O29sdF9zaXplKTsKLQl9Ci0KLQlicmVsc2UoYnApOwotCXJldHVybiAoaW5mcC0mZ3Q7dnNpX2ZzaGlubyAmYW1wOyZhbXA7IGluZnAtJmd0O3ZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMOwotCi1mYWlsOgotCWJyZWxzZShicCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZmJhMDhkNjE3Zi4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5oCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTIwICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLSNpZm5kZWYgX1ZYRlNfT0xUX0hfCi0jZGVmaW5lIF9WWEZTX09MVF9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIHVzZWQKLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci4KLSAqLwotCi0KLS8qCi0gKiBPTFQgbWFnaWMgbnVtYmVyICh2eGZzX29sdC0mZ3Q7b2x0X21hZ2ljKS4KLSAqLwotI2RlZmluZSBWWEZTX09MVF9NQUdJQwkJMHhhNTA0RkNGNQotCi0vKgotICogVnhGUyBPTFQgZW50cnkgdHlwZXMuCi0gKi8KLWVudW0gewotCVZYRlNfT0xUX0ZSRUUJPSAxLAotCVZYRlNfT0xUX0ZTSEVBRAk9IDIsCi0JVlhGU19PTFRfQ1VUCT0gMywKLQlWWEZTX09MVF9JTElTVAk9IDQsCi0JVlhGU19PTFRfREVWCT0gNSwKLQlWWEZTX09MVF9TQgk9IDYKLX07Ci0KLS8qCi0gKiBWeEZTIE9MVCBoZWFkZXIuCi0gKgotICogVGhlIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBoZWFkZXIgaXMgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotICogT0xUIGV4dGVudC4gIEl0IGlzIHVzZWQgdG8gZmluZyBjZXJ0YWluIGZpbGVzeXN0ZW0td2lkZSBtZXRhZGF0YSwgZS5nLgotICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0IHsKLQlfX2ZzMzIJCW9sdF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQlfX2ZzMzIJCW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgZW50cnkJCSovCi0JX19mczMyCQlvbHRfY2hlY2tzdW07CS8qIGNoZWNrc3VtIG9mIGV4dGVudAkJKi8KLQlfX3UzMgkJX191bnVzZWQxOwkvKiA/Pz8JCQkJKi8KLQlfX2ZzMzIJCW9sdF9tdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHNlYykJKi8KLQlfX2ZzMzIJCW9sdF9tdXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBtb2QuICh1c2VjKQkqLwotCV9fZnMzMgkJb2x0X3RvdGZyZWU7CS8qIGZyZWUgc3BhY2UgaW4gT0xUIGV4dGVudAkqLwotCV9fZnMzMgkJb2x0X2V4dGVudHNbMl07CS8qIGFkZHIgb2YgdGhpcyBleHRlbnQsIHJlcGxpY2EJKi8KLQlfX2ZzMzIJCW9sdF9lc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGV4dGVudAkJKi8KLQlfX2ZzMzIJCW9sdF9uZXh0WzJdOyAgICAvKiBhZGRyIG9mIG5leHQgZXh0ZW50LCByZXBsaWNhCSovCi0JX19mczMyCQlvbHRfbnNpemU7CS8qIHNpemUgb2YgbmV4dCBleHRlbnQJCSovCi0JX191MzIJCV9fdW51c2VkMjsJLyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5CSovCi19OwotCi0vKgotICogVnhGUyBjb21tb24gT0xUIGVudHJ5IChvbiBkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0Y29tbW9uIHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi19OwotCi0vKgotICogVnhGUyBmcmVlIE9MVCBlbnRyeSAob24gZGlzaykuCi0gKi8KLXN0cnVjdCB2eGZzX29sdGZyZWUgewotCV9fZnMzMgkJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZnNpemU7CS8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZAkqLwotfTsKLQotLyoKLSAqIFZ4RlMgaW5pdGlhbC1pbm9kZSBsaXN0IChvbiBkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0aWxpc3QgewotCV9fZnMzMglvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KLQlfX2ZzMzIJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfaWV4dFsyXTsJLyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhCSovCi19OwotCi0vKgotICogQ3VycmVudCBVc2FnZSBUYWJsZSAKLSAqLwotc3RydWN0IHZ4ZnNfb2x0Y3V0IHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfY3V0aW5vOwkvKiBpbm9kZSBvZiBjdXJyZW50IHVzYWdlIHRhYmxlCSovCi0JX191OAkJX19wYWQ7CQkvKiB1bnVzZWQsIDggYnl0ZSBhbGlnbgkJKi8KLX07Ci0KLS8qCi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIAotICovCi1zdHJ1Y3Qgdnhmc19vbHRzYiB7Ci0JX19mczMyCQlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KLQlfX2ZzMzIJCW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NiaW5vOwkvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGUJKi8KLQlfX3UzMgkJX191bnVzZWQxOwkvKiA/Pz8JCQkJKi8KLQlfX2ZzMzIJCW9sdF9sb2dpbm9bMl07CS8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2EJKi8KLQlfX2ZzMzIJCW9sdF9vbHRpbm9bMl07CS8qIGlub2RlIG9mIE9MVCwgcmVwbGljYQkqLwotfTsKLQotLyoKLSAqIElub2RlIGNvbnRhaW5pbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb24gJiM0MzsgaXQmIzM5O3MgcmVwbGljYSAKLSAqLwotc3RydWN0IHZ4ZnNfb2x0ZGV2IHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZGV2aW5vWzJdOwkvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzCSovCi19OwotCi0vKgotICogRmlsZXNldCBoZWFkZXIgCi0gKi8KLXN0cnVjdCB2eGZzX29sdGZzaGVhZCB7Ci0JX19mczMyCQlvbHRfdHlwZTsJLyogdHlwZSBudW1iZXIJCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZnNpbm9bMl07ICAgLyogaW5vZGVzIG9mIGZpbGVzZXQgaGVhZGVyCSovCi19OwotCi0jZW5kaWYgLyogX1ZYRlNfT0xUX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM5ODc3ZWE2ZTgwLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTUyICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLXN0YXRpYyBpbnQJCXZ4ZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZm9saW8gKik7Ci1zdGF0aWMgc2VjdG9yX3QJCXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7Ci0KLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0gewotCS5yZWFkX2ZvbGlvID0JCXZ4ZnNfcmVhZF9mb2xpbywKLQkuYm1hcCA9CQkJdnhmc19ibWFwLAotfTsKLQotaW5saW5lIHZvaWQKLXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBwKQotewotCWt1bm1hcChwcCk7Ci0JcHV0X3BhZ2UocHApOwotfQotCi0vKioKLSAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS4KLSAqIEBtYXBwaW5nOgltYXBwaW5nIHRvIHJlYWQgZnJvbQotICogQG46CQlwYWdlIG51bWJlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuCi0gKgotICogUmV0dXJuczoKLSAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCi0gKi8KLXN0cnVjdCBwYWdlICoKLXZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKQotewotCXN0cnVjdCBwYWdlICoJCQlwcDsKLQotCXBwID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7Ci0KLQlpZiAoIUlTX0VSUihwcCkpIHsKLQkJa21hcChwcCk7Ci0JCS8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovCi0JCQkvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovCi0JfQotCQotCXJldHVybiAocHApOwotfQotCi0vKioKLSAqIHZ4ZnNfYnJlYWQgLSByZWFkIGJ1ZmZlciBmb3IgYSBnaXZlIGlub2RlLGJsb2NrIHR1cGxlCi0gKiBAaXA6CQlpbm9kZQotICogQGJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFRoZSB2eGZzX2JyZWFkIGZ1bmN0aW9uIHJlYWRzIGJsb2NrIG5vIEBibG9jayAgb2YKLSAqICAgQGlwIGludG8gdGhlIGJ1ZmZlcmNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSByZXN1bHRpbmcgJmFtcDtzdHJ1Y3QgYnVmZmVyX2hlYWQuCi0gKi8KLXN0cnVjdCBidWZmZXJfaGVhZCAqCi12eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOwotCWRhZGRyX3QJCQlwYmxvY2s7Ci0KLQlwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7Ci0JYnAgPSBzYl9icmVhZChpcC0mZ3Q7aV9zYiwgcGJsb2NrKTsKLQotCXJldHVybiAoYnApOwotfQotCi0vKioKLSAqIHZ4ZnNfZ2V0YmxrIC0gbG9jYXRlIGJ1ZmZlciBmb3IgZ2l2ZW4gaW5vZGUsYmxvY2sgdHVwbGUKLSAqIEBpcDoJCWlub2RlCi0gKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKiBAYnA6CQlidWZmZXIgc2tlbGV0b24KLSAqIEBjcmVhdGU6CSVUUlVFIGlmIGJsb2NrcyBtYXkgYmUgbmV3bHkgYWxsb2NhdGVkLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGUgdnhmc19nZXRibGsgZnVuY3Rpb24gZmlsbHMgQGJwIHdpdGggdGhlIHJpZ2h0IHBoeXNpY2FsCi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uCi0gKiAgIGl0LgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXYgZXJyb3IgY29kZSAoLUVJTykuCi0gKi8KLXN0YXRpYyBpbnQKLXZ4ZnNfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqaXAsIHNlY3Rvcl90IGlibG9jaywKLQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSkKLXsKLQlkYWRkcl90CQkJcGJsb2NrOwotCi0JcGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTsKLQlpZiAocGJsb2NrICE9IDApIHsKLQkJbWFwX2JoKGJwLCBpcC0mZ3Q7aV9zYiwgcGJsb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qKgotICogdnhmc19yZWFkX2ZvbGlvIC0gcmVhZCBvbmUgcGFnZSBzeW5jaHJvbm91c2x5IGludG8gdGhlIHBhZ2VjYWNoZQotICogQGZpbGU6CWZpbGUgY29udGV4dCAodW51c2VkKQotICogQGZvbGlvOglmb2xpbyB0byBmaWxsIGluLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGUKLSAqICAgcGFnZWNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKgotICogTG9ja2luZyBzdGF0dXM6Ci0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQotewotCXJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTsKLX0KLSAKLS8qKgotICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKLSAqIEBtYXBwaW5nOglsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlCi0gKiBAYmxvY2s6CWxvZ2ljYWwgYmxvY2sgKHJlbGF0aXZlIHRvIEBtYXBwaW5nKS4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVnhmc19ibWFwIGZpbmQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIHBoc2ljYWwgYmxvY2sgdG8gdGhlCi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci4KLSAqCi0gKiBSZXR1cm5zOgotICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICoKLSAqIExvY2tpbmcgc3RhdHVzOgotICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC4KLSAqLwotc3RhdGljIHNlY3Rvcl90Ci12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQotewotCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkODQ3ZDc1YzNkNS4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwzNDcgJiM0MzswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgcmVsYXRlZCByb3V0aW5lcy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKLQotI2luY2x1ZGUgJmx0O2xpbnV4L2Jsa2Rldi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvYnVmZmVyX2hlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3RhdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3Zmcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKLQotI2luY2x1ZGUgJiMzNDt2eGZzLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2V4dGVybi5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19kaXIuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0KLQotTU9EVUxFX0FVVEhPUigmIzM0O0NocmlzdG9waCBIZWxsd2lnLCBLcnp5c3p0b2YgQmxhc3prb3dza2kmIzM0Oyk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oJiMzNDtWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlciYjMzQ7KTsKLU1PRFVMRV9MSUNFTlNFKCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwotCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwOwotCi0vKioKLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlcwotICogQHNicDoJVkZTIHN1cGVyYmxvY2suCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfcHV0X3N1cGVyIGZyZWVzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBAc2JwCi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KLSAqLwotCi1zdGF0aWMgdm9pZAotdnhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0KLQlpcHV0KGluZnAtJmd0O3ZzaV9mc2hpcCk7Ci0JaXB1dChpbmZwLSZndDt2c2lfaWxpc3QpOwotCWlwdXQoaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpOwotCi0JYnJlbHNlKGluZnAtJmd0O3ZzaV9icCk7Ci0Ja2ZyZWUoaW5mcCk7Ci19Ci0KLS8qKgotICogdnhmc19zdGF0ZnMgLSBnZXQgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbgotICogQGRlbnRyeToJVkZTIGRlbnRyeSB0byBsb2NhdGUgc3VwZXJibG9jawotICogQGJ1ZnA6CW91dHB1dCBidWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvbgotICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQGRlbnRyeS4KLSAqCi0gKiBSZXR1cm5zOgotICogICBaZXJvLgotICoKLSAqIExvY2tpbmc6Ci0gKiAgIE5vIGxvY2tzIGhlbGQuCi0gKgotICogTm90ZXM6Ci0gKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi4KLSAqLwotc3RhdGljIGludAotdnhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmcCkKLXsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCQkqaW5mcCA9IFZYRlNfU0JJKGRlbnRyeS0mZ3Q7ZF9zYik7Ci0Jc3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtJmd0O3ZzaV9yYXc7Ci0JdTY0IGlkID0gaHVnZV9lbmNvZGVfZGV2KGRlbnRyeS0mZ3Q7ZF9zYi0mZ3Q7c19iZGV2LSZndDtiZF9kZXYpOwotCi0JYnVmcC0mZ3Q7Zl90eXBlID0gVlhGU19TVVBFUl9NQUdJQzsKLQlidWZwLSZndDtmX2JzaXplID0gZGVudHJ5LSZndDtkX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQlidWZwLSZndDtmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi0mZ3Q7dnNfZHNpemUpOwotCWJ1ZnAtJmd0O2ZfYmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItJmd0O3ZzX2ZyZWUpOwotCWJ1ZnAtJmd0O2ZfYmF2YWlsID0gMDsKLQlidWZwLSZndDtmX2ZpbGVzID0gMDsKLQlidWZwLSZndDtmX2ZmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLSZndDt2c19pZnJlZSk7Ci0JYnVmcC0mZ3Q7Zl9mc2lkID0gdTY0X3RvX2ZzaWQoaWQpOwotCWJ1ZnAtJmd0O2ZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKQotewotCXN5bmNfZmlsZXN5c3RlbShmYy0mZ3Q7cm9vdC0mZ3Q7ZF9zYik7Ci0JZmMtJmd0O3NiX2ZsYWdzIHw9IFNCX1JET05MWTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpbm9kZSAqdnhmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpOwotCi0JdmkgPSBhbGxvY19pbm9kZV9zYihzYiwgdnhmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmICghdmkpCi0JCXJldHVybiBOVUxMOwotCWlub2RlX2luaXRfb25jZSgmYW1wO3ZpLSZndDt2ZnNfaW5vZGUpOwotCXJldHVybiAmYW1wO3ZpLSZndDt2ZnNfaW5vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ4ZnNfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWttZW1fY2FjaGVfZnJlZSh2eGZzX2lub2RlX2NhY2hlcCwgVlhGU19JTk8oaW5vZGUpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHZ4ZnNfc3VwZXJfb3BzID0gewotCS5hbGxvY19pbm9kZQkJPSB2eGZzX2FsbG9jX2lub2RlLAotCS5mcmVlX2lub2RlCQk9IHZ4ZnNfZnJlZV9pbm9kZSwKLQkuZXZpY3RfaW5vZGUJCT0gdnhmc19ldmljdF9pbm9kZSwKLQkucHV0X3N1cGVyCQk9IHZ4ZnNfcHV0X3N1cGVyLAotCS5zdGF0ZnMJCQk9IHZ4ZnNfc3RhdGZzLAotfTsKLQotc3RhdGljIGludCB2eGZzX3RyeV9zYl9tYWdpYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IGZzX2NvbnRleHQgKmZjLAotCQl1bnNpZ25lZCBibGssIF9fZnMzMiBtYWdpYykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJwOwotCXN0cnVjdCB2eGZzX3NiICpyc2JwOwotCXN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnAgPSBWWEZTX1NCSShzYnApOwotCWludCBzaWxlbnQgPSBmYy0mZ3Q7c2JfZmxhZ3MgJmFtcDsgU0JfU0lMRU5UOwotCWludCByYyA9IC1FTk9NRU07Ci0KLQlicCA9IHNiX2JyZWFkKHNicCwgYmxrKTsKLQlkbyB7Ci0JCWlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKSB7Ci0JCQlpZiAoIXNpbGVudCkgewotCQkJCXdhcm5mKGZjLAotCQkJCSAgICAgICYjMzQ7dnhmczogdW5hYmxlIHRvIHJlYWQgZGlzayBzdXBlcmJsb2NrIGF0ICV1JiMzNDssCi0JCQkJICAgICAgYmxrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmMgPSAtRUlOVkFMOwotCQlyc2JwID0gKHN0cnVjdCB2eGZzX3NiICopYnAtJmd0O2JfZGF0YTsKLQkJaWYgKHJzYnAtJmd0O3ZzX21hZ2ljICE9IG1hZ2ljKSB7Ci0JCQlpZiAoIXNpbGVudCkKLQkJCQlpbmZvZihmYywKLQkJCQkgICAgICAmIzM0O3Z4ZnM6IFdST05HIHN1cGVyYmxvY2sgbWFnaWMgJTA4eCBhdCAldSYjMzQ7LAotCQkJCSAgICAgIHJzYnAtJmd0O3ZzX21hZ2ljLCBibGspOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IDA7Ci0JCWluZnAtJmd0O3ZzaV9yYXcgPSByc2JwOwotCQlpbmZwLSZndDt2c2lfYnAgPSBicDsKLQl9IHdoaWxlICgwKTsKLQotCWlmIChyYykgewotCQlpbmZwLSZndDt2c2lfcmF3ID0gTlVMTDsKLQkJaW5mcC0mZ3Q7dnNpX2JwID0gTlVMTDsKLQkJYnJlbHNlKGJwKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKgotICogdnhmc19maWxsX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0aWFsaXplIGZpbGVzeXN0ZW0KLSAqIEBzYnA6CQlWRlMgc3VwZXJibG9jayAodG8gZmlsbCkKLSAqIEBmYzoJCQlmaWxlc3l0ZW0gY29udGV4dAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGUKLSAqICAgc3VwZXJibG9jayBpbnRvIG1lbW9yeSBhbmQgZG8gc29tZSBiYXNpYyBzZXR1cC4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgc3VwZXJibG9jayBvbiBzdWNjZXNzLCBlbHNlICVOVUxMLgotICoKLSAqIExvY2tpbmc6Ci0gKiAgIFdlIGFyZSB1bmRlciBAc2JwLSZndDtzX2xvY2suCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcDsKLQlzdHJ1Y3Qgdnhmc19zYgkJKnJzYnA7Ci0JdV9sb25nCQkJYnNpemU7Ci0Jc3RydWN0IGlub2RlICpyb290OwotCWludCByZXQgPSAtRUlOVkFMOwotCWludCBzaWxlbnQgPSBmYy0mZ3Q7c2JfZmxhZ3MgJmFtcDsgU0JfU0lMRU5UOwotCXUzMiBqOwotCi0Jc2JwLSZndDtzX2ZsYWdzIHw9IFNCX1JET05MWTsKLQotCWluZnAgPSBremFsbG9jX29iaigqaW5mcCk7Ci0JaWYgKCFpbmZwKSB7Ci0JCXdhcm5mKGZjLCAmIzM0O3Z4ZnM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbmNvcmUgc3VwZXJibG9jayYjMzQ7KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYnNpemUgPSBzYl9taW5fYmxvY2tzaXplKHNicCwgQkxPQ0tfU0laRSk7Ci0JaWYgKCFic2l6ZSkgewotCQl3YXJuZihmYywgJiMzNDt2eGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSYjMzQ7KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc2JwLSZndDtzX29wID0gJmFtcDt2eGZzX3N1cGVyX29wczsKLQlzYnAtJmd0O3NfZnNfaW5mbyA9IGluZnA7Ci0Jc2JwLSZndDtzX3RpbWVfbWluID0gMDsKLQlzYnAtJmd0O3NfdGltZV9tYXggPSBVMzJfTUFYOwotCi0JaWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLAotCQkJKF9fZm9yY2UgX19mczMyKWNwdV90b19sZTMyKFZYRlNfU1VQRVJfTUFHSUMpKSkgewotCQkvKiBVbml4d2FyZSwgeDg2ICovCi0JCWluZnAtJmd0O2J5dGVfb3JkZXIgPSBWWEZTX0JPX0xFOwotCX0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsCi0JCQkoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2JlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7Ci0JCS8qIEhQLVVYLCBwYXJpc2MgKi8KLQkJaW5mcC0mZ3Q7Ynl0ZV9vcmRlciA9IFZYRlNfQk9fQkU7Ci0JfSBlbHNlIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlpbmZvZihmYywgJiMzNDt2eGZzOiBjYW4mIzM5O3QgZmluZCBzdXBlcmJsb2NrLiYjMzQ7KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcnNicCA9IGluZnAtJmd0O3ZzaV9yYXc7Ci0JaiA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtJmd0O3ZzX3ZlcnNpb24pOwotCWlmICgoaiAmbHQ7IDIgfHwgaiAmZ3Q7IDQpICZhbXA7JmFtcDsgIXNpbGVudCkgewotCQlpbmZvZihmYywgJiMzNDt2eGZzOiB1bnN1cHBvcnRlZCBWeEZTIHZlcnNpb24gKCVkKSYjMzQ7LCBqKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0jaWZkZWYgRElBR05PU1RJQwotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7dnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4mIzM0Oywgaik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDt2eGZzOiBibG9ja3NpemU6ICVkXG4mIzM0OywKLQkJZnMzMl90b19jcHUoaW5mcCwgcnNicC0mZ3Q7dnNfYnNpemUpKTsKLSNlbmRpZgotCi0Jc2JwLSZndDtzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC0mZ3Q7dnNfbWFnaWMpOwotCi0JaW5mcC0mZ3Q7dnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtJmd0O3ZzX29sdGV4dFswXSk7Ci0JaW5mcC0mZ3Q7dnNpX29sdHNpemUgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLSZndDt2c19vbHRzaXplKTsKLQotCWogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLSZndDt2c19ic2l6ZSk7Ci0JaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgaikpIHsKLQkJd2FybmYoZmMsICYjMzQ7dnhmczogdW5hYmxlIHRvIHNldCBmaW5hbCBibG9jayBzaXplJiMzNDspOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodnhmc19yZWFkX29sdChzYnAsIGJzaXplKSkgewotCQl3YXJuZihmYywgJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHQmIzM0Oyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHsKLQkJd2FybmYoZmMsICYjMzQ7dnhmczogdW5hYmxlIHRvIHJlYWQgZnNoZWFkJiMzNDspOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyb290ID0gdnhmc19pZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7Ci0JaWYgKElTX0VSUihyb290KSkgewotCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2JwLSZndDtzX3Jvb3QgPSBkX21ha2Vfcm9vdChyb290KTsKLQlpZiAoIXNicC0mZ3Q7c19yb290KSB7Ci0JCXdhcm5mKGZjLCAmIzM0O3Z4ZnM6IHVuYWJsZSB0byBnZXQgcm9vdCBkZW50cnkuJiMzNDspOwotCQlnb3RvIG91dF9mcmVlX2lsaXN0OwotCX0KLQotCXJldHVybiAwOwotCQotb3V0X2ZyZWVfaWxpc3Q6Ci0JaXB1dChpbmZwLSZndDt2c2lfZnNoaXApOwotCWlwdXQoaW5mcC0mZ3Q7dnNpX2lsaXN0KTsKLQlpcHV0KGluZnAtJmd0O3ZzaV9zdGlsaXN0KTsKLW91dDoKLQlicmVsc2UoaW5mcC0mZ3Q7dnNpX2JwKTsKLQlrZnJlZShpbmZwKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi4KLSAqLwotc3RhdGljIGludCB2eGZzX2dldF90cmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYykKLXsKLQlyZXR1cm4gZ2V0X3RyZWVfYmRldihmYywgdnhmc19maWxsX3N1cGVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmc19jb250ZXh0X29wZXJhdGlvbnMgdnhmc19jb250ZXh0X29wcyA9IHsKLQkuZ2V0X3RyZWUJPSB2eGZzX2dldF90cmVlLAotCS5yZWNvbmZpZ3VyZQk9IHZ4ZnNfcmVjb25maWd1cmUsCi19OwotCi1zdGF0aWMgaW50IHZ4ZnNfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKLXsKLQlmYy0mZ3Q7b3BzID0gJmFtcDt2eGZzX2NvbnRleHRfb3BzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICYjMzQ7dnhmcyYjMzQ7LAotCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKLQkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCi0JLmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LAotfTsKLU1PRFVMRV9BTElBU19GUygmIzM0O3Z4ZnMmIzM0Oyk7IC8qIG1ha2VzIG1vdW50IC10IHZ4ZnMgYXV0b2xvYWQgdGhlIG1vZHVsZSAqLwotTU9EVUxFX0FMSUFTKCYjMzQ7dnhmcyYjMzQ7KTsKLQotc3RhdGljIGludCBfX2luaXQKLXZ4ZnNfaW5pdCh2b2lkKQotewotCWludCBydjsKLQotCXZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoJiMzNDt2eGZzX2lub2RlJiMzNDssCi0JCQlzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsCi0JCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKLQkJCW9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksCi0JCQlzaXplb2ZfZmllbGQoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbywKLQkJCQl2aWlfaW1tZWQudmlfaW1tZWQpLAotCQkJTlVMTCk7Ci0JaWYgKCF2eGZzX2lub2RlX2NhY2hlcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcnYgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZhbXA7dnhmc19mc190eXBlKTsKLQlpZiAocnYgJmx0OyAwKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApOwotCXJldHVybiBydjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci12eGZzX2NsZWFudXAodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFtcDt2eGZzX2ZzX3R5cGUpOwotCS8qCi0JICogTWFrZSBzdXJlIGFsbCBkZWxheWVkIHJjdSBmcmVlIGlub2RlcyBhcmUgZmx1c2hlZCBiZWZvcmUgd2UKLQkgKiBkZXN0cm95IGNhY2hlLgotCSAqLwotCXJjdV9iYXJyaWVyKCk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTsKLX0KLQotbW9kdWxlX2luaXQodnhmc19pbml0KTsKLW1vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzMwIDE4OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNzQ0CgkJCQkJCQlvdXRwdXQ6IDU4CgkJCQkJCQl0aG91Z2h0czogNjQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHRoYXQgZXNzZW50aWFsbHkgbnVrZXMgdGhlIGBmcmVldnhmc2AgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIEl0JiMzOTtzIGEgY29tcGxldGUgcmVtb3ZhbDsgdGhlIGVudGlyZSBgZnMvZnJlZXZ4ZnMvYCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgYXJlIGdvbmUuIE5hdHVyYWxseSwgdGhlIGFzc29jaWF0ZWQgZW50cmllcyBpbiBgZnMvS2NvbmZpZ2AsIGBmcy9NYWtlZmlsZWAsIGFuZCBgTUFJTlRBSU5FUlNgIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIHdlbGwuCgpUaGUgaW1tZWRpYXRlIHRob3VnaHQgaXM6IFNpbmNlIHdlJiMzOTtyZSAqcmVtb3ZpbmcqIGNvZGUsIHRoZXJlJiMzOTtzIG5vdGhpbmcgKm5ldyogdG8gZnV6ei4gTm8gbmV3IGF0dGFjayBzdXJmYWNlIGludHJvZHVjZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLgoKQnV0LCBhcyBhbHdheXMsIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgcHJvbXB0IHJlbWluZHMgbWUgdGhhdCBjZXJ0YWluIHR5cGVzIG9mIGNoYW5nZXMgZG9uJiMzOTt0IHdhcnJhbnQgZnV6emluZy4gVGhpbmdzIGxpa2UgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLCBLY29uZmlnIHR3ZWFrcywgb3IgY29tbWVudCBjaGFuZ2VzIGFyZSBleGNsdWRlZC4gQWxzbyBkZWNvcmF0aXZlIGxvZ2dpbmcsIHVucmVhY2hhYmxlIGNvZGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCBzcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJbiB0aGlzIGNhc2UsIGl0JiMzOTtzIGEgKnJlbW92YWwqIG9mIHRoZSBjb2RlLgoKQWxyaWdodCwgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIFRoZSBkaWZmIHNob3dzLi4uIHllYWgsIGl0JiMzOTtzIGEgd2hvbGVzYWxlIGRlbGV0aW9uLiBUaGUgTUFJTlRBSU5FUlMsIEtjb25maWcsIE1ha2VmaWxlIGFuZCBhbGwgdGhlIGZpbGVzIGluc2lkZSB0aGUgZGlyZWN0b3J5LCBhbGwgZGVsZXRlZDogYHZ4ZnMuaGAsIGB2eGZzX2JtYXAuY2AsIGB2eGZzX2Rpci5oYCwgYHZ4ZnNfZXh0ZXJuLmhgLCBhbmQgb24gYW5kIG9uLi4uYWxsIGRlbGV0ZWQuCgpTbywgdGhlcmUmIzM5O3Mgbm8gbmV3IGNvZGUgaW50cm9kdWNlZCwganVzdCBjb2RlIHJlbW92ZWQuIE5vIG5lZWQgdG8gZnV6eiBhbnl0aGluZyBoZXJlLgoKT2theSwganVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIHRha2Ugb25lIGxhc3QgbG9vayB0aHJvdWdoIHRoZSBkaWZmIHRvIG1ha2Ugc3VyZSBub3RoaW5nIGVsc2Ugc2xpcHBlZCBpbi4gTm8sIHRoYXQmIzM5O3MgaXQuIEl0JiMzOTtzIHB1cmVseSBhIGRlbGV0aW9uIG9mIHRoZSBgZnJlZXZ4ZnNgIGZpbGVzeXN0ZW0uCgpUaGVyZWZvcmUsIG15IGZpbmFsIGFzc2Vzc21lbnQgaXMgYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMzAgMTg6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIGZyZWV2eGZzIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBUaGVyZSBpcyBubyBuZXcgb3IgbW9kaWZpZWQgY29kZSB0byBmdXp6LCBvbmx5IGRlbGV0ZWQgY29kZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTMwVDE4OjQwOjEwLjMxMjEzODY0OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkwNzM1MjgwNTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMzBUMTg6NDA6MTAuMzEyMTQ0ODE5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozOTk5ODg0NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA4ZGFlNTE0OGMxMDQ1ZmQwMGU1YWE5MTMxZjdkMzU4NDY0YzBjOGU1XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVsIDMwIDE4OjQwOjA5IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTA1NjUsMTIgKzEwNTY1LDYgQEAgTDpcXHRsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZ1xcbiBTOlxcdE9ycGhhblxcbiBGOlxcdGRyaXZlcnMvdXNiL3BoeS9waHktZnNsLXVzYipcXG4gXFxuLUZSRUVWWEZTIEZJTEVTWVNURU1cXG4tTTpcXHRDaHJpc3RvcGggSGVsbHdpZyBcXHUwMDNjaGNoQGluZnJhZGVhZC5vcmdcXHUwMDNlXFxuLVM6XFx0TWFpbnRhaW5lZFxcbi1XOlxcdGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL3Z4ZnNcXG4tRjpcXHRmcy9mcmVldnhmcy9cXG4tXFxuIEZSRUVaRVJcXG4gTTpcXHRcXFwiUmFmYWVsIEouIFd5c29ja2lcXFwiIFxcdTAwM2NyYWZhZWxAa2VybmVsLm9yZ1xcdTAwM2VcXG4gUjpcXHRQYXZlbCBNYWNoZWsgXFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcXHUwMDNlXFxuZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnXFxuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcXG4tLS0gYS9mcy9LY29uZmlnXFxuKysrIGIvZnMvS2NvbmZpZ1xcbkBAIC0zMjEsNyArMzIxLDYgQEAgc291cmNlIFxcXCJmcy9qZmZzMi9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL3ViaWZzL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvY3JhbWZzL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvc3F1YXNoZnMvS2NvbmZpZ1xcXCJcXG4tc291cmNlIFxcXCJmcy9mcmVldnhmcy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL21pbml4L0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvb21mcy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL2hwZnMvS2NvbmZpZ1xcXCJcXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxcbmluZGV4IDg5YThhOWQyMDdkMWMuLmFjMGQxYzAwNTIzZjAgMTAwNjQ0XFxuLS0tIGEvZnMvTWFrZWZpbGVcXG4rKysgYi9mcy9NYWtlZmlsZVxcbkBAIC04MCw3ICs4MCw2IEBAIG9iai0kKENPTkZJR19JU085NjYwX0ZTKVxcdCs9IGlzb2ZzL1xcbiBvYmotJChDT05GSUdfSEZTUExVU19GUylcXHQrPSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUytcXG4gb2JqLSQoQ09ORklHX0hGU19GUylcXHRcXHQrPSBoZnMvXFxuIG9iai0kKENPTkZJR19FQ1JZUFRfRlMpXFx0XFx0Kz0gZWNyeXB0ZnMvXFxuLW9iai0kKENPTkZJR19WWEZTX0ZTKVxcdFxcdCs9IGZyZWV2eGZzL1xcbiBvYmotJChDT05GSUdfTkZTX0ZTKVxcdFxcdCs9IG5mcy9cXG4gb2JqLSQoQ09ORklHX0VYUE9SVEZTKVxcdFxcdCs9IGV4cG9ydGZzL1xcbiBvYmotJChDT05GSUdfTkZTRClcXHRcXHQrPSBuZnNkL1xcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDkxMjEwN2ViZWE2ZjQuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI3ICswLDAgQEBcXG4tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLWNvbmZpZyBWWEZTX0ZTXFxuLVxcdHRyaXN0YXRlIFxcXCJGcmVlVnhGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChWRVJJVEFTIFZ4RlMoVE0pIGNvbXBhdGlibGUpXFxcIlxcbi1cXHRkZXBlbmRzIG9uIEJMT0NLXFxuLVxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbi1cXHRoZWxwXFxuLVxcdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXFxuLVxcdCAgZmlsZSBzeXN0ZW0gZm9ybWF0LiAgVkVSSVRBUyBWeEZTKFRNKSBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW1cXG4tXFx0ICBvZiBTQ08gVW5peFdhcmUgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGFuZCBvcHRpb25hbGx5IGF2YWlsYWJsZVxcbi1cXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXFxuLVxcdCAgdGhlc2UgcGFydGljdWxhciBPUyBpbXBsZW1lbnRhdGlvbnMgb2YgdnhmcyBtYXkgZGlmZmVyIGluIG9uLWRpc2tcXG4tXFx0ICBkYXRhIGVuZGlhbm5lc3MgYW5kL29yIHN1cGVyYmxvY2sgb2Zmc2V0LiBUaGUgdnhmcyBtb2R1bGUgaGFzIGJlZW5cXG4tXFx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxcbi1cXHQgIEN1cnJlbnRseSBvbmx5IHJlYWRvbmx5IGFjY2VzcyBpcyBzdXBwb3J0ZWQgYW5kIFZ4RlggdmVyc2lvbnNcXG4tXFx0ICAyLCAzIGFuZCA0LiBUZXN0cyB3ZXJlIHBlcmZvcm1lZCB3aXRoIEhQLVVYIFZ4RlMgdmVyc2lvbiAzLlxcbi1cXG4tXFx0ICBOT1RFOiB0aGUgZmlsZSBzeXN0ZW0gdHlwZSBhcyB1c2VkIGJ5IG1vdW50KDEpLCBtb3VudCgyKSBhbmRcXG4tXFx0ICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdFxcbi1cXHQgIHRoZSBhY3R1YWwgZHJpdmVyLlxcbi1cXG4tXFx0ICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXNcXG4tXFx0ICBjcmVhdGluZyBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgZWFzeSBmcm9tIEhQLVVYIGRpc2sgYmxvY2sgZGV2aWNlIGZpbGVcXG4tXFx0ICBvciByZWd1bGFyIGZpbGUgd2l0aCBpbWFnZSBvZiB0aGUgZGlzay4gU2VlOlxcbi1cXHQgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzL1xcbi1cXG4tXFx0ICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxcbi1cXHQgIGNhbGxlZCBmcmVldnhmcy4gIElmIHVuc3VyZSwgc2F5IE4uXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBlNmVlNTkyOTE1MjFjLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsOSArMCwwIEBAXFxuLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0jXFxuLSMgVnhGUyBNYWtlZmlsZVxcbi0jXFxuLVxcbi1vYmotJChDT05GSUdfVlhGU19GUykgKz0gZnJlZXZ4ZnMub1xcbi1cXG4tZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXFxcXFxcbi1cXHRcXHQgdnhmc19sb29rdXAubyB2eGZzX29sdC5vIHZ4ZnNfc3Vici5vIHZ4ZnNfc3VwZXIub1xcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBiZmZkMTU2ZDY0MzRjLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmcy5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI1NyArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLSNpZm5kZWYgX1ZYRlNfU1VQRVJfSF9cXG4tI2RlZmluZSBfVlhGU19TVVBFUl9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgc3RydWN0dXJlLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmVcXG4tICogc3VwZXJibG9ja3Mgb2YgdGhlIFZlcml0YXMgRmlsZXN5c3RlbS5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbi1cXG4tLypcXG4tICogU3VwZXJibG9jayBtYWdpYyBudW1iZXIgKHZ4ZnNfc3VwZXItXFx1MDAzZXZzX21hZ2ljKS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19TVVBFUl9NQUdJQ1xcdDB4YTUwMUZDRjVcXG4tXFxuLS8qXFxuLSAqIFRoZSByb290IGlub2RlLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX1JPT1RfSU5PXFx0XFx0Mlxcbi1cXG4tLypcXG4tICogTnVtIG9mIGVudHJpZXMgaW4gZnJlZSBleHRlbnQgYXJyYXlcXG4tICovXFxuLSNkZWZpbmUgVlhGU19ORUZSRUVcXHRcXHQzMlxcbi1cXG4tZW51bSB2eGZzX2J5dGVfb3JkZXIge1xcbi1cXHRWWEZTX0JPX0xFLFxcbi1cXHRWWEZTX0JPX0JFLFxcbi19O1xcbi1cXG4tdHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2O1xcbi10eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2ZzMzI7XFxuLXR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fZnM2NDtcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19zYiB7XFxuLVxcdC8qXFxuLVxcdCAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLlxcbi1cXHQgKlxcbi1cXHQgKiBMb3RzIG9mIHRoaXMgZmllbGRzIGFyZSBubyBtb3JlIHVzZWQgYnkgdmVyc2lvbiAyXFxuLVxcdCAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy5cXG4tXFx0ICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX21hZ2ljO1xcdFxcdC8qIE1hZ2ljIG51bWJlciAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c192ZXJzaW9uO1xcdFxcdC8qIFZ4RlMgdmVyc2lvbiAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19jdGltZTtcXHRcXHQvKiBjcmVhdGUgdGltZSAtIHNlY3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfY3V0aW1lO1xcdFxcdC8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi9cXG4tXFx0X19mczMyXFx0XFx0X191bnVzZWQxO1xcdFxcdC8qIHVudXNlZCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRfX3VudXNlZDI7XFx0XFx0LyogdW51c2VkICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9sb2dzdGFydDtcXHQvKiBvYnNvbGV0ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfbG9nZW5kO1xcdFxcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzaXplO1xcdFxcdC8qIGJsb2NrIHNpemUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfc2l6ZTtcXHRcXHQvKiBudW1iZXIgb2YgYmxvY2tzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2RzaXplO1xcdFxcdC8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfbmlub2RlO1xcdFxcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9uYXU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0X191bnVzZWQzO1xcdFxcdC8qIHVudXNlZCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfZGVmaWV4dHNpemU7XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX2lsYnNpemU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaW1tZWRsZW47XFx0XFx0Lyogc2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBhcmVhICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX25kYWRkcjtcXHRcXHQvKiBudW1iZXIgb2YgZGlyZWN0IGV4dGVudGVzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2ZpcnN0YXU7XFx0XFx0LyogYWRkcmVzcyBvZiBmaXJzdCBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19lbWFwO1xcdFxcdC8qIG9mZnNldCBvZiBleHRlbnQgbWFwIGluIEFVICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2ltYXA7XFx0XFx0Lyogb2Zmc2V0IG9mIGlub2RlIG1hcCBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19pZXh0b3A7XFx0XFx0Lyogb2Zmc2V0IG9mIEV4dE9wLiBtYXAgaW4gQVUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaXN0YXJ0O1xcdFxcdC8qIG9mZnNldCBvZiBpbm9kZSBsaXN0IGluIEFVICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzdGFydDtcXHRcXHQvKiBvZmZzZXQgb2YgZmRibG9jayBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mZW1hcDtcXHRcXHQvKiBhdWZpcnN0ICsgZW1hcCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19maW1hcDtcXHRcXHQvKiBhdWZpcnN0ICsgaW1hcCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19maWV4dG9wO1xcdFxcdC8qIGF1Zmlyc3QgKyBpZXh0b3AgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZmlzdGFydDtcXHRcXHQvKiBhdWZpcnN0ICsgaXN0YXJ0ICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2Zic3RhcnQ7XFx0XFx0LyogYXVmaXJzdCArIGJzdGFydCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19uaW5kaXI7XFx0XFx0LyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYXVsZW47XFx0XFx0LyogbGVuZ3RoIG9mIEFVIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWltbGVuO1xcdFxcdC8qIGxlbmd0aCBvZiBpbWFwIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWVtbGVuO1xcdFxcdC8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWlsZW47XFx0XFx0LyogbGVuZ3RoIG9mIGlsaXN0IGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdXBhZDtcXHRcXHQvKiBsZW5ndGggb2YgcGFkIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWJsb2NrcztcXHRcXHQvKiBkYXRhIGJsb2NrcyBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19tYXh0aWVyO1xcdFxcdC8qIGxvZyBiYXNlIDIgb2YgYXVibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaW5vcGI7XFx0XFx0LyogbnVtYmVyIG9mIGlub2RlcyBwZXIgYmxrICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9pbm9wYXU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX2lub3BpbGI7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX25kaXJpcGF1O1xcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2lhZGRybGVuO1xcdFxcdC8qIHNpemUgb2YgaW5kaXJlY3QgYWRkciBleHQuICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzaGlmdDtcXHRcXHQvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2lub3NoaWZ0O1xcdFxcdC8qIGxvZyBiYXNlIDIgb2YgaW5vYnAgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYm1hc2s7XFx0XFx0LyogfiggYnNpemUgLSAxICkgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYm9mZm1hc2s7XFx0XFx0LyogYnNpemUgLSAxICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9pbm9tYXNrO1xcdFxcdC8qIG9sZF9pbm9waWxiIC0gMSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19jaGVja3N1bTtcXHRcXHQvKiBjaGVja3N1bSBvZiBWMSBkYXRhICovXFxuLVxcdFxcbi1cXHQvKlxcbi1cXHQgKiBWZXJzaW9uIDEsIHdyaXRhYmxlXFxuLVxcdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mcmVlO1xcdFxcdC8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19pZnJlZTtcXHRcXHQvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZWZyZWVbVlhGU19ORUZSRUVdO1xcdC8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mbGFncztcXHRcXHQvKiBmbGFncyA/IT8gKi9cXG4tXFx0X191OFxcdFxcdHZzX21vZDtcXHRcXHRcXHQvKiBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi9cXG4tXFx0X191OFxcdFxcdHZzX2NsZWFuO1xcdFxcdC8qIGNsZWFuIEZTICovXFxuLVxcdF9fZnMxNlxcdFxcdF9fdW51c2VkNDtcXHRcXHQvKiB1bnVzZWQgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZmlyc3Rsb2dpZDtcXHRcXHQvKiBtb3VudCB0aW1lIGxvZyBJRCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c193dGltZTtcXHRcXHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHNlYyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c193dXRpbWU7XFx0XFx0LyogbGFzdCB0aW1lIHdyaXR0ZW4gLSB1c2VjICovXFxuLVxcdF9fdThcXHRcXHR2c19mbmFtZVs2XTtcXHRcXHQvKiBGUyBuYW1lICovXFxuLVxcdF9fdThcXHRcXHR2c19mcGFja1s2XTtcXHRcXHQvKiBGUyBwYWNrIG5hbWUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfbG9ndmVyc2lvbjtcXHRcXHQvKiBsb2cgZm9ybWF0IHZlcnNpb24gKi9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDU7XFx0XFx0LyogdW51c2VkICovXFxuLVxcdFxcbi1cXHQvKlxcbi1cXHQgKiBWZXJzaW9uIDIsIFJlYWQtb25seVxcbi1cXHQgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2x0ZXh0WzJdO1xcdFxcdC8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2x0c2l6ZTtcXHRcXHQvKiBPTFQgZXh0ZW50IHNpemUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaWF1aW1sZW47XFx0XFx0Lyogc2l6ZSBvZiBpbm9kZSBtYXAgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaWF1c2l6ZTtcXHRcXHQvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZGlub3NpemU7XFx0XFx0Lyogc2l6ZSBvZiBpbm9kZSBpbiBieXRlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfZG5pYWRkcjtcXHRcXHQvKiBpbmRpciBsZXZlbHMgcGVyIGlub2RlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2NoZWNrc3VtMjtcXHRcXHQvKiBjaGVja3N1bSBvZiBWMiBSTyAqL1xcbi1cXG4tXFx0LypcXG4tXFx0ICogQWN0dWFsbHkgbXVjaCBtb3JlLi4uXFxuLVxcdCAqL1xcbi19O1xcbi1cXG4tXFxuLS8qXFxuLSAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy5cXG4tICovXFxuLXN0cnVjdCB2eGZzX3NiX2luZm8ge1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYlxcdFxcdCp2c2lfcmF3O1xcdC8qIHJhdyAob24gZGlzaykgc3VwZXJibG9jayAqL1xcbi1cXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcXHQqdnNpX2JwO1xcdC8qIGJ1ZmZlciBmb3IgcmF3IHN1cGVyYmxvY2sqL1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHQqdnNpX2ZzaGlwO1xcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXFxuLVxcdHN0cnVjdCBpbm9kZVxcdFxcdCp2c2lfaWxpc3Q7XFx0LyogaW5vZGUgbGlzdCBpbm9kZSAqL1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHQqdnNpX3N0aWxpc3Q7XFx0Lyogc3RydWN0dXJhbCBpbm9kZSBsaXN0IGlub2RlICovXFxuLVxcdHVfbG9uZ1xcdFxcdFxcdHZzaV9pZXh0O1xcdC8qIGluaXRpYWwgaW5vZGUgbGlzdCAqL1xcbi1cXHRpbm9fdFxcdFxcdFxcdHZzaV9mc2hpbm87XFx0LyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi9cXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdHZzaV9vbHRleHQ7XFx0LyogT0xUIGV4dGVudCAqL1xcbi1cXHRkYWRkcl90XFx0XFx0XFx0dnNpX29sdHNpemU7XFx0LyogT0xUIHNpemUgKi9cXG4tXFx0ZW51bSB2eGZzX2J5dGVfb3JkZXJcXHRieXRlX29yZGVyO1xcbi19O1xcbi1cXG4tc3RhdGljIGlubGluZSB1MTYgZnMxNl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMTYgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNilhKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1MzIgZnMzMl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMzIgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMilhKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1NjQgZnM2NF90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzNjQgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTY0X3RvX2NwdSgoX19mb3JjZSBfX2JlNjQpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlNjRfdG9fY3B1KChfX2ZvcmNlIF9fbGU2NClhKTtcXG4tfVxcbi1cXG4tLypcXG4tICogRmlsZSBtb2Rlcy4gIEZpbGUgdHlwZXMgYWJvdmUgMHhmMDAwIGFyZSB2eGZzIGludGVybmFsIG9ubHksIHRoZXkgc2hvdWxkXFxuLSAqIG5vdCBiZSBwYXNzZWQgYmFjayB0byBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBzeXN0ZW0uICB2eGZzIGZpbGUgdHlwZXMgbXVzdFxcbi0gKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuXFxuLSAqL1xcbi1lbnVtIHZ4ZnNfbW9kZSB7XFxuLVxcdFZYRlNfSVNVSUQgPSAweDAwMDAwODAwLFxcdC8qIHNldHVpZCAqL1xcbi1cXHRWWEZTX0lTR0lEID0gMHgwMDAwMDQwMCxcXHQvKiBzZXRnaWQgKi9cXG4tXFx0VlhGU19JU1ZUWCA9IDB4MDAwMDAyMDAsXFx0Lyogc3RpY2t5IGJpdCAqL1xcbi1cXHRWWEZTX0lSRUFEID0gMHgwMDAwMDEwMCxcXHQvKiByZWFkICovXFxuLVxcdFZYRlNfSVdSSVRFID0gMHgwMDAwMDA4MCxcXHQvKiB3cml0ZSAqL1xcbi1cXHRWWEZTX0lFWEVDID0gMHgwMDAwMDA0MCxcXHQvKiBleGVjICovXFxuLVxcbi1cXHRWWEZTX0lGSUZPID0gMHgwMDAwMTAwMCxcXHQvKiBOYW1lZCBwaXBlICovXFxuLVxcdFZYRlNfSUZDSFIgPSAweDAwMDAyMDAwLFxcdC8qIENoYXJhY3RlciBkZXZpY2UgKi9cXG4tXFx0VlhGU19JRkRJUiA9IDB4MDAwMDQwMDAsXFx0LyogRGlyZWN0b3J5ICovXFxuLVxcdFZYRlNfSUZOQU0gPSAweDAwMDA1MDAwLFxcdC8qIFhlbml4IGRldmljZSA/PyAqL1xcbi1cXHRWWEZTX0lGQkxLID0gMHgwMDAwNjAwMCxcXHQvKiBCbG9jayBkZXZpY2UgKi9cXG4tXFx0VlhGU19JRlJFRyA9IDB4MDAwMDgwMDAsXFx0LyogUmVndWxhciBmaWxlICovXFxuLVxcdFZYRlNfSUZDTVAgPSAweDAwMDA5MDAwLFxcdC8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi9cXG4tXFx0VlhGU19JRkxOSyA9IDB4MDAwMGEwMDAsXFx0LyogU3ltbGluayAqL1xcbi1cXHRWWEZTX0lGU09DID0gMHgwMDAwYzAwMCxcXHQvKiBTb2NrZXQgKi9cXG4tXFxuLVxcdC8qIFZ4RlMgaW50ZXJuYWwgKi9cXG4tXFx0VlhGU19JRkZTSCA9IDB4MTAwMDAwMDAsXFx0LyogRmlsZXNldCBoZWFkZXIgKi9cXG4tXFx0VlhGU19JRklMVCA9IDB4MjAwMDAwMDAsXFx0LyogSW5vZGUgbGlzdCAqL1xcbi1cXHRWWEZTX0lGSUFVID0gMHgzMDAwMDAwMCxcXHQvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi9cXG4tXFx0VlhGU19JRkNVVCA9IDB4NDAwMDAwMDAsXFx0LyogQ3VycmVudCB1c2FnZSB0YWJsZSAqL1xcbi1cXHRWWEZTX0lGQVRUID0gMHg1MDAwMDAwMCxcXHQvKiBBdHRyLiBpbm9kZSAqL1xcbi1cXHRWWEZTX0lGTENUID0gMHg2MDAwMDAwMCxcXHQvKiBMaW5rIGNvdW50IHRhYmxlICovXFxuLVxcdFZYRlNfSUZJQVQgPSAweDcwMDAwMDAwLFxcdC8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovXFxuLVxcdFZYRlNfSUZFTVIgPSAweDgwMDAwMDAwLFxcdC8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqL1xcbi1cXHRWWEZTX0lGUVVPID0gMHg5MDAwMDAwMCxcXHQvKiBCU0QgcXVvdGEgZmlsZSAqL1xcbi1cXHRWWEZTX0lGUFRJID0gMHhhMDAwMDAwMCxcXHQvKiBcXFwiUGFzcyB0aHJvdWdoXFxcIiBpbm9kZSAqL1xcbi1cXHRWWEZTX0lGTEFCID0gMHgxMTAwMDAwMCxcXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xcbi1cXHRWWEZTX0lGT0xUID0gMHgxMjAwMDAwMCxcXHQvKiBPTFQgZmlsZSAqL1xcbi1cXHRWWEZTX0lGTE9HID0gMHgxMzAwMDAwMCxcXHQvKiBMb2cgZmlsZSAqL1xcbi1cXHRWWEZTX0lGRU1QID0gMHgxNDAwMDAwMCxcXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cXG4tXFx0VlhGU19JRkVBVSA9IDB4MTUwMDAwMDAsXFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cXG4tXFx0VlhGU19JRkFVUyA9IDB4MTYwMDAwMDAsXFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xcbi1cXHRWWEZTX0lGREVWID0gMHgxNzAwMDAwMCxcXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cXG4tXFxuLX07XFxuLVxcbi0jZGVmaW5lXFx0VlhGU19UWVBFX01BU0tcXHRcXHQweGZmZmZmMDAwXFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVxcdCgoKGlwKS1cXHUwMDNldmlpX21vZGUgXFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxcbi0jZGVmaW5lIFZYRlNfSVNGSUZPKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxcbi0jZGVmaW5lIFZYRlNfSVNDSFIoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXFxuLSNkZWZpbmUgVlhGU19JU0RJUih4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcXG4tI2RlZmluZSBWWEZTX0lTTkFNKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxcbi0jZGVmaW5lIFZYRlNfSVNCTEsoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXFxuLSNkZWZpbmUgVlhGU19JU0xOSyh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcXG4tI2RlZmluZSBWWEZTX0lTUkVHKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxcbi0jZGVmaW5lIFZYRlNfSVNDTVAoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXFxuLSNkZWZpbmUgVlhGU19JU1NPQyh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcXG4tXFxuLSNkZWZpbmUgVlhGU19JU0ZTSCh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkZTSClcXG4tI2RlZmluZSBWWEZTX0lTSUxUKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUxUKVxcbi1cXG4tLypcXG4tICogSW5tb2RlIG9yZ2FuaXNhdGlvbiB0eXBlcy5cXG4tICovXFxuLWVudW0ge1xcbi1cXHRWWEZTX09SR19OT05FXFx0PSAwLFxcdC8qIElub2RlIGhhcyAqbm8qIGZvcm1hdCA/IT8gKi9cXG4tXFx0VlhGU19PUkdfRVhUNFxcdD0gMSxcXHQvKiBFeHQ0ICovXFxuLVxcdFZYRlNfT1JHX0lNTUVEXFx0PSAyLFxcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xcbi1cXHRWWEZTX09SR19UWVBFRFxcdD0gMyxcXHQvKiBUeXBlZCBleHRlbnRzICovXFxuLX07XFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNfT1JHKGlwLG9yZylcXHQoKGlwKS1cXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXFxuLSNkZWZpbmUgVlhGU19JU05PTkUoaXApXFx0XFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcXG4tI2RlZmluZSBWWEZTX0lTRVhUNChpcClcXHRcXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxcbi0jZGVmaW5lIFZYRlNfSVNJTU1FRChpcClcXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19JTU1FRClcXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfVFlQRUQpXFxuLVxcbi0vKlxcbi0gKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgc3VwZXJibG9jay5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxcXFxuLVxcdCgoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqKShzYnApLVxcdTAwM2VzX2ZzX2luZm8pXFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfU1VQRVJfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMgYi9mcy9mcmVldnhmcy92eGZzX2JtYXAuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDFiODIxNmViMWQ5MGEuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2JtYXAuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwyNzIgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc3lzdGVtIHRvIGRpc2sgYmxvY2sgbWFwcGluZy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfaW5vZGUuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLVxcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tc3RhdGljIHZvaWRcXG4tdnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApXFxuLXtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInR5cGU9JUx1IFxcXCIsIHR5cC1cXHUwMDNldnRfaGRyIFxcdTAwM2VcXHUwMDNlIFZYRlNfVFlQRURfVFlQRVNISUZUKTtcXG4tXFx0cHJpbnRrKFxcXCJvZmZzZXQ9JUx4IFxcXCIsIHR5cC1cXHUwMDNldnRfaGRyIFxcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcXG4tXFx0cHJpbnRrKFxcXCJibG9jaz0leCBcXFwiLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKTtcXG4tXFx0cHJpbnRrKFxcXCJzaXplPSV4XFxcXG5cXFwiLCB0eXAtXFx1MDAzZXZ0X3NpemUpO1xcbi19XFxuLSNlbmRpZlxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXFxuLSAqIEBpcDpcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAYm46XFx0XFx0bG9naWNhbCBibG9jay5cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxcbi0gKiAgIGV4dDQtc3R5bGUgZXh0ZW50cyAod2hpY2ggYXJlIG11Y2ggbGlrZSB0aGUgdHJhZGl0aW9uYWwgVU5JWFxcbi0gKiAgIGlub2RlIG9yZ2FuaXNhdGlvbikuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgZGFkZHJfdFxcbi12eGZzX2JtYXBfZXh0NChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGJuKVxcbi17XFxuLVxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpcC1cXHUwMDNlaV9zYjtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oaXApO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmkgPSBWWEZTX1NCSShzYik7XFxuLVxcdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cXHUwMDNlc19ibG9ja3NpemU7XFxuLVxcdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXFx1MDAzZXZpaV9leHQ0LnZlNF9pbmRzaXplKTtcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHRpZiAoaW5kc2l6ZSBcXHUwMDNlIHNiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSlcXG4tXFx0XFx0Z290byBmYWlsX3NpemU7XFxuLVxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVlhGU19OREFERFI7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3QgZGlyZWN0ICpkID0gdmlwLVxcdTAwM2V2aWlfZXh0NC52ZTRfZGlyZWN0ICsgaTtcXG4tXFx0XFx0aWYgKGJuIFxcdTAwM2U9IDAgXFx1MDAyNlxcdTAwMjYgYm4gXFx1MDAzYyBmczMyX3RvX2NwdShzYmksIGQtXFx1MDAzZXNpemUpKVxcbi1cXHRcXHRcXHRyZXR1cm4gKGJuICsgZnMzMl90b19jcHUoc2JpLCBkLVxcdTAwM2VleHRlbnQpKTtcXG4tXFx0XFx0Ym4gLT0gZnMzMl90b19jcHUoc2JpLCBkLVxcdTAwM2VzaXplKTtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKChibiAvIChpbmRzaXplICogaW5kc2l6ZSAqIGJzaXplIC8gNCkpID09IDApIHtcXG4tXFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpidWY7XFxuLVxcdFxcdGRhZGRyX3RcXHRibm87XFxuLVxcdFxcdF9fZnMzMiAqaW5kaXI7XFxuLVxcbi1cXHRcXHRidWYgPSBzYl9icmVhZChzYixcXG4tXFx0XFx0XFx0ZnMzMl90b19jcHUoc2JpLCB2aXAtXFx1MDAzZXZpaV9leHQ0LnZlNF9pbmRpclswXSkpO1xcbi1cXHRcXHRpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKVxcbi1cXHRcXHRcXHRnb3RvIGZhaWxfYnVmO1xcbi1cXG4tXFx0XFx0aW5kaXIgPSAoX19mczMyICopYnVmLVxcdTAwM2ViX2RhdGE7XFxuLVxcdFxcdGJubyA9IGZzMzJfdG9fY3B1KHNiaSwgaW5kaXJbKGJuIC8gaW5kc2l6ZSkgJSAoaW5kc2l6ZSAqIGJuKV0pICtcXG4tXFx0XFx0XFx0KGJuICUgaW5kc2l6ZSk7XFxuLVxcbi1cXHRcXHRicmVsc2UoYnVmKTtcXG4tXFx0XFx0cmV0dXJuIGJubztcXG4tXFx0fSBlbHNlXFxuLVxcdFxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcIm5vIG1hdGNoaW5nIGluZGlyP1xcXCIpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLVxcbi1mYWlsX3NpemU6XFxuLVxcdHByaW50ayhcXFwidnhmczogaW5kaXJlY3QgZXh0ZW50IHRvbyBiaWchXFxcXG5cXFwiKTtcXG4tZmFpbF9idWY6XFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19ibWFwX2luZGlyIC0gcmVjdXJzaW9uIGZvciB2eGZzX2JtYXBfdHlwZWRcXG4tICogQGlwOlxcdFxcdHBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yXFxuLSAqIEBpbmRpcjpcXHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XFxuLSAqIEBzaXplOlxcdHNpemUgb2YgdGhlIHR5cGVkIGFyZWEgdG8gc2VhcmNoXFxuLSAqIEBibG9jazpcXHRwYXJ0aWFsbHkgcmVzdWx0IGZyb20gZnVydGhlciBzZWFyY2hlc1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2JtYXBfaW5kaXIgcmVhZHMgYSBcXHUwMDI2c3RydWN0IHZ4ZnNfdHlwZWQgYXQgQGluZGlyXFxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKlxcbi0gKiBOb3RlOlxcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XFxuLSAqL1xcbi1zdGF0aWMgZGFkZHJfdFxcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCpzYmkgPSBWWEZTX1NCSShpcC1cXHUwMDNlaV9zYik7XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdFxcdCpicCA9IE5VTEw7XFxuLVxcdGRhZGRyX3RcXHRcXHRcXHRcXHRwYmxvY2sgPSAwO1xcbi1cXHRpbnRcXHRcXHRcXHRcXHRpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemUgKiBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC1cXHUwMDNlaV9zYik7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdCp0eXA7XFxuLVxcdFxcdGludDY0X3RcXHRcXHRcXHRvZmY7XFxuLVxcbi1cXHRcXHRicCA9IHNiX2JyZWFkKGlwLVxcdTAwM2VpX3NiLFxcbi1cXHRcXHRcXHRcXHRpbmRpciArIChpIC8gVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXFx1MDAzZWlfc2IpKSk7XFxuLVxcdFxcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdFxcdHR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC1cXHUwMDNlYl9kYXRhKSArXFxuLVxcdFxcdFxcdChpICUgVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXFx1MDAzZWlfc2IpKTtcXG4tXFx0XFx0b2ZmID0gZnM2NF90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2hkcikgXFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0s7XFxuLVxcbi1cXHRcXHRpZiAoYmxvY2sgXFx1MDAzYyBvZmYpIHtcXG4tXFx0XFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHN3aXRjaCAoKHVfaW50MzJfdCkoZnM2NF90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2hkcikgXFx1MDAzZVxcdTAwM2VcXG4tXFx0XFx0XFx0XFx0VlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcXG4tXFx0XFx0XFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfYmxvY2spLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSksXFxuLVxcdFxcdFxcdFxcdFxcdGJsb2NrIC0gb2ZmKTtcXG4tXFx0XFx0XFx0aWYgKHBibG9jayA9PSAtMilcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjYXNlIFZYRlNfVFlQRURfREFUQTpcXG4tXFx0XFx0XFx0aWYgKChibG9jayAtIG9mZikgXFx1MDAzZT0gZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X3NpemUpKVxcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0cGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKSArIGJsb2NrIC0gb2ZmO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcXG4tXFx0XFx0XFx0c3RydWN0IHZ4ZnNfdHlwZWRfZGV2NFxcdCp0eXA0ID1cXG4tXFx0XFx0XFx0XFx0KHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7XFxuLVxcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9JTkZPIFxcXCJcXFxcblxcXFxuVFlQRURfREVWNCBkZXRlY3RlZCFcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9JTkZPIFxcXCJibG9jazogJWxsdVxcXFx0c2l6ZTogJWxsZFxcXFx0ZGV2OiAlZFxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cXHUwMDNldmQ0X2Jsb2NrKSxcXG4tXFx0XFx0XFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cXHUwMDNldmQ0X3NpemUpLFxcbi1cXHRcXHRcXHQgICAgICAgZnMzMl90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfZGV2KSk7XFxuLVxcdFxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRkZWZhdWx0Olxcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9FUlIgXFxcIiVzOiVkIHZ0X2hkciAlbGx1XFxcXG5cXFwiLCBfX2Z1bmNfXyxcXG4tXFx0XFx0XFx0XFx0X19MSU5FX18sIGZzNjRfdG9fY3B1KHNiaSwgdHlwLVxcdTAwM2V2dF9oZHIpKTtcXG4tXFx0XFx0XFx0QlVHKCk7XFxuLVxcdFxcdH1cXG4tXFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0fVxcbi1cXG4tZmFpbDpcXG4tXFx0cGJsb2NrID0gMDtcXG4tb3V0Olxcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRyZXR1cm4gKHBibG9jayk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2JtYXBfdHlwZWQgLSBibWFwIGZvciB0eXBlZCBleHRlbnRzXFxuLSAqIEBpcDpcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAaWJsb2NrOlxcdGxvZ2ljYWwgYmxvY2tcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgUGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciB0eXBlZCBleHRlbnRzLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKi9cXG4tc3RhdGljIGRhZGRyX3RcXG4tdnhmc19ibWFwX3R5cGVkKHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgaWJsb2NrKVxcbi17XFxuLVxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cXHRcXHQqdmlwID0gVlhGU19JTk8oaXApO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0XFx0KnNiaSA9IFZYRlNfU0JJKGlwLVxcdTAwM2VpX3NiKTtcXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdFxcdHBibG9jayA9IDA7XFxuLVxcdGludFxcdFxcdFxcdFxcdGk7XFxuLVxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVlhGU19OVFlQRUQ7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdCp0eXAgPSB2aXAtXFx1MDAzZXZpaV9vcmcudHlwZWQgKyBpO1xcbi1cXHRcXHR1NjRcXHRcXHRcXHRoZHIgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfaGRyKTtcXG4tXFx0XFx0aW50NjRfdFxcdFxcdFxcdG9mZiA9IChoZHIgXFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0spO1xcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0XFx0dnhmc190eXBkdW1wKHR5cCk7XFxuLSNlbmRpZlxcbi1cXHRcXHRpZiAoaWJsb2NrIFxcdTAwM2Mgb2ZmKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0c3dpdGNoICgodTMyKShoZHIgXFx1MDAzZVxcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcXG4tXFx0XFx0XFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfYmxvY2spLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSksXFxuLVxcdFxcdFxcdFxcdFxcdGlibG9jayAtIG9mZik7XFxuLVxcdFxcdFxcdGlmIChwYmxvY2sgPT0gLTIpXFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHRyZXR1cm4gKHBibG9jayk7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9EQVRBOlxcbi1cXHRcXHRcXHRpZiAoKGlibG9jayAtIG9mZikgXFx1MDAzYyBmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSkpXFxuLVxcdFxcdFxcdFxcdHJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKSArXFxuLVxcdFxcdFxcdFxcdFxcdFxcdGlibG9jayAtIG9mZik7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDpcXG4tXFx0XFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDoge1xcbi1cXHRcXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XFx0KnR5cDQgPVxcbi1cXHRcXHRcXHRcXHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcXG4tXFxuLVxcdFxcdFxcdHByaW50ayhLRVJOX0lORk8gXFxcIlxcXFxuXFxcXG5UWVBFRF9ERVY0IGRldGVjdGVkIVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHByaW50ayhLRVJOX0lORk8gXFxcImJsb2NrOiAlbGx1XFxcXHRzaXplOiAlbGxkXFxcXHRkZXY6ICVkXFxcXG5cXFwiLFxcbi1cXHRcXHRcXHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfYmxvY2spLFxcbi1cXHRcXHRcXHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfc2l6ZSksXFxuLVxcdFxcdFxcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXFx1MDAzZXZkNF9kZXYpKTtcXG4tXFx0XFx0XFx0cmV0dXJuIDA7XFxuLVxcdFxcdH1cXG4tXFx0XFx0ZGVmYXVsdDpcXG4tXFx0XFx0XFx0V0FSTl9PTl9PTkNFKDEpO1xcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYm1hcDEgLSB2eGZzLWludGVybmFsIGJtYXAgb3BlcmF0aW9uXFxuLSAqIEBpcDpcXHRcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAaWJsb2NrOlxcdFxcdGxvZ2ljYWwgYmxvY2tcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXFxuLSAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1kYWRkcl90XFxuLXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1xcdFxcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XFxuLVxcbi1cXHRpZiAoVlhGU19JU0VYVDQodmlwKSlcXG4tXFx0XFx0cmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spO1xcbi1cXHRpZiAoVlhGU19JU1RZUEVEKHZpcCkpXFxuLVxcdFxcdHJldHVybiB2eGZzX2JtYXBfdHlwZWQoaXAsIGlibG9jayk7XFxuLVxcdGlmIChWWEZTX0lTTk9ORSh2aXApKVxcbi1cXHRcXHRnb3RvIHVuc3VwcDtcXG4tXFx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxcbi1cXHRcXHRnb3RvIHVuc3VwcDtcXG4tXFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IGlub2RlICVsbHUgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfaW5vLCB2aXAtXFx1MDAzZXZpaV9vcmd0eXBlKTtcXG4tXFx0QlVHKCk7XFxuLVxcbi11bnN1cHA6XFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IGlub2RlICVsbHUgaGFzIGFuIHVuc3VwcG9ydGVkIG9yZ3R5cGUgKCV4KVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfaW5vLCB2aXAtXFx1MDAzZXZpaV9vcmd0eXBlKTtcXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaFxcbisrKyAvZGV2L251bGxcXG5AQCAtMSw2OCArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqL1xcbi0jaWZuZGVmIF9WWEZTX0RJUl9IX1xcbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXFxuLSAqXFxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdnhmcyBkaXJlY3RvcnkgZm9ybWF0Llxcbi0gKi9cXG4tXFxuLVxcbi0vKlxcbi0gKiBWeEZTIGRpcmVjdG9yeSBibG9jayBoZWFkZXIuXFxuLSAqXFxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cXG4tICogSXQgaXMgdXNlZCBmb3IgZnJlZSBzcGFjZSBtYW5hZ2VtZW50IGFuZCBhZGRpdGlvbmFsbHkgaW5jbHVkZXNcXG4tICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLlxcbi0gKlxcbi0gKiBUaGUgaGFzaCBtYXkgYmUgZW1wdHkgYW5kIGluIGZhY3Qgd2UgZG8gbm90IHVzZSBpdCBhbGwgaW4gdGhlXFxuLSAqIExpbnV4IGRyaXZlciBmb3Igbm93Llxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfZGlyYmxrIHtcXG4tXFx0X19mczE2XFx0XFx0ZF9mcmVlO1xcdFxcdC8qIGZyZWUgc3BhY2UgaW4gZGlyYmxvY2sgKi9cXG4tXFx0X19mczE2XFx0XFx0ZF9uaGFzaDtcXHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xcbi1cXHRfX2ZzMTZcXHRcXHRkX2hhc2hbXTtcXHQvKiBoYXNoIGNoYWluICovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcXG4tICpcXHRvZiBhbiBWeEZTIGRpcmVjdG9yeSBlbnRyeS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19OQU1FTEVOXFx0MjU2XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGRpcmVjdG9yeSBlbnRyeS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2RpcmVjdCB7XFxuLVxcdF9fZnMzMlxcdFxcdGRfaW5vO1xcdFxcdFxcdC8qIGlub2RlIG51bWJlciAqL1xcbi1cXHRfX2ZzMTZcXHRcXHRkX3JlY2xlbjtcXHRcXHQvKiByZWNvcmQgbGVuZ3RoICovXFxuLVxcdF9fZnMxNlxcdFxcdGRfbmFtZWxlbjtcXHRcXHQvKiBkX25hbWUgbGVuZ3RoICovXFxuLVxcdF9fZnMxNlxcdFxcdGRfaGFzaG5leHQ7XFx0XFx0LyogbmV4dCBoYXNoIGVudHJ5ICovXFxuLVxcdGNoYXJcXHRcXHRkX25hbWVbVlhGU19OQU1FTEVOXTtcXHQvKiBuYW1lICovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWWEZTX0RJUlBBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cnkgYm91bmRhcmllcywgaXMgX211c3RfIGJlXFxuLSAqXFx0YSBtdWx0aXBsZSBvZiBmb3VyLlxcbi0gKiBWWEZTX05BTUVNSU4gaXMgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeSB3aXRoIGEgTlVMTCBkX25hbWUuXFxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcXG4tICpcXHR1c2FibGUgZm9yIGRpcmVjdG9yeSBzaXplcy5cXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcXG4tICpcXHRhIGRfbmFtZSB3aXRoIHNpemUgbGVuLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX0RJUlBBRFxcdFxcdDRcXG4tI2RlZmluZSBWWEZTX05BTUVNSU5cXHRcXHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcXG4tI2RlZmluZSBWWEZTX0RJUlJPVU5EKGxlbilcXHQoKFZYRlNfRElSUEFEICsgKGxlbikgLSAxKSBcXHUwMDI2IH4oVlhGU19ESVJQQUQgLTEpKVxcbi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbilcXHQoVlhGU19ESVJST1VORChWWEZTX05BTUVNSU4gKyAobGVuKSkpXFxuLVxcbi0vKlxcbi0gKiBWWEZTX0RJUkJMS09WIGlzIHRoZSBvdmVyaGVhZCBvZiBhIHNwZWNpZmljIGRpcmJsb2NrLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKVxcdFxcXFxcXG4tXFx0KChzaXplb2Yoc2hvcnQpICogZnMxNl90b19jcHUoc2JpLCBkYnAtXFx1MDAzZWRfbmhhc2gpKSArIDQpXFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmggYi9mcy9mcmVldnhmcy92eGZzX2V4dGVybi5oXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsNDkgKzAsMCBAQFxcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19FWFRFUk5fSF9cXG4tI2RlZmluZSBfVlhGU19FWFRFUk5fSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBleHRlcm5hbCBwcm90b3R5cGVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvdG90eXBlcyBmb3IgYWxsIHZ4ZnMgZnVuY3Rpb25zIHVzZWRcXG4tICogb3V0c2lkZSB0aGVpciByZXNwZWN0aXZlIHNvdXJjZSBmaWxlcy5cXG4tICovXFxuLVxcbi1cXG4tc3RydWN0IGttZW1fY2FjaGU7XFxuLXN0cnVjdCBzdXBlcl9ibG9jaztcXG4tc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbztcXG4tc3RydWN0IGlub2RlO1xcbi1cXG4tXFxuLS8qIHZ4ZnNfYm1hcC5jICovXFxuLWV4dGVybiBkYWRkcl90XFx0XFx0XFx0dnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKiwgbG9uZyk7XFxuLVxcbi0vKiB2eGZzX2ZzaGVhZC5jICovXFxuLWV4dGVybiBpbnRcXHRcXHRcXHR2eGZzX3JlYWRfZnNoZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTtcXG4tXFxuLS8qIHZ4ZnNfaW5vZGUuYyAqL1xcbi1leHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHM7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTtcXG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVxcdFxcdCp2eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZywgaW5vX3QpO1xcbi1leHRlcm4gc3RydWN0IGlub2RlXFx0XFx0KnZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XFxuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcXHRcXHQqdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7XFxuLVxcbi0vKiB2eGZzX2xvb2t1cC5jICovXFxuLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9uc1xcdHZ4ZnNfZGlyX2lub2RlX29wcztcXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnNcXHR2eGZzX2Rpcl9vcGVyYXRpb25zO1xcbi1cXG4tLyogdnhmc19vbHQuYyAqL1xcbi1leHRlcm4gaW50XFx0XFx0XFx0dnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTtcXG4tXFxuLS8qIHZ4ZnNfc3Vici5jICovXFxuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wcztcXG4tZXh0ZXJuIHN0cnVjdCBwYWdlICpcXHRcXHR2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqKTtcXG4tZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqXFx0dnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTtcXG4tXFxuLSNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBlNmFiOGJkZjdhNmNhLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxNjYgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXFxuLSAqL1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzZXQgaGVhZGVyIHJvdXRpbmVzLlxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmcuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19mc2hlYWQuaFxcXCJcXG4tXFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1zdGF0aWMgdm9pZFxcbi12eGZzX2R1bXBmc2goc3RydWN0IHZ4ZnNfZnNoICpmaHApXFxuLXtcXG4tXFx0cHJpbnRrKFxcXCJcXFxcblxcXFxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcXFxcblxcXCIpO1xcbi1cXHRwcmludGsoXFxcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXFxcblxcXCIpO1xcbi1cXHRwcmludGsoXFxcInZlcnNpb246ICV1XFxcXG5cXFwiLCBmaHAtXFx1MDAzZWZzaF92ZXJzaW9uKTtcXG4tXFx0cHJpbnRrKFxcXCJmc2luZGV4OiAldVxcXFxuXFxcIiwgZmhwLVxcdTAwM2Vmc2hfZnNpbmRleCk7XFxuLVxcdHByaW50ayhcXFwiaWF1aW5vOiAldVxcXFx0bmlub2RlczoldVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ZmhwLVxcdTAwM2Vmc2hfaWF1aW5vLCBmaHAtXFx1MDAzZWZzaF9uaW5vZGVzKTtcXG4tXFx0cHJpbnRrKFxcXCJtYXhpbm9kZTogJXVcXFxcdGxjdGlubzogJXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdGZocC1cXHUwMDNlZnNoX21heGlub2RlLCBmaHAtXFx1MDAzZWZzaF9sY3Rpbm8pO1xcbi1cXHRwcmludGsoXFxcIm5hdTogJXVcXFxcblxcXCIsIGZocC1cXHUwMDNlZnNoX25hdSk7XFxuLVxcdHByaW50ayhcXFwiaWxpc3Rpbm9bMF06ICV1XFxcXHRpbGlzdGlub1sxXTogJXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdGZocC1cXHUwMDNlZnNoX2lsaXN0aW5vWzBdLCBmaHAtXFx1MDAzZWZzaF9pbGlzdGlub1sxXSk7XFxuLX1cXG4tI2VuZGlmXFxuLVxcbi0vKipcXG4tICogdnhmc19nZXRmc2ggLSByZWFkIGZpbGVzZXQgaGVhZGVyIGludG8gbWVtb3J5XFxuLSAqIEBpcDpcXHRcXHR0aGUgKGZha2UpIGZpbGVzZXQgaGVhZGVyIGlub2RlXFxuLSAqIEB3aGljaDpcXHQwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlclxcbi0gKiAgIGRlc2NyaWJlZCBieSBAaXAgaW50byBtZW1vcnkuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIGZpbGVzZXQgaGVhZGVyIHN0cnVjdHVyZSBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICpcXG4tdnhmc19nZXRmc2goc3RydWN0IGlub2RlICppcCwgaW50IHdoaWNoKVxcbi17XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdFxcdCpicDtcXG4tXFxuLVxcdGJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpO1xcbi1cXHRpZiAoYnApIHtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfZnNoXFx0XFx0KmZocDtcXG4tXFxuLVxcdFxcdGlmICghKGZocCA9IGttYWxsb2Nfb2JqKCpmaHApKSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdG1lbWNweShmaHAsIGJwLVxcdTAwM2ViX2RhdGEsIHNpemVvZigqZmhwKSk7XFxuLVxcbi1cXHRcXHRwdXRfYmgoYnApO1xcbi1cXHRcXHRyZXR1cm4gKGZocCk7XFxuLVxcdH1cXG4tb3V0Olxcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRyZXR1cm4gTlVMTDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcmVhZF9mc2hlYWQgLSByZWFkIHRoZSBmaWxlc2V0IGhlYWRlcnNcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIHRvIHdoaWNoIHRoZSBmaWxlc2V0IGJlbG9uZ3NcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19yZWFkX2ZzaGVhZCB3aWxsIGZpbGwgdGhlIGlub2RlIGFuZCBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW4gQHNiLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKC1FSU5WQUwpLlxcbi0gKi9cXG4taW50XFxuLXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCppbmZwID0gVlhGU19TQkkoc2JwKTtcXG4tXFx0c3RydWN0IHZ4ZnNfZnNoXFx0XFx0XFx0KnBmcCwgKnNmcDtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1xcdFxcdCp2aXA7XFxuLVxcbi1cXHRpbmZwLVxcdTAwM2V2c2lfZnNoaXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLVxcdTAwM2V2c2lfaWV4dCwgaW5mcC1cXHUwMDNldnNpX2ZzaGlubyk7XFxuLVxcdGlmICghaW5mcC1cXHUwMDNldnNpX2ZzaGlwKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIHJlYWQgZnNoIGlub2RlXFxcXG5cXFwiKTtcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdH1cXG4tXFxuLVxcdHZpcCA9IFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9mc2hpcCk7XFxuLVxcdGlmICghVlhGU19JU0ZTSCh2aXApKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRcXHR2aXAtXFx1MDAzZXZpaV9tb2RlIFxcdTAwMjYgVlhGU19UWVBFX01BU0spOyBcXG4tXFx0XFx0Z290byBvdXRfaXB1dF9mc2hpcDtcXG4tXFx0fVxcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0cHJpbnRrKFxcXCJ2eGZzOiBmc2ggaW5vZGUgZHVtcDpcXFxcblxcXCIpO1xcbi1cXHR2eGZzX2R1bXBpKHZpcCwgaW5mcC1cXHUwMDNldnNpX2ZzaGlubyk7XFxuLSNlbmRpZlxcbi1cXG4tXFx0c2ZwID0gdnhmc19nZXRmc2goaW5mcC1cXHUwMDNldnNpX2ZzaGlwLCAwKTtcXG4tXFx0aWYgKCFzZnApIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJ2eGZzOiB1bmFibGUgdG8gZ2V0IHN0cnVjdHVyYWwgZnNoXFxcXG5cXFwiKTtcXG4tXFx0XFx0Z290byBvdXRfaXB1dF9mc2hpcDtcXG4tXFx0fSBcXG4tXFxuLSNpZmRlZiBESUFHTk9TVElDXFxuLVxcdHZ4ZnNfZHVtcGZzaChzZnApO1xcbi0jZW5kaWZcXG4tXFxuLVxcdHBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtXFx1MDAzZXZzaV9mc2hpcCwgMSk7XFxuLVxcdGlmICghcGZwKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gb3V0X2ZyZWVfc2ZwO1xcbi1cXHR9XFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHR2eGZzX2R1bXBmc2gocGZwKTtcXG4tI2VuZGlmXFxuLVxcbi1cXHRpbmZwLVxcdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXFx1MDAzZXZzaV9pZXh0LFxcbi1cXHRcXHRcXHRmczMyX3RvX2NwdShpbmZwLCBzZnAtXFx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xcbi1cXHRpZiAoIWluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGxpc3QgaW5vZGVcXFxcblxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9mcmVlX3BmcDtcXG4tXFx0fVxcbi1cXHRpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpKSkge1xcbi1cXHRcXHRwcmludGsoS0VSTl9FUlIgXFxcInZ4ZnM6IHN0cnVjdHVyYWwgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KS1cXHUwMDNldmlpX21vZGUgXFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7IFxcbi1cXHRcXHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XFxuLVxcdH1cXG4tXFxuLVxcdGluZnAtXFx1MDAzZXZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLVxcdTAwM2Vmc2hfaWxpc3Rpbm9bMF0pKTtcXG4tXFx0aWYgKCFpbmZwLVxcdTAwM2V2c2lfaWxpc3QpIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJ2eGZzOiB1bmFibGUgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcXFxcblxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XFxuLVxcdH1cXG4tXFx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9pbGlzdCkpKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9pbGlzdCktXFx1MDAzZXZpaV9tb2RlIFxcdTAwMjYgVlhGU19UWVBFX01BU0spO1xcbi1cXHRcXHRnb3RvIG91dF9pcHV0X2lsaXN0O1xcbi1cXHR9XFxuLVxcbi1cXHRrZnJlZShwZnApO1xcbi1cXHRrZnJlZShzZnApO1xcbi1cXHRyZXR1cm4gMDtcXG4tXFxuLSBvdXRfaXB1dF9pbGlzdDpcXG4tIFxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX2lsaXN0KTtcXG4tIG91dF9pcHV0X3N0aWxpc3Q6XFxuLSBcXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KTtcXG4tIG91dF9mcmVlX3BmcDpcXG4tXFx0a2ZyZWUocGZwKTtcXG4tIG91dF9mcmVlX3NmcDpcXG4tIFxcdGtmcmVlKHNmcCk7XFxuLSBvdXRfaXB1dF9mc2hpcDpcXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRyZXR1cm4gLUVJTlZBTDtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGRmZDIxNDc1OTljNDkuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDQzICswLDAgQEBcXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19GU0hFQURfSF9cXG4tI2RlZmluZSBfVlhGU19GU0hFQURfSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBoeXNpY2FsIHN0cnVjdHVyZSBvZiB0aGUgVnhGU1xcbi0gKiBmaWxlc2V0IGhlYWRlci5cXG4tICovXFxuLVxcbi1cXG4tLypcXG4tICogRmlsZXNldCBoZWFkZXIgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19mc2gge1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfdmVyc2lvbjtcXHRcXHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9mc2luZGV4O1xcdFxcdC8qIGZpbGVzZXQgaW5kZXggKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX3RpbWU7XFx0XFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX3V0aW1lO1xcdFxcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfZXh0b3A7XFx0XFx0LyogZXh0b3AgZmxhZ3MgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX25pbm9kZXM7XFx0XFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbmF1O1xcdFxcdC8qIG51bWJlciBvZiBJQVVzICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9vbGRfaWxlc2l6ZTtcXHQvKiBvbGQgc2l6ZSBvZiBpbGlzdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfZGZsYWdzO1xcdFxcdC8qIGZsYWdzICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9xdW90YTtcXHRcXHQvKiBxdW90YSBsaW1pdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbWF4aW5vZGU7XFx0XFx0LyogbWF4aW11bSBpbm9kZSBudW1iZXIgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX2lhdWlubztcXHRcXHQvKiBJQVUgaW5vZGUgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX2lsaXN0aW5vWzJdO1xcdC8qIGlsaXN0IGlub2RlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbGN0aW5vO1xcdFxcdC8qIGxpbmsgY291bnQgdGFibGUgaW5vZGUgKi9cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcXG4tXFx0ICogIGEpIGFyZSBub3Qgb2YgYW55IGludGVyZXN0IGZvciB1cywgYW5kXFxuLVxcdCAqICBiKSBkaWZmZXIgYSBsb3QgaW4gZGlmZmVyZW50IHZ4ZnMgdmVyc2lvbnMvcG9ydHNcXG4tXFx0ICovXFxuLX07XFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsNTMgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBwb3J0IGZvciAnaW1tZWQnIGlub2Rlcy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvcGFnZW1hcC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLVxcbi0vKipcXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXFxuLSAqIEBmcDpcXHRcXHRmaWxlIGNvbnRleHQgKHVudXNlZClcXG4tICogQGZvbGlvOlxcdGZvbGlvIHRvIGZpbGwgaW4uXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlXFxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICpcXG4tICogTG9ja2luZyBzdGF0dXM6XFxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19pbW1lZF9yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAgPSBWWEZTX0lOTyhmb2xpby1cXHUwMDNlbWFwcGluZy1cXHUwMDNlaG9zdCk7XFxuLVxcdHZvaWQgKnNyYyA9IHZpcC1cXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkICsgZm9saW9fcG9zKGZvbGlvKTtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsgaSsrKSB7XFxuLVxcdFxcdG1lbWNweV90b19wYWdlKGZvbGlvX3BhZ2UoZm9saW8sIGkpLCAwLCBzcmMsIFBBR0VfU0laRSk7XFxuLVxcdFxcdHNyYyArPSBQQUdFX1NJWkU7XFxuLVxcdH1cXG4tXFxuLVxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbi1cXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLS8qXFxuLSAqIEFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW1tZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxcbi0gKi9cXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7XFxuLVxcdC5yZWFkX2ZvbGlvID1cXHR2eGZzX2ltbWVkX3JlYWRfZm9saW8sXFxuLX07XFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDIxZmM5NGI5ODIwOWYuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsMzE0ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBpbm9kZSByb3V0aW5lcy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbmFtZWkuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi1cXG4tXFxuLSNpZmRlZiBESUFHTk9TVElDXFxuLS8qXFxuLSAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuXFxuLSAqL1xcbi12b2lkXFxuLXZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXFxuLXtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcIlxcXFxuXFxcXG5cXFwiKTtcXG4tXFx0aWYgKGlubylcXG4tXFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcImR1bXBpbmcgdnhmcyBpbm9kZSAlbGRcXFxcblxcXCIsIGlubyk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcImR1bXBpbmcgdW5rbm93biB2eGZzIGlub2RlXFxcXG5cXFwiKTtcXG4tXFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXFxcblxcXCIpO1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwibW9kZSBpcyAleFxcXFxuXFxcIiwgdmlwLVxcdTAwM2V2aWlfbW9kZSk7XFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdHZpcC1cXHUwMDNldmlpX25saW5rLCB2aXAtXFx1MDAzZXZpaV91aWQsIHZpcC1cXHUwMDNldmlpX2dpZCk7XFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJzaXplOiVMeCwgYmxvY2tzOiV1XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHR2aXAtXFx1MDAzZXZpaV9zaXplLCB2aXAtXFx1MDAzZXZpaV9ibG9ja3MpO1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwib3JndHlwZToldVxcXFxuXFxcIiwgdmlwLVxcdTAwM2V2aWlfb3JndHlwZSk7XFxuLX1cXG4tI2VuZGlmXFxuLVxcbi0vKipcXG4tICogdnhmc190cmFuc21vZCAtIG1vZGUgZm9yIGEgVnhGUyBpbm9kZVxcbi0gKiBAdmlwOlxcdFZ4RlMgaW5vZGVcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cXG4tICogIFZ4RlMgaW5vZGUgc3RydWN0dXJlLlxcbi0gKi9cXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxcbi12eGZzX3RyYW5zbW9kKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcClcXG4te1xcbi1cXHR1bW9kZV90XFx0XFx0XFx0cmV0ID0gdmlwLVxcdTAwM2V2aWlfbW9kZSBcXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcXG4tXFxuLVxcdGlmIChWWEZTX0lTRklGTyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRklGTztcXG4tXFx0aWYgKFZYRlNfSVNDSFIodmlwKSlcXG4tXFx0XFx0cmV0IHw9IFNfSUZDSFI7XFxuLVxcdGlmIChWWEZTX0lTRElSKHZpcCkpXFxuLVxcdFxcdHJldCB8PSBTX0lGRElSO1xcbi1cXHRpZiAoVlhGU19JU0JMSyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRkJMSztcXG4tXFx0aWYgKFZYRlNfSVNMTksodmlwKSlcXG4tXFx0XFx0cmV0IHw9IFNfSUZMTks7XFxuLVxcdGlmIChWWEZTX0lTUkVHKHZpcCkpXFxuLVxcdFxcdHJldCB8PSBTX0lGUkVHO1xcbi1cXHRpZiAoVlhGU19JU1NPQyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRlNPQ0s7XFxuLVxcbi1cXHRyZXR1cm4gKHJldCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXFxuLVxcdFxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXFxuLXtcXG4tXFx0c3RydWN0IGlub2RlICppbm9kZSA9IFxcdTAwMjZ2aXAtXFx1MDAzZXZmc19pbm9kZTtcXG4tXFxuLVxcdHZpcC1cXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX21vZGUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9ubGluayA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfbmxpbmspO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV91aWQgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX3VpZCk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfZ2lkKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfc2l6ZSA9IGZzNjRfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfc2l6ZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2F0aW1lID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9hdGltZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfYXV0aW1lKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfbXRpbWUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX210aW1lKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfbXV0aW1lID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9tdXRpbWUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfY3RpbWUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9jdXRpbWUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2N1dGltZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX29yZ3R5cGUgPSBkaXAtXFx1MDAzZXZkaV9vcmd0eXBlO1xcbi1cXG4tXFx0dmlwLVxcdTAwM2V2aWlfYmxvY2tzID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9ibG9ja3MpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9nZW4gPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2dlbik7XFxuLVxcbi1cXHRpZiAoVlhGU19JU0RJUih2aXApKVxcbi1cXHRcXHR2aXAtXFx1MDAzZXZpaV9kb3Rkb3QgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2RvdGRvdCk7XFxuLVxcdGVsc2UgaWYgKCFWWEZTX0lTUkVHKHZpcCkgXFx1MDAyNlxcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcXG4tXFx0XFx0dmlwLVxcdTAwM2V2aWlfcmRldiA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfcmRldik7XFxuLVxcbi1cXHQvKiBkb24ndCBlbmRpYW4gc3dhcCB0aGUgZmllbGRzIHRoYXQgZGlmZmVyIGJ5IG9yZ3R5cGUgKi9cXG4tXFx0bWVtY3B5KFxcdTAwMjZ2aXAtXFx1MDAzZXZpaV9vcmcsIFxcdTAwMjZkaXAtXFx1MDAzZXZkaV9vcmcsIHNpemVvZih2aXAtXFx1MDAzZXZpaV9vcmcpKTtcXG4tXFxuLVxcdGlub2RlLVxcdTAwM2VpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7XFxuLVxcdGlfdWlkX3dyaXRlKGlub2RlLCAodWlkX3QpdmlwLVxcdTAwM2V2aWlfdWlkKTtcXG4tXFx0aV9naWRfd3JpdGUoaW5vZGUsIChnaWRfdCl2aXAtXFx1MDAzZXZpaV9naWQpO1xcbi1cXG4tXFx0c2V0X25saW5rKGlub2RlLCB2aXAtXFx1MDAzZXZpaV9ubGluayk7XFxuLVxcdGlub2RlLVxcdTAwM2VpX3NpemUgPSB2aXAtXFx1MDAzZXZpaV9zaXplO1xcbi1cXG4tXFx0aW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtXFx1MDAzZXZpaV9hdGltZSwgMCk7XFxuLVxcdGlub2RlX3NldF9jdGltZShpbm9kZSwgdmlwLVxcdTAwM2V2aWlfY3RpbWUsIDApO1xcbi1cXHRpbm9kZV9zZXRfbXRpbWUoaW5vZGUsIHZpcC1cXHUwMDNldmlpX210aW1lLCAwKTtcXG4tXFxuLVxcdGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9IHZpcC1cXHUwMDNldmlpX2Jsb2NrcztcXG4tXFx0aW5vZGUtXFx1MDAzZWlfZ2VuZXJhdGlvbiA9IHZpcC1cXHUwMDNldmlpX2dlbjtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYmxraWdldCAtIGZpbmQgaW5vZGUgYmFzZWQgb24gZXh0ZW50ICNcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpblxcbi0gKiBAZXh0ZW50OlxcdG51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaFxcbi0gKiBAaW5vOlxcdGlub2RlIG51bWJlciB0byBzZWFyY2hcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX2Jsa2lnZXQgc2VhcmNoZXMgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnlcXG4tICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50Llxcbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxcbi0gKlxcbi0gKiBOT1RFOlxcbi0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZVxcbi0gKiAgYnVmZmVyY2FjaGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlIHRoZVxcbi0gKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50Llxcbi0gKi9cXG4tc3RydWN0IGlub2RlICpcXG4tdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgZXh0ZW50LCBpbm9fdCBpbm8pXFxuLXtcXG4tXFx0c3RydWN0IGJ1ZmZlcl9oZWFkXFx0XFx0KmJwO1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHRcXHQqaW5vZGU7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdFxcdGJsb2NrLCBvZmZzZXQ7XFxuLVxcbi1cXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xcbi1cXHRpZiAoIWlub2RlKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0aW5vZGUtXFx1MDAzZWlfaW5vID0gZ2V0X25leHRfaW5vKCk7XFxuLVxcbi1cXHRibG9jayA9IGV4dGVudCArICgoaW5vICogVlhGU19JU0laRSkgLyBzYnAtXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4tXFx0b2Zmc2V0ID0gKChpbm8gJSAoc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkUpO1xcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spO1xcbi1cXG4tXFx0aWYgKGJwIFxcdTAwMjZcXHUwMDI2IGJ1ZmZlcl9tYXBwZWQoYnApKSB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cXHQqdmlwID0gVlhGU19JTk8oaW5vZGUpO1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc19kaW5vZGVcXHQqZGlwO1xcbi1cXG4tXFx0XFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShicC1cXHUwMDNlYl9kYXRhICsgb2Zmc2V0KTtcXG4tXFx0XFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xcbi1cXHRcXHR2aXAtXFx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXFx1MDAzZWFfb3BzID0gXFx1MDAyNnZ4ZnNfYW9wcztcXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0XFx0dnhmc19kdW1waSh2aXAsIGlubyk7XFxuLSNlbmRpZlxcbi1cXHRcXHRicmVsc2UoYnApO1xcbi1cXHRcXHRyZXR1cm4gaW5vZGU7XFxuLVxcdH1cXG4tXFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxcXFxuXFxcIiwgYmxvY2spO1xcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRpcHV0KGlub2RlKTtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiBfX3Z4ZnNfaWdldCAtIGdlbmVyaWMgZmluZCBpbm9kZSBmYWNpbGl0eVxcbi0gKiBAaWxpc3RwOlxcdFxcdGlub2RlIGxpc3RcXG4tICogQHZpcDpcXHRcXHRWeEZTIGlub2RlIHRvIGZpbGwgaW5cXG4tICogQGlubzpcXHRcXHRpbm9kZSBudW1iZXJcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbVxcbi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuXFxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGFuIGVycm9yIGNvZGUuXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLV9fdnhmc19pZ2V0KHN0cnVjdCBpbm9kZSAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubylcXG4te1xcbi1cXHRzdHJ1Y3QgcGFnZVxcdFxcdFxcdCpwcDtcXG4tXFx0dV9sb25nXFx0XFx0XFx0XFx0b2Zmc2V0O1xcbi1cXG4tXFx0b2Zmc2V0ID0gKGlubyAlIChQQUdFX1NJWkUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFO1xcbi1cXHRwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLVxcdTAwM2VpX21hcHBpbmcsIGlubyAqIFZYRlNfSVNJWkUgLyBQQUdFX1NJWkUpO1xcbi1cXG4tXFx0aWYgKCFJU19FUlIocHApKSB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2Rpbm9kZVxcdCpkaXA7XFxuLVxcdFxcdGNhZGRyX3RcXHRcXHRcXHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcXG4tXFxuLVxcdFxcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpO1xcbi1cXHRcXHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXFx1MDAzZWlfc2IpLCB2aXAsIGRpcCk7XFxuLVxcdFxcdHZpcC1cXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHRcXHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcXG4tI2VuZGlmXFxuLVxcdFxcdHZ4ZnNfcHV0X3BhZ2UocHApO1xcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFx0fVxcbi1cXG4tXFx0cHJpbnRrKEtFUk5fV0FSTklORyBcXFwidnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcXFxcblxcXCIsXFxuLVxcdFxcdHBwLCAodW5zaWduZWQgbG9uZylpbm8pO1xcbi1cXHRyZXR1cm4gUFRSX0VSUihwcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3N0aWdldCAtIGZpbmQgaW5vZGUgdXNpbmcgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdFxcbi0gKiBAc2JwOlxcdFZGUyBzdXBlcmJsb2NrXFxuLSAqIEBpbm86XFx0aW5vZGUgI1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogIEZpbmQgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicCB1c2luZ1xcbi0gKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC5cXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXFxuLSAqL1xcbi1zdHJ1Y3QgaW5vZGUgKlxcbi12eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKVxcbi17XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuLVxcdGludCBlcnJvcjtcXG4tXFxuLVxcdGlub2RlID0gbmV3X2lub2RlKHNicCk7XFxuLVxcdGlmICghaW5vZGUpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRpbm9kZS1cXHUwMDNlaV9pbm8gPSBnZXRfbmV4dF9pbm8oKTtcXG4tXFxuLVxcdGVycm9yID0gX192eGZzX2lnZXQoVlhGU19TQkkoc2JwKS1cXHUwMDNldnNpX3N0aWxpc3QsIFZYRlNfSU5PKGlub2RlKSwgaW5vKTtcXG4tXFx0aWYgKGVycm9yKSB7XFxuLVxcdFxcdGlwdXQoaW5vZGUpO1xcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGlub2RlO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlXFxuLSAqIEBzYnA6XFx0dGhlIHN1cGVyYmxvY2sgdG8gZ2V0IHRoZSBpbm9kZSBmb3JcXG4tICogQGlubzpcXHR0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB0byBnZXRcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX3JlYWRfaW5vZGUgY3JlYXRlcyBhbiBpbm9kZSwgcmVhZHMgdGhlIGRpc2sgaW5vZGUgZm9yIEBpbm8gYW5kIGZpbGxzXFxuLSAqICBpbiBhbGwgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBuZXcgaW5vZGUuXFxuLSAqL1xcbi1zdHJ1Y3QgaW5vZGUgKlxcbi12eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXFx0XFx0KnZpcDtcXG4tXFx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uc1xcdCphb3BzO1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKmlwO1xcbi1cXHRpbnQgZXJyb3I7XFxuLVxcbi1cXHRpcCA9IGlnZXRfbG9ja2VkKHNicCwgaW5vKTtcXG4tXFx0aWYgKCFpcClcXG4tXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuLVxcdGlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgXFx1MDAyNiBJX05FVykpXFxuLVxcdFxcdHJldHVybiBpcDtcXG4tXFxuLVxcdHZpcCA9IFZYRlNfSU5PKGlwKTtcXG4tXFx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVxcdTAwM2V2c2lfaWxpc3QsIHZpcCwgaW5vKTtcXG4tXFx0aWYgKGVycm9yKSB7XFxuLVxcdFxcdGlnZXRfZmFpbGVkKGlwKTtcXG4tXFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xcbi1cXHR9XFxuLVxcbi1cXHRpZiAoVlhGU19JU0lNTUVEKHZpcCkpXFxuLVxcdFxcdGFvcHMgPSBcXHUwMDI2dnhmc19pbW1lZF9hb3BzO1xcbi1cXHRlbHNlXFxuLVxcdFxcdGFvcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi1cXG4tXFx0aWYgKFNfSVNSRUcoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aXAtXFx1MDAzZWlfZm9wID0gXFx1MDAyNmdlbmVyaWNfcm9fZm9wcztcXG4tXFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBhb3BzO1xcbi1cXHR9IGVsc2UgaWYgKFNfSVNESVIoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aXAtXFx1MDAzZWlfb3AgPSBcXHUwMDI2dnhmc19kaXJfaW5vZGVfb3BzO1xcbi1cXHRcXHRpcC1cXHUwMDNlaV9mb3AgPSBcXHUwMDI2dnhmc19kaXJfb3BlcmF0aW9ucztcXG4tXFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBhb3BzO1xcbi1cXHR9IGVsc2UgaWYgKFNfSVNMTksoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aWYgKCFWWEZTX0lTSU1NRUQodmlwKSkge1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9vcCA9IFxcdTAwMjZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcXG4tXFx0XFx0XFx0aW5vZGVfbm9oaWdobWVtKGlwKTtcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9vcCA9IFxcdTAwMjZzaW1wbGVfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zO1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9saW5rID0gdmlwLVxcdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQ7XFxuLVxcdFxcdFxcdG5kX3Rlcm1pbmF0ZV9saW5rKGlwLVxcdTAwM2VpX2xpbmssIGlwLVxcdTAwM2VpX3NpemUsXFxuLVxcdFxcdFxcdFxcdFxcdCAgc2l6ZW9mKHZpcC1cXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpO1xcbi1cXHRcXHR9XFxuLVxcdH0gZWxzZVxcbi1cXHRcXHRpbml0X3NwZWNpYWxfaW5vZGUoaXAsIGlwLVxcdTAwM2VpX21vZGUsIG9sZF9kZWNvZGVfZGV2KHZpcC1cXHUwMDNldmlpX3JkZXYpKTtcXG4tXFxuLVxcdHVubG9ja19uZXdfaW5vZGUoaXApO1xcbi1cXHRyZXR1cm4gaXA7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2V2aWN0X2lub2RlIC0gcmVtb3ZlIGlub2RlIGZyb20gbWFpbiBtZW1vcnlcXG4tICogQGlwOlxcdFxcdGlub2RlIHRvIGRpc2NhcmQuXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgdnhmc19ldmljdF9pbm9kZSgpIGlzIGNhbGxlZCBvbiB0aGUgZmluYWwgaXB1dCBhbmQgZnJlZXMgdGhlIHByaXZhdGVcXG4tICogIGlub2RlIGFyZWEuXFxuLSAqL1xcbi12b2lkXFxuLXZ4ZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppcClcXG4te1xcbi1cXHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19maW5hbChcXHUwMDI2aXAtXFx1MDAzZWlfZGF0YSk7XFxuLVxcdGNsZWFyX2lub2RlKGlwKTtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmggYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAxZTllMTM4ZDJiMzM4Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDE2OSArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cXG4tI2RlZmluZSBfVlhGU19JTk9ERV9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHN0cnVjdHVyZS5cXG4tICpcXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXFxuLSAqIGlub2RlcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLlxcbi0gKi9cXG4tXFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNJWkVcXHRcXHQweDEwMFxcdFxcdC8qIElub2RlIHNpemUgKi9cXG4tXFxuLSNkZWZpbmUgVlhGU19OREFERFJcXHRcXHQxMFxcdFxcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cXG4tI2RlZmluZSBWWEZTX05JQUREUlxcdFxcdDJcXHRcXHQvKiBOdW1iZXIgb2YgaW5kaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cXG4tI2RlZmluZSBWWEZTX05JTU1FRFxcdFxcdDk2XFx0XFx0LyogU2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBpbiBpbm9kZSAqL1xcbi0jZGVmaW5lIFZYRlNfTlRZUEVEXFx0XFx0NlxcdFxcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXFxuLVxcbi0jZGVmaW5lIFZYRlNfVFlQRURfT0ZGU0VUTUFTS1xcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXFxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFTUFTS1xcdCgweEZGMDAwMDAwMDAwMDAwMDBVTEwpXFxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcXHQ1Nlxcbi1cXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXFxcXG4tXFx0KChzYnApLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgdnhmc190eXBlZCkpXFxuLVxcbi0vKlxcbi0gKiBQb3NzaWJsZSBleHRlbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgJVZYRlNfT1JHX1RZUEVEIGV4dGVudHMuXFxuLSAqL1xcbi1lbnVtIHtcXG4tXFx0VlhGU19UWVBFRF9JTkRJUkVDVFxcdFxcdD0gMSxcXG4tXFx0VlhGU19UWVBFRF9EQVRBXFx0XFx0XFx0PSAyLFxcbi1cXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcXHQ9IDMsXFxuLVxcdFZYRlNfVFlQRURfREFUQV9ERVY0XFx0XFx0PSA0LFxcbi19O1xcbi1cXG4tLypcXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfaW1tZWQge1xcbi1cXHRfX3U4XFx0XFx0XFx0dmlfaW1tZWRbVlhGU19OSU1NRURdO1xcbi19O1xcbi1cXG4tc3RydWN0IHZ4ZnNfZXh0NCB7XFxuLVxcdF9fZnMzMlxcdFxcdFxcdHZlNF9zcGFyZTtcXHRcXHQvKiA/PyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRcXHR2ZTRfaW5kc2l6ZTtcXHRcXHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRcXHR2ZTRfaW5kaXJbVlhGU19OSUFERFJdO1xcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cXG4tXFx0c3RydWN0IGRpcmVjdCB7XFx0XFx0XFx0XFx0XFx0LyogRGlyZWN0IGV4dGVudHMgKi9cXG4tXFx0XFx0X19mczMyXFx0XFx0ZXh0ZW50O1xcdFxcdFxcdC8qIEV4dGVudCBudW1iZXIgKi9cXG4tXFx0XFx0X19mczMyXFx0XFx0c2l6ZTtcXHRcXHRcXHQvKiBTaXplIG9mIGV4dGVudCAqL1xcbi1cXHR9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdO1xcbi19O1xcbi1cXG4tc3RydWN0IHZ4ZnNfdHlwZWQge1xcbi1cXHRfX2ZzNjRcXHRcXHR2dF9oZHI7XFx0XFx0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cXG4tXFx0X19mczMyXFx0XFx0dnRfYmxvY2s7XFx0LyogRXh0ZW50IGJsb2NrICovXFxuLVxcdF9fZnMzMlxcdFxcdHZ0X3NpemU7XFx0LyogU2l6ZSBpbiBibG9ja3MgKi9cXG4tfTtcXG4tXFxuLXN0cnVjdCB2eGZzX3R5cGVkX2RldjQge1xcbi1cXHRfX2ZzNjRcXHRcXHR2ZDRfaGRyO1xcdC8qIEhlYWRlciwgMHhUVE9PT09PT09PT09PT09POyBUPXR5cGUsTz1vZmZzICovXFxuLVxcdF9fZnM2NFxcdFxcdHZkNF9ibG9jaztcXHQvKiBFeHRlbnQgYmxvY2sgKi9cXG4tXFx0X19mczY0XFx0XFx0dmQ0X3NpemU7XFx0LyogU2l6ZSBpbiBibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dmQ0X2RldjtcXHQvKiBEZXZpY2UgSUQgKi9cXG4tXFx0X191OFxcdFxcdF9fcGFkMTtcXG4tfTtcXG4tXFxuLS8qXFxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2Rpbm9kZSB7XFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tb2RlO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfbmxpbms7XFx0LyogTGluayBjb3VudCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfdWlkO1xcdC8qIFVJRCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfZ2lkO1xcdC8qIEdJRCAqL1xcbi1cXHRfX2ZzNjRcXHRcXHR2ZGlfc2l6ZTtcXHQvKiBJbm9kZSBzaXplIGluIGJ5dGVzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9hdGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0dmRpX2F1dGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tdGltZTtcXHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gc2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tdXRpbWU7XFx0LyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0dmRpX2N0aW1lO1xcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9jdXRpbWU7XFx0LyogQ3JlYXRlIHRpbWUgLSB1c2VjICovXFxuLVxcdF9fdThcXHRcXHR2ZGlfYWZsYWdzO1xcdC8qIEFsbG9jYXRpb24gZmxhZ3MgKi9cXG4tXFx0X191OFxcdFxcdHZkaV9vcmd0eXBlO1xcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXFxuLVxcdF9fZnMxNlxcdFxcdHZkaV9lb3BmbGFncztcXG4tXFx0X19mczMyXFx0XFx0dmRpX2VvcGRhdGE7XFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0X19mczMyXFx0XFx0XFx0cmRldjtcXG4tXFx0XFx0X19mczMyXFx0XFx0XFx0ZG90ZG90O1xcbi1cXHRcXHRzdHJ1Y3Qge1xcbi1cXHRcXHRcXHRfX3UzMlxcdFxcdHJlc2VydmVkO1xcbi1cXHRcXHRcXHRfX2ZzMzJcXHRcXHRmaXhleHRzaXplO1xcbi1cXHRcXHR9IGlfcmVndWxhcjtcXG4tXFx0XFx0c3RydWN0IHtcXG4tXFx0XFx0XFx0X19mczMyXFx0XFx0bWF0Y2hpbm87XFxuLVxcdFxcdFxcdF9fZnMzMlxcdFxcdGZzZXRpbmRleDtcXG4tXFx0XFx0fSBpX3Z4c3BlYztcXG4tXFx0XFx0X191NjRcXHRcXHRcXHRhbGlnbjtcXG4tXFx0fSB2ZGlfZnRhcmVhO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfYmxvY2tzO1xcdC8qIEhvdyBtdWNoIGJsb2NrcyBkb2VzIGlub2RlIG9jY3VweSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfZ2VuO1xcdC8qIElub2RlIGdlbmVyYXRpb24gKi9cXG4tXFx0X19mczY0XFx0XFx0dmRpX3ZlcnNpb247XFx0LyogVmVyc2lvbiAqL1xcbi1cXHR1bmlvbiB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2ltbWVkXFx0aW1tZWQ7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2V4dDRcXHRleHQ0O1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdHR5cGVkW1ZYRlNfTlRZUEVEXTtcXG4tXFx0fSB2ZGlfb3JnO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfaWF0dHJpbm87XFxuLX07XFxuLVxcbi0jZGVmaW5lIHZkaV9yZGV2XFx0dmRpX2Z0YXJlYS5yZGV2XFxuLSNkZWZpbmUgdmRpX2RvdGRvdFxcdHZkaV9mdGFyZWEuZG90ZG90XFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcXHR2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZVxcbi0jZGVmaW5lIHZkaV9tYXRjaGlub1xcdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXFxuLSNkZWZpbmUgdmRpX2ZzZXRpbmRleFxcdHZkaV9mdGFyZWEudnhzcGVjLmZzZXRpbmRleFxcbi1cXG4tI2RlZmluZSB2ZGlfaW1tZWRcXHR2ZGlfb3JnLmltbWVkXFxuLSNkZWZpbmUgdmRpX2V4dDRcXHR2ZGlfb3JnLmV4dDRcXG4tI2RlZmluZSB2ZGlfdHlwZWRcXHR2ZGlfb3JnLnR5cGVkXFxuLVxcbi1cXG4tLypcXG4tICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHR2ZnNfaW5vZGU7XFxuLVxcbi1cXHRfX3UzMlxcdFxcdHZpaV9tb2RlO1xcbi1cXHRfX3UzMlxcdFxcdHZpaV9ubGluaztcXHQvKiBMaW5rIGNvdW50ICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX3VpZDtcXHQvKiBVSUQgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfZ2lkO1xcdC8qIEdJRCAqL1xcbi1cXHRfX3U2NFxcdFxcdHZpaV9zaXplO1xcdC8qIElub2RlIHNpemUgaW4gYnl0ZXMgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfYXRpbWU7XFx0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2F1dGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX210aW1lO1xcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSBzZWMgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfbXV0aW1lO1xcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2N0aW1lO1xcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2N1dGltZTtcXHQvKiBDcmVhdGUgdGltZSAtIHVzZWMgKi9cXG4tXFx0X191OFxcdFxcdHZpaV9vcmd0eXBlO1xcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0X191MzJcXHRcXHRcXHRyZGV2O1xcbi1cXHRcXHRfX3UzMlxcdFxcdFxcdGRvdGRvdDtcXG4tXFx0fSB2aWlfZnRhcmVhO1xcbi1cXHRfX3UzMlxcdFxcdHZpaV9ibG9ja3M7XFx0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2dlbjtcXHQvKiBJbm9kZSBnZW5lcmF0aW9uICovXFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfaW1tZWRcXHRpbW1lZDtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfZXh0NFxcdGV4dDQ7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX3R5cGVkXFx0dHlwZWRbVlhGU19OVFlQRURdO1xcbi1cXHR9IHZpaV9vcmc7XFxuLX07XFxuLVxcbi0jZGVmaW5lIHZpaV9yZGV2XFx0dmlpX2Z0YXJlYS5yZGV2XFxuLSNkZWZpbmUgdmlpX2RvdGRvdFxcdHZpaV9mdGFyZWEuZG90ZG90XFxuLVxcbi0jZGVmaW5lIHZpaV9pbW1lZFxcdHZpaV9vcmcuaW1tZWRcXG4tI2RlZmluZSB2aWlfZXh0NFxcdHZpaV9vcmcuZXh0NFxcbi0jZGVmaW5lIHZpaV90eXBlZFxcdHZpaV9vcmcudHlwZWRcXG4tXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcXG4te1xcbi1cXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xcbi19XFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwyNzMgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXFxuLSAqL1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGxvb2t1cCBhbmQgb3RoZXIgZGlyZWN0b3J5IHJlbGF0ZWQgY29kZS5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZmlsZWxvY2suaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RpbWUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9oaWdobWVtLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2Rpci5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19pbm9kZS5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19leHRlcm4uaFxcXCJcXG4tXFxuLS8qXFxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19CTE9DS19QRVJfUEFHRShzYnApICAoKFBBR0VfU0laRSAvIChzYnApLVxcdTAwM2VzX2Jsb2Nrc2l6ZSkpXFxuLVxcbi1cXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlxcdHZ4ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHVuc2lnbmVkIGludCk7XFxuLXN0YXRpYyBpbnRcXHRcXHR2eGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopO1xcbi1cXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xcbi1cXHQubG9va3VwID1cXHRcXHR2eGZzX2xvb2t1cCxcXG4tfTtcXG4tXFxuLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdnhmc19kaXJfb3BlcmF0aW9ucyA9IHtcXG4tXFx0Lmxsc2VlayA9XFx0XFx0Z2VuZXJpY19maWxlX2xsc2VlayxcXG4tXFx0LnJlYWQgPVxcdFxcdFxcdGdlbmVyaWNfcmVhZF9kaXIsXFxuLVxcdC5pdGVyYXRlX3NoYXJlZCA9XFx0dnhmc19yZWFkZGlyLFxcbi1cXHQuc2V0bGVhc2UgPVxcdFxcdGdlbmVyaWNfc2V0bGVhc2UsXFxuLX07XFxuLVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfZmluZF9lbnRyeSAtIGZpbmQgYSBtYXRoaW5nIGRpcmVjdG9yeSBlbnRyeSBmb3IgYSBkZW50cnlcXG4tICogQGlwOlxcdFxcdGRpcmVjdG9yeSBpbm9kZVxcbi0gKiBAZHA6XFx0XFx0ZGVudHJ5IGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgYSBkaXJlY3RcXG4tICogQHBwcDpcXHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcXHUwMDI2c3RydWN0IHZ4ZnNfZGlyZWN0IGZvciB0aGUgVkZTIGRpcmVjdG9yeVxcbi0gKiAgIGNhY2hlIGVudHJ5IEBkcC4gIEBwcHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuXFxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxcbi0gKi9cXG4tc3RhdGljIHN0cnVjdCB2eGZzX2RpcmVjdCAqXFxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXFxuLXtcXG4tXFx0dV9sb25nIGJzaXplID0gaXAtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbi1cXHRjb25zdCBjaGFyICpuYW1lID0gZHAtXFx1MDAzZWRfbmFtZS5uYW1lO1xcbi1cXHRpbnQgbmFtZWxlbiA9IGRwLVxcdTAwM2VkX25hbWUubGVuO1xcbi1cXHRsb2ZmX3QgbGltaXQgPSBWWEZTX0RJUlJPVU5EKGlwLVxcdTAwM2VpX3NpemUpO1xcbi1cXHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlX2V4aXQgPSBOVUxMO1xcbi1cXHRsb2ZmX3QgcG9zID0gMDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpID0gVlhGU19TQkkoaXAtXFx1MDAzZWlfc2IpO1xcbi1cXG4tXFx0d2hpbGUgKHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwcDtcXG4tXFx0XFx0Y2hhciAqa2FkZHI7XFxuLVxcdFxcdGludCBwZ19vZnMgPSBwb3MgXFx1MDAyNiB+UEFHRV9NQVNLO1xcbi1cXG4tXFx0XFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVxcdTAwM2VpX21hcHBpbmcsIHBvcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4tXFx0XFx0aWYgKElTX0VSUihwcCkpXFxuLVxcdFxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRcXHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcXG4tXFxuLVxcdFxcdHdoaWxlIChwZ19vZnMgXFx1MDAzYyBQQUdFX1NJWkUgXFx1MDAyNlxcdTAwMjYgcG9zIFxcdTAwM2MgbGltaXQpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHZ4ZnNfZGlyZWN0ICpkZTtcXG4tXFxuLVxcdFxcdFxcdGlmICgocG9zIFxcdTAwMjYgKGJzaXplIC0gMSkpIFxcdTAwM2MgNCkge1xcbi1cXHRcXHRcXHRcXHRzdHJ1Y3Qgdnhmc19kaXJibGsgKmRicCA9XFxuLVxcdFxcdFxcdFxcdFxcdChzdHJ1Y3Qgdnhmc19kaXJibGsgKilcXG4tXFx0XFx0XFx0XFx0XFx0IChrYWRkciArIChwb3MgXFx1MDAyNiB+UEFHRV9NQVNLKSk7XFxuLVxcdFxcdFxcdFxcdGludCBvdmVyaGVhZCA9IFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApO1xcbi1cXG4tXFx0XFx0XFx0XFx0cG9zICs9IG92ZXJoZWFkO1xcbi1cXHRcXHRcXHRcXHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0ZGUgPSAoc3RydWN0IHZ4ZnNfZGlyZWN0ICopKGthZGRyICsgcGdfb2ZzKTtcXG4tXFxuLVxcdFxcdFxcdGlmICghZGUtXFx1MDAzZWRfcmVjbGVuKSB7XFxuLVxcdFxcdFxcdFxcdHBvcyArPSBic2l6ZSAtIDE7XFxuLVxcdFxcdFxcdFxcdHBvcyBcXHUwMDI2PSB+KGJzaXplIC0gMSk7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cXHUwMDNlZF9yZWNsZW4pO1xcbi1cXHRcXHRcXHRwb3MgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cXHUwMDNlZF9yZWNsZW4pO1xcbi1cXHRcXHRcXHRpZiAoIWRlLVxcdTAwM2VkX2lubylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuLVxcbi1cXHRcXHRcXHRpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLVxcdTAwM2VkX25hbWVsZW4pKVxcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0aWYgKCFtZW1jbXAobmFtZSwgZGUtXFx1MDAzZWRfbmFtZSwgbmFtZWxlbikpIHtcXG4tXFx0XFx0XFx0XFx0KnBwcCA9IHBwO1xcbi1cXHRcXHRcXHRcXHRkZV9leGl0ID0gZGU7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkZV9leGl0KVxcbi1cXHRcXHRcXHR2eGZzX3B1dF9wYWdlKHBwKTtcXG4tXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGRlX2V4aXQ7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2lub2RlX2J5X25hbWUgLSBmaW5kIGlub2RlIG51bWJlciBmb3IgZGVudHJ5XFxuLSAqIEBkaXA6XFx0ZGlyZWN0b3J5IHRvIHNlYXJjaCBpblxcbi0gKiBAZHA6XFx0XFx0ZGVudHJ5IHdlIHNlYXJjaCBmb3JcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mXFxuLSAqICAgdGhlIHBhdGggY29tcG9uZW50IGRlc2NyaWJlZCBieSBAZHAgaW4gQGRpcC5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIGlub2RlIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgaW5vX3RcXG4tdnhmc19pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcClcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19kaXJlY3RcXHRcXHQqZGU7XFxuLVxcdHN0cnVjdCBwYWdlXFx0XFx0XFx0KnBwO1xcbi1cXHRpbm9fdFxcdFxcdFxcdFxcdGlubyA9IDA7XFxuLVxcbi1cXHRkZSA9IHZ4ZnNfZmluZF9lbnRyeShkaXAsIGRwLCBcXHUwMDI2cHApO1xcbi1cXHRpZiAoZGUpIHtcXG4tXFx0XFx0aW5vID0gZnMzMl90b19jcHUoVlhGU19TQkkoZGlwLVxcdTAwM2VpX3NiKSwgZGUtXFx1MDAzZWRfaW5vKTtcXG4tXFx0XFx0a3VubWFwKHBwKTtcXG4tXFx0XFx0cHV0X3BhZ2UocHApO1xcbi1cXHR9XFxuLVxcdFxcbi1cXHRyZXR1cm4gKGlubyk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2xvb2t1cCAtIGxvb2t1cCBwYXRobmFtZSBjb21wb25lbnRcXG4tICogQGRpcDpcXHRkaXIgaW4gd2hpY2ggd2UgbG9va3VwXFxuLSAqIEBkcDpcXHRcXHRkZW50cnkgd2UgbG9va3VwXFxuLSAqIEBmbGFnczpcXHRsb29rdXAgZmxhZ3NcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkXFxuLSAqICAgYnkgQGRwIGluIEBkaXAuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgQSBOVUxMLXBvaW50ZXIgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZW5jb2RlZFxcbi0gKiAgIGluIHRoZSByZXR1cm4gcG9pbnRlci5cXG4tICovXFxuLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpcXG4tdnhmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuLXtcXG4tXFx0c3RydWN0IGlub2RlXFx0XFx0KmlwID0gTlVMTDtcXG4tXFx0aW5vX3RcXHRcXHRcXHRpbm87XFxuLVxcdFxcdFxcdCBcXG4tXFx0aWYgKGRwLVxcdTAwM2VkX25hbWUubGVuIFxcdTAwM2UgVlhGU19OQU1FTEVOKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTtcXG4tXFx0XFx0XFx0XFx0IFxcbi1cXHRpbm8gPSB2eGZzX2lub2RlX2J5X25hbWUoZGlwLCBkcCk7XFxuLVxcdGlmIChpbm8pXFxuLVxcdFxcdGlwID0gdnhmc19pZ2V0KGRpcC1cXHUwMDNlaV9zYiwgaW5vKTtcXG4tXFx0cmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5XFxuLSAqIEBmcDpcXHRcXHR0aGUgZGlyZWN0b3J5IHRvIHJlYWRcXG4tICogQGN0eDpcXHRkaXJfY29udGV4dCBmb3IgZmlsbGRpci9yZWFkZGlyXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfcmVhZGRpciBmaWxscyBAcmV0cCB3aXRoIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gQGZwXFxuLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbi17XFxuLVxcdHN0cnVjdCBpbm9kZVxcdFxcdCppcCA9IGZpbGVfaW5vZGUoZnApO1xcbi1cXHRzdHJ1Y3Qgc3VwZXJfYmxvY2tcXHQqc2JwID0gaXAtXFx1MDAzZWlfc2I7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdGJzaXplID0gc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4tXFx0bG9mZl90XFx0XFx0XFx0cG9zLCBsaW1pdDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdCpzYmkgPSBWWEZTX1NCSShzYnApO1xcbi1cXG4tXFx0aWYgKGN0eC1cXHUwMDNlcG9zID09IDApIHtcXG4tXFx0XFx0aWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjdHgtXFx1MDAzZXBvcysrO1xcbi1cXHR9XFxuLVxcdGlmIChjdHgtXFx1MDAzZXBvcyA9PSAxKSB7XFxuLVxcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBcXFwiLi5cXFwiLCAyLCBWWEZTX0lOTyhpcCktXFx1MDAzZXZpaV9kb3Rkb3QsIERUX0RJUikpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjdHgtXFx1MDAzZXBvcysrO1xcbi1cXHR9XFxuLVxcbi1cXHRsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXFx1MDAzZWlfc2l6ZSk7XFxuLVxcdGlmIChjdHgtXFx1MDAzZXBvcyBcXHUwMDNlIGxpbWl0KVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdHBvcyA9IGN0eC1cXHUwMDNlcG9zIFxcdTAwMjYgfjNMO1xcbi1cXG4tXFx0d2hpbGUgKHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwcDtcXG4tXFx0XFx0Y2hhciAqa2FkZHI7XFxuLVxcdFxcdGludCBwZ19vZnMgPSBwb3MgXFx1MDAyNiB+UEFHRV9NQVNLO1xcbi1cXHRcXHRpbnQgcmMgPSAwO1xcbi1cXG4tXFx0XFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVxcdTAwM2VpX21hcHBpbmcsIHBvcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4tXFx0XFx0aWYgKElTX0VSUihwcCkpXFxuLVxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0XFx0a2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7XFxuLVxcbi1cXHRcXHR3aGlsZSAocGdfb2ZzIFxcdTAwM2MgUEFHRV9TSVpFIFxcdTAwMjZcXHUwMDI2IHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdFxcdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGU7XFxuLVxcbi1cXHRcXHRcXHRpZiAoKHBvcyBcXHUwMDI2IChic2l6ZSAtIDEpKSBcXHUwMDNjIDQpIHtcXG4tXFx0XFx0XFx0XFx0c3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPVxcbi1cXHRcXHRcXHRcXHRcXHQoc3RydWN0IHZ4ZnNfZGlyYmxrICopXFxuLVxcdFxcdFxcdFxcdFxcdCAoa2FkZHIgKyAocG9zIFxcdTAwMjYgflBBR0VfTUFTSykpO1xcbi1cXHRcXHRcXHRcXHRpbnQgb3ZlcmhlYWQgPSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHBvcyArPSBvdmVyaGVhZDtcXG4tXFx0XFx0XFx0XFx0cGdfb2ZzICs9IG92ZXJoZWFkO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoIWRlLVxcdTAwM2VkX3JlY2xlbikge1xcbi1cXHRcXHRcXHRcXHRwb3MgKz0gYnNpemUgLSAxO1xcbi1cXHRcXHRcXHRcXHRwb3MgXFx1MDAyNj0gfihic2l6ZSAtIDEpO1xcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0cGdfb2ZzICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfcmVjbGVuKTtcXG4tXFx0XFx0XFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfcmVjbGVuKTtcXG4tXFx0XFx0XFx0aWYgKCFkZS1cXHUwMDNlZF9pbm8pXFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0XFx0cmMgPSBkaXJfZW1pdChjdHgsIGRlLVxcdTAwM2VkX25hbWUsXFxuLVxcdFxcdFxcdFxcdFxcdGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfbmFtZWxlbiksXFxuLVxcdFxcdFxcdFxcdFxcdGZzMzJfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfaW5vKSxcXG4tXFx0XFx0XFx0XFx0XFx0RFRfVU5LTk9XTik7XFxuLVxcdFxcdFxcdGlmICghcmMpIHtcXG4tXFx0XFx0XFx0XFx0LyogdGhlIGRpciBlbnRyeSB3YXMgbm90IHJlYWQsIGZpeCBwb3MuICovXFxuLVxcdFxcdFxcdFxcdHBvcyAtPSBmczE2X3RvX2NwdShzYmksIGRlLVxcdTAwM2VkX3JlY2xlbik7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFx0XFx0dnhmc19wdXRfcGFnZShwcCk7XFxuLVxcdFxcdGlmICghcmMpXFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHR9XFxuLVxcbi1cXHRjdHgtXFx1MDAzZXBvcyA9IHBvcyB8IDI7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiAwO1xcbi19XFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMjNmMzUxODdjMjg5Ni4uMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsMTA1ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICovXFxuLVxcbi0vKiBcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIG9iamVjdCBsb2NhdGlvbiB0YWJsZSBzdXBwb3J0Llxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuLVxcbi0jaW5jbHVkZSBcXFwidnhmcy5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19vbHQuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkXFxuLXZ4ZnNfZ2V0X2ZzaGVhZChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKmZzaHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApXFxuLXtcXG4tXFx0QlVHX09OKGluZnAtXFx1MDAzZXZzaV9mc2hpbm8pO1xcbi1cXHRpbmZwLVxcdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cXHUwMDNlb2x0X2ZzaW5vWzBdKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkXFxuLXZ4ZnNfZ2V0X2lsaXN0KHN0cnVjdCB2eGZzX29sdGlsaXN0ICppbGlzdHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApXFxuLXtcXG4tXFx0QlVHX09OKGluZnAtXFx1MDAzZXZzaV9pZXh0KTtcXG4tXFx0aW5mcC1cXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXFx1MDAzZW9sdF9pZXh0WzBdKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1X2xvbmdcXG4tdnhmc19vYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGRhZGRyX3QgYmxvY2ssIHVfbG9uZyBic2l6ZSlcXG4te1xcbi1cXHRCVUdfT04oc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcXG4tXFx0cmV0dXJuIChibG9jayAqIChzYnAtXFx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcXG4tfVxcbi1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3JlYWRfb2x0IC0gcmVhZCBvbHRcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtXFxuLSAqIEBic2l6ZTpcXHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXFxuLSAqICAgaW50byBtYWluIG1lbW9yeSBhbmQgZG9lcyBzb21lIGJhc2ljIHNldHVwLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXFxuLSAqL1xcbi1pbnRcXG4tdnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGJzaXplKVxcbi17XFxuLVxcdHN0cnVjdCB2eGZzX3NiX2luZm9cXHQqaW5mcCA9IFZYRlNfU0JJKHNicCk7XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdCpicDtcXG4tXFx0c3RydWN0IHZ4ZnNfb2x0XFx0XFx0Km9wO1xcbi1cXHRjaGFyXFx0XFx0XFx0Km9hZGRyLCAqZWFkZHI7XFxuLVxcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgdnhmc19vYmxvY2soc2JwLCBpbmZwLVxcdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xcbi1cXHRpZiAoIWJwIHx8ICFicC1cXHUwMDNlYl9kYXRhKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cXHUwMDNlYl9kYXRhO1xcbi1cXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXFx1MDAzZW9sdF9tYWdpYykgIT0gVlhGU19PTFRfTUFHSUMpIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fTk9USUNFIFxcXCJ2eGZzOiBpdmFsaWQgb2x0IG1hZ2ljIG51bWJlclxcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogSXQgaXMgaW4gdGhlb3J5IHBvc3NpYmxlIHRoYXQgdnNpX29sdHNpemUgaXMgXFx1MDAzZSAxLlxcbi1cXHQgKiBJJ3ZlIG5vdCBzZWVuIGFueSBzdWNoIGZpbGVzeXN0ZW0geWV0IGFuZCBJJ20gbGF6eS4uICAtLWhjaFxcbi1cXHQgKi9cXG4tXFx0aWYgKGluZnAtXFx1MDAzZXZzaV9vbHRzaXplIFxcdTAwM2UgMSkge1xcbi1cXHRcXHRwcmludGsoS0VSTl9OT1RJQ0UgXFxcInZ4ZnM6IG9sdHNpemUgXFx1MDAzZSAxIGRldGVjdGVkLlxcXFxuXFxcIik7XFxuLVxcdFxcdHByaW50ayhLRVJOX05PVElDRSBcXFwidnhmczogcGxlYXNlIG5vdGlmeSBoY2hAaW5mcmFkZWFkLm9yZ1xcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0fVxcbi1cXG4tXFx0b2FkZHIgPSBicC1cXHUwMDNlYl9kYXRhICsgZnMzMl90b19jcHUoaW5mcCwgb3AtXFx1MDAzZW9sdF9zaXplKTtcXG4tXFx0ZWFkZHIgPSBicC1cXHUwMDNlYl9kYXRhICsgKGluZnAtXFx1MDAzZXZzaV9vbHRzaXplICogc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuLVxcbi1cXHR3aGlsZSAob2FkZHIgXFx1MDAzYyBlYWRkcikge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc19vbHRjb21tb25cXHQqb2NwID1cXG4tXFx0XFx0XFx0KHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyO1xcbi1cXHRcXHRcXG4tXFx0XFx0c3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtXFx1MDAzZW9sdF90eXBlKSkge1xcbi1cXHRcXHRjYXNlIFZYRlNfT0xUX0ZTSEVBRDpcXG4tXFx0XFx0XFx0dnhmc19nZXRfZnNoZWFkKChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKilvYWRkciwgaW5mcCk7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRjYXNlIFZYRlNfT0xUX0lMSVNUOlxcbi1cXHRcXHRcXHR2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRvYWRkciArPSBmczMyX3RvX2NwdShpbmZwLCBvY3AtXFx1MDAzZW9sdF9zaXplKTtcXG4tXFx0fVxcbi1cXG4tXFx0YnJlbHNlKGJwKTtcXG4tXFx0cmV0dXJuIChpbmZwLVxcdTAwM2V2c2lfZnNoaW5vIFxcdTAwMjZcXHUwMDI2IGluZnAtXFx1MDAzZXZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMO1xcbi1cXG4tZmFpbDpcXG4tXFx0YnJlbHNlKGJwKTtcXG4tXFx0cmV0dXJuIC1FSU5WQUw7XFxuLX1cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA1M2FmYmEwOGQ2MTdmLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaFxcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxMjAgKzAsMCBAQFxcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cXG4tI2RlZmluZSBfVlhGU19PTFRfSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBPYmplY3QgTG9jYXRpb24gVGFibGUgZGF0YSBzdHJ1Y3R1cmVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxcbi0gKiBieSB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtIHZlcnNpb24gMiBhbmQgbmV3ZXIuXFxuLSAqL1xcbi1cXG4tXFxuLS8qXFxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVxcdTAwM2VvbHRfbWFnaWMpLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1xcdFxcdDB4YTUwNEZDRjVcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgT0xUIGVudHJ5IHR5cGVzLlxcbi0gKi9cXG4tZW51bSB7XFxuLVxcdFZYRlNfT0xUX0ZSRUVcXHQ9IDEsXFxuLVxcdFZYRlNfT0xUX0ZTSEVBRFxcdD0gMixcXG4tXFx0VlhGU19PTFRfQ1VUXFx0PSAzLFxcbi1cXHRWWEZTX09MVF9JTElTVFxcdD0gNCxcXG4tXFx0VlhGU19PTFRfREVWXFx0PSA1LFxcbi1cXHRWWEZTX09MVF9TQlxcdD0gNlxcbi19O1xcbi1cXG4tLypcXG4tICogVnhGUyBPTFQgaGVhZGVyLlxcbi0gKlxcbi0gKiBUaGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIGhlYWRlciBpcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoXFxuLSAqIE9MVCBleHRlbnQuICBJdCBpcyB1c2VkIHRvIGZpbmcgY2VydGFpbiBmaWxlc3lzdGVtLXdpZGUgbWV0YWRhdGEsIGUuZy5cXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cXG4tICovXFxuLXN0cnVjdCB2eGZzX29sdCB7XFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9tYWdpYztcXHQvKiBtYWdpYyBudW1iZXJcXHRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfc2l6ZTtcXHQvKiBzaXplIG9mIHRoaXMgZW50cnlcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfY2hlY2tzdW07XFx0LyogY2hlY2tzdW0gb2YgZXh0ZW50XFx0XFx0Ki9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDE7XFx0LyogPz8/XFx0XFx0XFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X210aW1lO1xcdC8qIHRpbWUgb2YgbGFzdCBtb2QuIChzZWMpXFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X211dGltZTtcXHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAodXNlYylcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdG90ZnJlZTtcXHQvKiBmcmVlIHNwYWNlIGluIE9MVCBleHRlbnRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZXh0ZW50c1syXTtcXHQvKiBhZGRyIG9mIHRoaXMgZXh0ZW50LCByZXBsaWNhXFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2VzaXplO1xcdC8qIHNpemUgb2YgdGhpcyBleHRlbnRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfbmV4dFsyXTsgICAgLyogYWRkciBvZiBuZXh0IGV4dGVudCwgcmVwbGljYVxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9uc2l6ZTtcXHQvKiBzaXplIG9mIG5leHQgZXh0ZW50XFx0XFx0Ki9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDI7XFx0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XFx0Ki9cXG4tfTtcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgY29tbW9uIE9MVCBlbnRyeSAob24gZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRjb21tb24ge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGZyZWUgT0xUIGVudHJ5IChvbiBkaXNrKS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2ZzaXplO1xcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGluaXRpYWwtaW5vZGUgbGlzdCAob24gZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRpbGlzdCB7XFxuLVxcdF9fZnMzMlxcdG9sdF90eXBlO1xcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRvbHRfc2l6ZTtcXHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2lleHRbMl07XFx0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXFx0Ki9cXG4tfTtcXG4tXFxuLS8qXFxuLSAqIEN1cnJlbnQgVXNhZ2UgVGFibGUgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRjdXQge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9jdXRpbm87XFx0LyogaW5vZGUgb2YgY3VycmVudCB1c2FnZSB0YWJsZVxcdCovXFxuLVxcdF9fdThcXHRcXHRfX3BhZDtcXHRcXHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblxcdFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfb2x0c2Ige1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zYmlubztcXHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcXHQqL1xcbi1cXHRfX3UzMlxcdFxcdF9fdW51c2VkMTtcXHQvKiA/Pz9cXHRcXHRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfbG9naW5vWzJdO1xcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfb2x0aW5vWzJdO1xcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBJbm9kZSBjb250YWluaW5nIGRldmljZSBjb25maWd1cmF0aW9uICsgaXQncyByZXBsaWNhIFxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfb2x0ZGV2IHtcXG4tXFx0X19mczMyXFx0XFx0b2x0X3R5cGU7XFx0LyogdHlwZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zaXplO1xcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZGV2aW5vWzJdO1xcdC8qIGlub2RlIG9mIGRldmljZSBjb25maWcgZmlsZXNcXHQqL1xcbi19O1xcbi1cXG4tLypcXG4tICogRmlsZXNldCBoZWFkZXIgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRmc2hlYWQge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG51bWJlclxcdFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zaXplO1xcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZnNpbm9bMl07ICAgLyogaW5vZGVzIG9mIGZpbGVzZXQgaGVhZGVyXFx0Ki9cXG4tfTtcXG4tXFxuLSNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGY0Mzk4NzdlYTZlODAuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxNTIgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXFxuLSAqL1xcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi1cXG4tXFxuLXN0YXRpYyBpbnRcXHRcXHR2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKiwgc3RydWN0IGZvbGlvICopO1xcbi1zdGF0aWMgc2VjdG9yX3RcXHRcXHR2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QpO1xcbi1cXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2FvcHMgPSB7XFxuLVxcdC5yZWFkX2ZvbGlvID1cXHRcXHR2eGZzX3JlYWRfZm9saW8sXFxuLVxcdC5ibWFwID1cXHRcXHRcXHR2eGZzX2JtYXAsXFxuLX07XFxuLVxcbi1pbmxpbmUgdm9pZFxcbi12eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwcClcXG4te1xcbi1cXHRrdW5tYXAocHApO1xcbi1cXHRwdXRfcGFnZShwcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2dldF9wYWdlIC0gcmVhZCBhIHBhZ2UgaW50byBtZW1vcnkuXFxuLSAqIEBtYXBwaW5nOlxcdG1hcHBpbmcgdG8gcmVhZCBmcm9tXFxuLSAqIEBuOlxcdFxcdHBhZ2UgbnVtYmVyXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfZ2V0X3BhZ2UgcmVhZHMgdGhlIEBuIHRoIHBhZ2Ugb2YgQGlwIGludG8gdGhlIHBhZ2VjYWNoZS5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIHBhZ2Ugb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci5cXG4tICovXFxuLXN0cnVjdCBwYWdlICpcXG4tdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdV9sb25nIG4pXFxuLXtcXG4tXFx0c3RydWN0IHBhZ2UgKlxcdFxcdFxcdHBwO1xcbi1cXG4tXFx0cHAgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBuLCBOVUxMKTtcXG4tXFxuLVxcdGlmICghSVNfRVJSKHBwKSkge1xcbi1cXHRcXHRrbWFwKHBwKTtcXG4tXFx0XFx0LyoqIGlmICghUGFnZUNoZWNrZWQocHApKSAqKi9cXG4tXFx0XFx0XFx0LyoqIHZ4ZnNfY2hlY2tfcGFnZShwcCk7ICoqL1xcbi1cXHR9XFxuLVxcdFxcbi1cXHRyZXR1cm4gKHBwKTtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYnJlYWQgLSByZWFkIGJ1ZmZlciBmb3IgYSBnaXZlIGlub2RlLGJsb2NrIHR1cGxlXFxuLSAqIEBpcDpcXHRcXHRpbm9kZVxcbi0gKiBAYmxvY2s6XFx0bG9naWNhbCBibG9ja1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mXFxuLSAqICAgQGlwIGludG8gdGhlIGJ1ZmZlcmNhY2hlLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSByZXN1bHRpbmcgXFx1MDAyNnN0cnVjdCBidWZmZXJfaGVhZC5cXG4tICovXFxuLXN0cnVjdCBidWZmZXJfaGVhZCAqXFxuLXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICppcCwgaW50IGJsb2NrKVxcbi17XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdCpicDtcXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdHBibG9jaztcXG4tXFxuLVxcdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGJsb2NrKTtcXG4tXFx0YnAgPSBzYl9icmVhZChpcC1cXHUwMDNlaV9zYiwgcGJsb2NrKTtcXG4tXFxuLVxcdHJldHVybiAoYnApO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19nZXRibGsgLSBsb2NhdGUgYnVmZmVyIGZvciBnaXZlbiBpbm9kZSxibG9jayB0dXBsZVxcbi0gKiBAaXA6XFx0XFx0aW5vZGVcXG4tICogQGlibG9jazpcXHRsb2dpY2FsIGJsb2NrXFxuLSAqIEBicDpcXHRcXHRidWZmZXIgc2tlbGV0b25cXG4tICogQGNyZWF0ZTpcXHQlVFJVRSBpZiBibG9ja3MgbWF5IGJlIG5ld2x5IGFsbG9jYXRlZC5cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgVGhlIHZ4ZnNfZ2V0YmxrIGZ1bmN0aW9uIGZpbGxzIEBicCB3aXRoIHRoZSByaWdodCBwaHlzaWNhbFxcbi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uXFxuLSAqICAgaXQuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdiBlcnJvciBjb2RlICgtRUlPKS5cXG4tICovXFxuLXN0YXRpYyBpbnRcXG4tdnhmc19nZXRibGsoc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgaWJsb2NrLFxcbi1cXHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSlcXG4te1xcbi1cXHRkYWRkcl90XFx0XFx0XFx0cGJsb2NrO1xcbi1cXG4tXFx0cGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTtcXG4tXFx0aWYgKHBibG9jayAhPSAwKSB7XFxuLVxcdFxcdG1hcF9iaChicCwgaXAtXFx1MDAzZWlfc2IsIHBibG9jayk7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gLUVJTztcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcmVhZF9mb2xpbyAtIHJlYWQgb25lIHBhZ2Ugc3luY2hyb25vdXNseSBpbnRvIHRoZSBwYWdlY2FjaGVcXG4tICogQGZpbGU6XFx0ZmlsZSBjb250ZXh0ICh1bnVzZWQpXFxuLSAqIEBmb2xpbzpcXHRmb2xpbyB0byBmaWxsIGluLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGVcXG4tICogICBwYWdlY2FjaGUuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICpcXG4tICogTG9ja2luZyBzdGF0dXM6XFxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi17XFxuLVxcdHJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTtcXG4tfVxcbi0gXFxuLS8qKlxcbi0gKiB2eGZzX2JtYXAgLSBwZXJmb3JtIGxvZ2ljYWwgdG8gcGh5c2ljYWwgYmxvY2sgbWFwcGluZ1xcbi0gKiBAbWFwcGluZzpcXHRsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlXFxuLSAqIEBibG9jazpcXHRsb2dpY2FsIGJsb2NrIChyZWxhdGl2ZSB0byBAbWFwcGluZykuXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIFZ4ZnNfYm1hcCBmaW5kIG91dCB0aGUgY29ycmVzcG9uZGluZyBwaHNpY2FsIGJsb2NrIHRvIHRoZVxcbi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKlxcbi0gKiBMb2NraW5nIHN0YXR1czpcXG4tICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC5cXG4tICovXFxuLXN0YXRpYyBzZWN0b3JfdFxcbi12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKVxcbi17XFxuLVxcdHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBkN2Q4NDdkNzVjM2Q1Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM0NyArMCwwIEBAXFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLVxcbi0vKlxcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luaXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jsa2Rldi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N0YXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Zmcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2Rpci5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19pbm9kZS5oXFxcIlxcbi1cXG4tXFxuLU1PRFVMRV9BVVRIT1IoXFxcIkNocmlzdG9waCBIZWxsd2lnLCBLcnp5c3p0b2YgQmxhc3prb3dza2lcXFwiKTtcXG4tTU9EVUxFX0RFU0NSSVBUSU9OKFxcXCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlclxcXCIpO1xcbi1NT0RVTEVfTElDRU5TRShcXFwiRHVhbCBCU0QvR1BMXFxcIik7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwO1xcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlc1xcbi0gKiBAc2JwOlxcdFZGUyBzdXBlcmJsb2NrLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX3B1dF9zdXBlciBmcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgQHNicFxcbi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC5cXG4tICovXFxuLVxcbi1zdGF0aWMgdm9pZFxcbi12eGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicClcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0KmluZnAgPSBWWEZTX1NCSShzYnApO1xcbi1cXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9pbGlzdCk7XFxuLVxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpO1xcbi1cXG4tXFx0YnJlbHNlKGluZnAtXFx1MDAzZXZzaV9icCk7XFxuLVxcdGtmcmVlKGluZnApO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19zdGF0ZnMgLSBnZXQgZmlsZXN5c3RlbSBpbmZvcm1hdGlvblxcbi0gKiBAZGVudHJ5OlxcdFZGUyBkZW50cnkgdG8gbG9jYXRlIHN1cGVyYmxvY2tcXG4tICogQGJ1ZnA6XFx0b3V0cHV0IGJ1ZmZlclxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX3N0YXRmcyBmaWxscyB0aGUgc3RhdGZzIGJ1ZmZlciBAYnVmcCB3aXRoIGluZm9ybWF0aW9uXFxuLSAqICAgYWJvdXQgdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IEBkZW50cnkuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVyby5cXG4tICpcXG4tICogTG9ja2luZzpcXG4tICogICBObyBsb2NrcyBoZWxkLlxcbi0gKlxcbi0gKiBOb3RlczpcXG4tICogICBUaGlzIGlzIGV2ZXJ5dGhpbmcgYnV0IGNvbXBsZXRlLi4uXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLXZ4ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZnApXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCppbmZwID0gVlhGU19TQkkoZGVudHJ5LVxcdTAwM2VkX3NiKTtcXG4tXFx0c3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtXFx1MDAzZXZzaV9yYXc7XFxuLVxcdHU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihkZW50cnktXFx1MDAzZWRfc2ItXFx1MDAzZXNfYmRldi1cXHUwMDNlYmRfZGV2KTtcXG4tXFxuLVxcdGJ1ZnAtXFx1MDAzZWZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7XFxuLVxcdGJ1ZnAtXFx1MDAzZWZfYnNpemUgPSBkZW50cnktXFx1MDAzZWRfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbi1cXHRidWZwLVxcdTAwM2VmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cXHUwMDNldnNfZHNpemUpO1xcbi1cXHRidWZwLVxcdTAwM2VmX2JmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVxcdTAwM2V2c19mcmVlKTtcXG4tXFx0YnVmcC1cXHUwMDNlZl9iYXZhaWwgPSAwO1xcbi1cXHRidWZwLVxcdTAwM2VmX2ZpbGVzID0gMDtcXG4tXFx0YnVmcC1cXHUwMDNlZl9mZnJlZSA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cXHUwMDNldnNfaWZyZWUpO1xcbi1cXHRidWZwLVxcdTAwM2VmX2ZzaWQgPSB1NjRfdG9fZnNpZChpZCk7XFxuLVxcdGJ1ZnAtXFx1MDAzZWZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjtcXG4tXFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbi17XFxuLVxcdHN5bmNfZmlsZXN5c3RlbShmYy1cXHUwMDNlcm9vdC1cXHUwMDNlZF9zYik7XFxuLVxcdGZjLVxcdTAwM2VzYl9mbGFncyB8PSBTQl9SRE9OTFk7XFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi1zdGF0aWMgc3RydWN0IGlub2RlICp2eGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmk7XFxuLVxcbi1cXHR2aSA9IGFsbG9jX2lub2RlX3NiKHNiLCB2eGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XFxuLVxcdGlmICghdmkpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRpbm9kZV9pbml0X29uY2UoXFx1MDAyNnZpLVxcdTAwM2V2ZnNfaW5vZGUpO1xcbi1cXHRyZXR1cm4gXFx1MDAyNnZpLVxcdTAwM2V2ZnNfaW5vZGU7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHZ4ZnNfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi17XFxuLVxcdGttZW1fY2FjaGVfZnJlZSh2eGZzX2lub2RlX2NhY2hlcCwgVlhGU19JTk8oaW5vZGUpKTtcXG4tfVxcbi1cXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHZ4ZnNfc3VwZXJfb3BzID0ge1xcbi1cXHQuYWxsb2NfaW5vZGVcXHRcXHQ9IHZ4ZnNfYWxsb2NfaW5vZGUsXFxuLVxcdC5mcmVlX2lub2RlXFx0XFx0PSB2eGZzX2ZyZWVfaW5vZGUsXFxuLVxcdC5ldmljdF9pbm9kZVxcdFxcdD0gdnhmc19ldmljdF9pbm9kZSxcXG4tXFx0LnB1dF9zdXBlclxcdFxcdD0gdnhmc19wdXRfc3VwZXIsXFxuLVxcdC5zdGF0ZnNcXHRcXHRcXHQ9IHZ4ZnNfc3RhdGZzLFxcbi19O1xcbi1cXG4tc3RhdGljIGludCB2eGZzX3RyeV9zYl9tYWdpYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IGZzX2NvbnRleHQgKmZjLFxcbi1cXHRcXHR1bnNpZ25lZCBibGssIF9fZnMzMiBtYWdpYylcXG4te1xcbi1cXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJwO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYiAqcnNicDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCA9IFZYRlNfU0JJKHNicCk7XFxuLVxcdGludCBzaWxlbnQgPSBmYy1cXHUwMDNlc2JfZmxhZ3MgXFx1MDAyNiBTQl9TSUxFTlQ7XFxuLVxcdGludCByYyA9IC1FTk9NRU07XFxuLVxcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgYmxrKTtcXG4tXFx0ZG8ge1xcbi1cXHRcXHRpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkge1xcbi1cXHRcXHRcXHRpZiAoIXNpbGVudCkge1xcbi1cXHRcXHRcXHRcXHR3YXJuZihmYyxcXG4tXFx0XFx0XFx0XFx0ICAgICAgXFxcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGRpc2sgc3VwZXJibG9jayBhdCAldVxcXCIsXFxuLVxcdFxcdFxcdFxcdCAgICAgIGJsayk7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJjID0gLUVJTlZBTDtcXG4tXFx0XFx0cnNicCA9IChzdHJ1Y3Qgdnhmc19zYiAqKWJwLVxcdTAwM2ViX2RhdGE7XFxuLVxcdFxcdGlmIChyc2JwLVxcdTAwM2V2c19tYWdpYyAhPSBtYWdpYykge1xcbi1cXHRcXHRcXHRpZiAoIXNpbGVudClcXG4tXFx0XFx0XFx0XFx0aW5mb2YoZmMsXFxuLVxcdFxcdFxcdFxcdCAgICAgIFxcXCJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljICUwOHggYXQgJXVcXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgICByc2JwLVxcdTAwM2V2c19tYWdpYywgYmxrKTtcXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJjID0gMDtcXG4tXFx0XFx0aW5mcC1cXHUwMDNldnNpX3JhdyA9IHJzYnA7XFxuLVxcdFxcdGluZnAtXFx1MDAzZXZzaV9icCA9IGJwO1xcbi1cXHR9IHdoaWxlICgwKTtcXG4tXFxuLVxcdGlmIChyYykge1xcbi1cXHRcXHRpbmZwLVxcdTAwM2V2c2lfcmF3ID0gTlVMTDtcXG4tXFx0XFx0aW5mcC1cXHUwMDNldnNpX2JwID0gTlVMTDtcXG4tXFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIHJjO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19maWxsX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0aWFsaXplIGZpbGVzeXN0ZW1cXG4tICogQHNicDpcXHRcXHRWRlMgc3VwZXJibG9jayAodG8gZmlsbClcXG4tICogQGZjOlxcdFxcdFxcdGZpbGVzeXRlbSBjb250ZXh0XFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIFdlIGFyZSBjYWxsZWQgb24gdGhlIGZpcnN0IG1vdW50IG9mIGEgZmlsZXN5c3RlbSB0byByZWFkIHRoZVxcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cXG4tICpcXG4tICogTG9ja2luZzpcXG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cXHUwMDNlc19sb2NrLlxcbi0gKi9cXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0KmluZnA7XFxuLVxcdHN0cnVjdCB2eGZzX3NiXFx0XFx0KnJzYnA7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdGJzaXplO1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XFxuLVxcdGludCByZXQgPSAtRUlOVkFMO1xcbi1cXHRpbnQgc2lsZW50ID0gZmMtXFx1MDAzZXNiX2ZsYWdzIFxcdTAwMjYgU0JfU0lMRU5UO1xcbi1cXHR1MzIgajtcXG4tXFxuLVxcdHNicC1cXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XFxuLVxcbi1cXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xcbi1cXHRpZiAoIWluZnApIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcXFwiKTtcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcdH1cXG4tXFxuLVxcdGJzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYnAsIEJMT0NLX1NJWkUpO1xcbi1cXHRpZiAoIWJzaXplKSB7XFxuLVxcdFxcdHdhcm5mKGZjLCBcXFwidnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdHNicC1cXHUwMDNlc19vcCA9IFxcdTAwMjZ2eGZzX3N1cGVyX29wcztcXG4tXFx0c2JwLVxcdTAwM2VzX2ZzX2luZm8gPSBpbmZwO1xcbi1cXHRzYnAtXFx1MDAzZXNfdGltZV9taW4gPSAwO1xcbi1cXHRzYnAtXFx1MDAzZXNfdGltZV9tYXggPSBVMzJfTUFYO1xcbi1cXG4tXFx0aWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLFxcbi1cXHRcXHRcXHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XFxuLVxcdFxcdC8qIFVuaXh3YXJlLCB4ODYgKi9cXG4tXFx0XFx0aW5mcC1cXHUwMDNlYnl0ZV9vcmRlciA9IFZYRlNfQk9fTEU7XFxuLVxcdH0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsXFxuLVxcdFxcdFxcdChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fYmUzMihWWEZTX1NVUEVSX01BR0lDKSkpIHtcXG4tXFx0XFx0LyogSFAtVVgsIHBhcmlzYyAqL1xcbi1cXHRcXHRpbmZwLVxcdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19CRTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKCFzaWxlbnQpXFxuLVxcdFxcdFxcdGluZm9mKGZjLCBcXFwidnhmczogY2FuJ3QgZmluZCBzdXBlcmJsb2NrLlxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0cnNicCA9IGluZnAtXFx1MDAzZXZzaV9yYXc7XFxuLVxcdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVxcdTAwM2V2c192ZXJzaW9uKTtcXG4tXFx0aWYgKChqIFxcdTAwM2MgMiB8fCBqIFxcdTAwM2UgNCkgXFx1MDAyNlxcdTAwMjYgIXNpbGVudCkge1xcbi1cXHRcXHRpbmZvZihmYywgXFxcInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxcIiwgaik7XFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwidnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxcXG5cXFwiLCBqKTtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInZ4ZnM6IGJsb2Nrc2l6ZTogJWRcXFxcblxcXCIsXFxuLVxcdFxcdGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXFx1MDAzZXZzX2JzaXplKSk7XFxuLSNlbmRpZlxcbi1cXG4tXFx0c2JwLVxcdTAwM2VzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfbWFnaWMpO1xcbi1cXG4tXFx0aW5mcC1cXHUwMDNldnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXFx1MDAzZXZzX29sdGV4dFswXSk7XFxuLVxcdGluZnAtXFx1MDAzZXZzaV9vbHRzaXplID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfb2x0c2l6ZSk7XFxuLVxcbi1cXHRqID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfYnNpemUpO1xcbi1cXHRpZiAoIXNiX3NldF9ibG9ja3NpemUoc2JwLCBqKSkge1xcbi1cXHRcXHR3YXJuZihmYywgXFxcInZ4ZnM6IHVuYWJsZSB0byBzZXQgZmluYWwgYmxvY2sgc2l6ZVxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKHZ4ZnNfcmVhZF9vbHQoc2JwLCBic2l6ZSkpIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHRcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdGlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2hlYWRcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdHJvb3QgPSB2eGZzX2lnZXQoc2JwLCBWWEZTX1JPT1RfSU5PKTtcXG4tXFx0aWYgKElTX0VSUihyb290KSkge1xcbi1cXHRcXHRyZXQgPSBQVFJfRVJSKHJvb3QpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXHRzYnAtXFx1MDAzZXNfcm9vdCA9IGRfbWFrZV9yb290KHJvb3QpO1xcbi1cXHRpZiAoIXNicC1cXHUwMDNlc19yb290KSB7XFxuLVxcdFxcdHdhcm5mKGZjLCBcXFwidnhmczogdW5hYmxlIHRvIGdldCByb290IGRlbnRyeS5cXFwiKTtcXG4tXFx0XFx0Z290byBvdXRfZnJlZV9pbGlzdDtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLVxcdFxcbi1vdXRfZnJlZV9pbGlzdDpcXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9pbGlzdCk7XFxuLVxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpO1xcbi1vdXQ6XFxuLVxcdGJyZWxzZShpbmZwLVxcdTAwM2V2c2lfYnApO1xcbi1cXHRrZnJlZShpbmZwKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tLypcXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19nZXRfdHJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuLXtcXG4tXFx0cmV0dXJuIGdldF90cmVlX2JkZXYoZmMsIHZ4ZnNfZmlsbF9zdXBlcik7XFxuLX1cXG4tXFxuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNfY29udGV4dF9vcGVyYXRpb25zIHZ4ZnNfY29udGV4dF9vcHMgPSB7XFxuLVxcdC5nZXRfdHJlZVxcdD0gdnhmc19nZXRfdHJlZSxcXG4tXFx0LnJlY29uZmlndXJlXFx0PSB2eGZzX3JlY29uZmlndXJlLFxcbi19O1xcbi1cXG4tc3RhdGljIGludCB2eGZzX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuLXtcXG4tXFx0ZmMtXFx1MDAzZW9wcyA9IFxcdTAwMjZ2eGZzX2NvbnRleHRfb3BzO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7XFxuLVxcdC5vd25lclxcdFxcdD0gVEhJU19NT0RVTEUsXFxuLVxcdC5uYW1lXFx0XFx0PSBcXFwidnhmc1xcXCIsXFxuLVxcdC5raWxsX3NiXFx0PSBraWxsX2Jsb2NrX3N1cGVyLFxcbi1cXHQuZnNfZmxhZ3NcXHQ9IEZTX1JFUVVJUkVTX0RFVixcXG4tXFx0LmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LFxcbi19O1xcbi1NT0RVTEVfQUxJQVNfRlMoXFxcInZ4ZnNcXFwiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovXFxuLU1PRFVMRV9BTElBUyhcXFwidnhmc1xcXCIpO1xcbi1cXG4tc3RhdGljIGludCBfX2luaXRcXG4tdnhmc19pbml0KHZvaWQpXFxuLXtcXG4tXFx0aW50IHJ2O1xcbi1cXG4tXFx0dnhmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZV91c2VyY29weShcXFwidnhmc19pbm9kZVxcXCIsXFxuLVxcdFxcdFxcdHNpemVvZihzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvKSwgMCxcXG4tXFx0XFx0XFx0U0xBQl9SRUNMQUlNX0FDQ09VTlQsXFxuLVxcdFxcdFxcdG9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksXFxuLVxcdFxcdFxcdHNpemVvZl9maWVsZChzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLFxcbi1cXHRcXHRcXHRcXHR2aWlfaW1tZWQudmlfaW1tZWQpLFxcbi1cXHRcXHRcXHROVUxMKTtcXG4tXFx0aWYgKCF2eGZzX2lub2RlX2NhY2hlcClcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcdHJ2ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbShcXHUwMDI2dnhmc19mc190eXBlKTtcXG4tXFx0aWYgKHJ2IFxcdTAwM2MgMClcXG4tXFx0XFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcXG4tXFx0cmV0dXJuIHJ2O1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX2V4aXRcXG4tdnhmc19jbGVhbnVwKHZvaWQpXFxuLXtcXG4tXFx0dW5yZWdpc3Rlcl9maWxlc3lzdGVtKFxcdTAwMjZ2eGZzX2ZzX3R5cGUpO1xcbi1cXHQvKlxcbi1cXHQgKiBNYWtlIHN1cmUgYWxsIGRlbGF5ZWQgcmN1IGZyZWUgaW5vZGVzIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZVxcbi1cXHQgKiBkZXN0cm95IGNhY2hlLlxcbi1cXHQgKi9cXG4tXFx0cmN1X2JhcnJpZXIoKTtcXG4tXFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcXG4tfVxcbi1cXG4tbW9kdWxlX2luaXQodnhmc19pbml0KTtcXG4tbW9kdWxlX2V4aXQodnhmc19jbGVhbnVwKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMzBUMTg6NDA6MTAuNzEyODY1NTgyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODY3Mjc5NTg0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4ZGFlNTE0OGMxMDQ1ZmQwMGU1YWE5MTMxZjdkMzU4NDY0YzBjOGU1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdWwgMzAgMTg6NDA6MDkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbisrKyBiL01BSU5UQUlORVJTXG5AQCAtMTA1NjUsMTIgKzEwNTY1LDYgQEAgTDpcdGxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnXG4gUzpcdE9ycGhhblxuIEY6XHRkcml2ZXJzL3VzYi9waHkvcGh5LWZzbC11c2IqXG4gXG4tRlJFRVZYRlMgRklMRVNZU1RFTVxuLU06XHRDaHJpc3RvcGggSGVsbHdpZyBcdTAwM2NoY2hAaW5mcmFkZWFkLm9yZ1x1MDAzZVxuLVM6XHRNYWludGFpbmVkXG4tVzpcdGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL3Z4ZnNcbi1GOlx0ZnMvZnJlZXZ4ZnMvXG4tXG4gRlJFRVpFUlxuIE06XHRcIlJhZmFlbCBKLiBXeXNvY2tpXCIgXHUwMDNjcmFmYWVsQGtlcm5lbC5vcmdcdTAwM2VcbiBSOlx0UGF2ZWwgTWFjaGVrIFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcdTAwM2VcbmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZ1xuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcbi0tLSBhL2ZzL0tjb25maWdcbisrKyBiL2ZzL0tjb25maWdcbkBAIC0zMjEsNyArMzIxLDYgQEAgc291cmNlIFwiZnMvamZmczIvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvdWJpZnMvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvY3JhbWZzL0tjb25maWdcIlxuIHNvdXJjZSBcImZzL3NxdWFzaGZzL0tjb25maWdcIlxuLXNvdXJjZSBcImZzL2ZyZWV2eGZzL0tjb25maWdcIlxuIHNvdXJjZSBcImZzL21pbml4L0tjb25maWdcIlxuIHNvdXJjZSBcImZzL29tZnMvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvaHBmcy9LY29uZmlnXCJcbmRpZmYgLS1naXQgYS9mcy9NYWtlZmlsZSBiL2ZzL01ha2VmaWxlXG5pbmRleCA4OWE4YTlkMjA3ZDFjLi5hYzBkMWMwMDUyM2YwIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbisrKyBiL2ZzL01ha2VmaWxlXG5AQCAtODAsNyArODAsNiBAQCBvYmotJChDT05GSUdfSVNPOTY2MF9GUylcdCs9IGlzb2ZzL1xuIG9iai0kKENPTkZJR19IRlNQTFVTX0ZTKVx0Kz0gaGZzcGx1cy8gIyBCZWZvcmUgaGZzIHRvIGZpbmQgd3JhcHBlZCBIRlMrXG4gb2JqLSQoQ09ORklHX0hGU19GUylcdFx0Kz0gaGZzL1xuIG9iai0kKENPTkZJR19FQ1JZUFRfRlMpXHRcdCs9IGVjcnlwdGZzL1xuLW9iai0kKENPTkZJR19WWEZTX0ZTKVx0XHQrPSBmcmVldnhmcy9cbiBvYmotJChDT05GSUdfTkZTX0ZTKVx0XHQrPSBuZnMvXG4gb2JqLSQoQ09ORklHX0VYUE9SVEZTKVx0XHQrPSBleHBvcnRmcy9cbiBvYmotJChDT05GSUdfTkZTRClcdFx0Kz0gbmZzZC9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA5MTIxMDdlYmVhNmY0Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNyArMCwwIEBAXG4tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tY29uZmlnIFZYRlNfRlNcbi1cdHRyaXN0YXRlIFwiRnJlZVZ4RlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoVkVSSVRBUyBWeEZTKFRNKSBjb21wYXRpYmxlKVwiXG4tXHRkZXBlbmRzIG9uIEJMT0NLXG4tXHRzZWxlY3QgQlVGRkVSX0hFQURcbi1cdGhlbHBcbi1cdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXG4tXHQgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtXG4tXHQgIG9mIFNDTyBVbml4V2FyZSAoYW5kIHBvc3NpYmx5IG90aGVycykgYW5kIG9wdGlvbmFsbHkgYXZhaWxhYmxlXG4tXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXG4tXHQgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrXG4tXHQgIGRhdGEgZW5kaWFubmVzcyBhbmQvb3Igc3VwZXJibG9jayBvZmZzZXQuIFRoZSB2eGZzIG1vZHVsZSBoYXMgYmVlblxuLVx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxuLVx0ICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zXG4tXHQgIDIsIDMgYW5kIDQuIFRlc3RzIHdlcmUgcGVyZm9ybWVkIHdpdGggSFAtVVggVnhGUyB2ZXJzaW9uIDMuXG4tXG4tXHQgIE5PVEU6IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGFzIHVzZWQgYnkgbW91bnQoMSksIG1vdW50KDIpIGFuZFxuLVx0ICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdFxuLVx0ICB0aGUgYWN0dWFsIGRyaXZlci5cbi1cbi1cdCAgVGhlcmUgaXMgYSB1c2Vyc3BhY2UgdXRpbGl0eSBmb3IgSFAtVVggbG9naWNhbCB2b2x1bWVzIHdoaWNoIG1ha2VzXG4tXHQgIGNyZWF0aW5nIEhQLVVYIGxvZ2ljYWwgdm9sdW1lcyBlYXN5IGZyb20gSFAtVVggZGlzayBibG9jayBkZXZpY2UgZmlsZVxuLVx0ICBvciByZWd1bGFyIGZpbGUgd2l0aCBpbWFnZSBvZiB0aGUgZGlzay4gU2VlOlxuLVx0ICAgICAgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXgtdnhmcy9cbi1cbi1cdCAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmVcbi1cdCAgY2FsbGVkIGZyZWV2eGZzLiAgSWYgdW5zdXJlLCBzYXkgTi5cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9NYWtlZmlsZSBiL2ZzL2ZyZWV2eGZzL01ha2VmaWxlXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGU2ZWU1OTI5MTUyMWMuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlXG4rKysgL2Rldi9udWxsXG5AQCAtMSw5ICswLDAgQEBcbi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0jXG4tIyBWeEZTIE1ha2VmaWxlXG4tI1xuLVxuLW9iai0kKENPTkZJR19WWEZTX0ZTKSArPSBmcmVldnhmcy5vXG4tXG4tZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXFxcbi1cdFx0IHZ4ZnNfbG9va3VwLm8gdnhmc19vbHQubyB2eGZzX3N1YnIubyB2eGZzX3N1cGVyLm9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggYmZmZDE1NmQ2NDM0Yy4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmcy5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNTcgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX1NVUEVSX0hfXG4tI2RlZmluZSBfVlhGU19TVVBFUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogc3VwZXJibG9ja3Mgb2YgdGhlIFZlcml0YXMgRmlsZXN5c3RlbS5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4tXG4tLypcbi0gKiBTdXBlcmJsb2NrIG1hZ2ljIG51bWJlciAodnhmc19zdXBlci1cdTAwM2V2c19tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX1NVUEVSX01BR0lDXHQweGE1MDFGQ0Y1XG4tXG4tLypcbi0gKiBUaGUgcm9vdCBpbm9kZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfUk9PVF9JTk9cdFx0MlxuLVxuLS8qXG4tICogTnVtIG9mIGVudHJpZXMgaW4gZnJlZSBleHRlbnQgYXJyYXlcbi0gKi9cbi0jZGVmaW5lIFZYRlNfTkVGUkVFXHRcdDMyXG4tXG4tZW51bSB2eGZzX2J5dGVfb3JkZXIge1xuLVx0VlhGU19CT19MRSxcbi1cdFZYRlNfQk9fQkUsXG4tfTtcbi1cbi10eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2ZzMTY7XG4tdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyO1xuLXR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fZnM2NDtcbi1cbi0vKlxuLSAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuXG4tICovXG4tc3RydWN0IHZ4ZnNfc2Ige1xuLVx0Lypcbi1cdCAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLlxuLVx0ICpcbi1cdCAqIExvdHMgb2YgdGhpcyBmaWVsZHMgYXJlIG5vIG1vcmUgdXNlZCBieSB2ZXJzaW9uIDJcbi1cdCAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy5cbi1cdCAqL1xuLVx0X19mczMyXHRcdHZzX21hZ2ljO1x0XHQvKiBNYWdpYyBudW1iZXIgKi9cbi1cdF9fZnMzMlx0XHR2c192ZXJzaW9uO1x0XHQvKiBWeEZTIHZlcnNpb24gKi9cbi1cdF9fZnMzMlx0XHR2c19jdGltZTtcdFx0LyogY3JlYXRlIHRpbWUgLSBzZWNzICovXG4tXHRfX2ZzMzJcdFx0dnNfY3V0aW1lO1x0XHQvKiBjcmVhdGUgdGltZSAtIHVzZWNzICovXG4tXHRfX2ZzMzJcdFx0X191bnVzZWQxO1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHRfX3VudXNlZDI7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9sb2dzdGFydDtcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2xvZ2VuZDtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19ic2l6ZTtcdFx0LyogYmxvY2sgc2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX3NpemU7XHRcdC8qIG51bWJlciBvZiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19kc2l6ZTtcdFx0LyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX25pbm9kZTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmF1O1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdF9fdW51c2VkMztcdFx0LyogdW51c2VkICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2RlZmlleHRzaXplO1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaWxic2l6ZTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbW1lZGxlbjtcdFx0Lyogc2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBhcmVhICovXG4tXHRfX2ZzMzJcdFx0dnNfbmRhZGRyO1x0XHQvKiBudW1iZXIgb2YgZGlyZWN0IGV4dGVudGVzICovXG4tXHRfX2ZzMzJcdFx0dnNfZmlyc3RhdTtcdFx0LyogYWRkcmVzcyBvZiBmaXJzdCBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2VtYXA7XHRcdC8qIG9mZnNldCBvZiBleHRlbnQgbWFwIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfaW1hcDtcdFx0Lyogb2Zmc2V0IG9mIGlub2RlIG1hcCBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2lleHRvcDtcdFx0Lyogb2Zmc2V0IG9mIEV4dE9wLiBtYXAgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19pc3RhcnQ7XHRcdC8qIG9mZnNldCBvZiBpbm9kZSBsaXN0IGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfYnN0YXJ0O1x0XHQvKiBvZmZzZXQgb2YgZmRibG9jayBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2ZlbWFwO1x0XHQvKiBhdWZpcnN0ICsgZW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpbWFwO1x0XHQvKiBhdWZpcnN0ICsgaW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpZXh0b3A7XHRcdC8qIGF1Zmlyc3QgKyBpZXh0b3AgKi9cbi1cdF9fZnMzMlx0XHR2c19maXN0YXJ0O1x0XHQvKiBhdWZpcnN0ICsgaXN0YXJ0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZmJzdGFydDtcdFx0LyogYXVmaXJzdCArIGJzdGFydCAqL1xuLVx0X19mczMyXHRcdHZzX25pbmRpcjtcdFx0LyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWxlbjtcdFx0LyogbGVuZ3RoIG9mIEFVIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1aW1sZW47XHRcdC8qIGxlbmd0aCBvZiBpbWFwIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1ZW1sZW47XHRcdC8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1aWxlbjtcdFx0LyogbGVuZ3RoIG9mIGlsaXN0IGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1cGFkO1x0XHQvKiBsZW5ndGggb2YgcGFkIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1YmxvY2tzO1x0XHQvKiBkYXRhIGJsb2NrcyBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX21heHRpZXI7XHRcdC8qIGxvZyBiYXNlIDIgb2YgYXVibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19pbm9wYjtcdFx0LyogbnVtYmVyIG9mIGlub2RlcyBwZXIgYmxrICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2lub3BhdTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaW5vcGlsYjtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmRpcmlwYXU7XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2lhZGRybGVuO1x0XHQvKiBzaXplIG9mIGluZGlyZWN0IGFkZHIgZXh0LiAqL1xuLVx0X19mczMyXHRcdHZzX2JzaGlmdDtcdFx0LyogbG9nIGJhc2UgMiBvZiBic2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX2lub3NoaWZ0O1x0XHQvKiBsb2cgYmFzZSAyIG9mIGlub2JwICovXG4tXHRfX2ZzMzJcdFx0dnNfYm1hc2s7XHRcdC8qIH4oIGJzaXplIC0gMSApICovXG4tXHRfX2ZzMzJcdFx0dnNfYm9mZm1hc2s7XHRcdC8qIGJzaXplIC0gMSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbm9tYXNrO1x0XHQvKiBvbGRfaW5vcGlsYiAtIDEgKi9cbi1cdF9fZnMzMlx0XHR2c19jaGVja3N1bTtcdFx0LyogY2hlY2tzdW0gb2YgVjEgZGF0YSAqL1xuLVx0XG4tXHQvKlxuLVx0ICogVmVyc2lvbiAxLCB3cml0YWJsZVxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZnJlZTtcdFx0LyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfaWZyZWU7XHRcdC8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdHZzX2VmcmVlW1ZYRlNfTkVGUkVFXTtcdC8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX2ZsYWdzO1x0XHQvKiBmbGFncyA/IT8gKi9cbi1cdF9fdThcdFx0dnNfbW9kO1x0XHRcdC8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqL1xuLVx0X191OFx0XHR2c19jbGVhbjtcdFx0LyogY2xlYW4gRlMgKi9cbi1cdF9fZnMxNlx0XHRfX3VudXNlZDQ7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpcnN0bG9naWQ7XHRcdC8qIG1vdW50IHRpbWUgbG9nIElEICovXG4tXHRfX2ZzMzJcdFx0dnNfd3RpbWU7XHRcdC8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dnNfd3V0aW1lO1x0XHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHVzZWMgKi9cbi1cdF9fdThcdFx0dnNfZm5hbWVbNl07XHRcdC8qIEZTIG5hbWUgKi9cbi1cdF9fdThcdFx0dnNfZnBhY2tbNl07XHRcdC8qIEZTIHBhY2sgbmFtZSAqL1xuLVx0X19mczMyXHRcdHZzX2xvZ3ZlcnNpb247XHRcdC8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqL1xuLVx0X191MzJcdFx0X191bnVzZWQ1O1x0XHQvKiB1bnVzZWQgKi9cbi1cdFxuLVx0Lypcbi1cdCAqIFZlcnNpb24gMiwgUmVhZC1vbmx5XG4tXHQgKi9cbi1cdF9fZnMzMlx0XHR2c19vbHRleHRbMl07XHRcdC8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi9cbi1cdF9fZnMzMlx0XHR2c19vbHRzaXplO1x0XHQvKiBPTFQgZXh0ZW50IHNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19pYXVpbWxlbjtcdFx0Lyogc2l6ZSBvZiBpbm9kZSBtYXAgKi9cbi1cdF9fZnMzMlx0XHR2c19pYXVzaXplO1x0XHQvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19kaW5vc2l6ZTtcdFx0Lyogc2l6ZSBvZiBpbm9kZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9kbmlhZGRyO1x0XHQvKiBpbmRpciBsZXZlbHMgcGVyIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0dnNfY2hlY2tzdW0yO1x0XHQvKiBjaGVja3N1bSBvZiBWMiBSTyAqL1xuLVxuLVx0Lypcbi1cdCAqIEFjdHVhbGx5IG11Y2ggbW9yZS4uLlxuLVx0ICovXG4tfTtcbi1cbi1cbi0vKlxuLSAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19zYl9pbmZvIHtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCp2c2lfcmF3O1x0LyogcmF3IChvbiBkaXNrKSBzdXBlcmJsb2NrICovXG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdCp2c2lfYnA7XHQvKiBidWZmZXIgZm9yIHJhdyBzdXBlcmJsb2NrKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX2ZzaGlwO1x0LyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX2lsaXN0O1x0LyogaW5vZGUgbGlzdCBpbm9kZSAqL1xuLVx0c3RydWN0IGlub2RlXHRcdCp2c2lfc3RpbGlzdDtcdC8qIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbm9kZSAqL1xuLVx0dV9sb25nXHRcdFx0dnNpX2lleHQ7XHQvKiBpbml0aWFsIGlub2RlIGxpc3QgKi9cbi1cdGlub190XHRcdFx0dnNpX2ZzaGlubztcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXG4tXHRkYWRkcl90XHRcdFx0dnNpX29sdGV4dDtcdC8qIE9MVCBleHRlbnQgKi9cbi1cdGRhZGRyX3RcdFx0XHR2c2lfb2x0c2l6ZTtcdC8qIE9MVCBzaXplICovXG4tXHRlbnVtIHZ4ZnNfYnl0ZV9vcmRlclx0Ynl0ZV9vcmRlcjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdTE2IGZzMTZfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczE2IGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpYSk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdTMyIGZzMzJfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczMyIGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpYSk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdTY0IGZzNjRfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczY0IGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTY0X3RvX2NwdSgoX19mb3JjZSBfX2JlNjQpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpYSk7XG4tfVxuLVxuLS8qXG4tICogRmlsZSBtb2Rlcy4gIEZpbGUgdHlwZXMgYWJvdmUgMHhmMDAwIGFyZSB2eGZzIGludGVybmFsIG9ubHksIHRoZXkgc2hvdWxkXG4tICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0XG4tICogbmV2ZXIgaGF2ZSBvbmUgb2YgdGhlIHJlZ3VsYXIgZmlsZSB0eXBlIGJpdHMgc2V0LlxuLSAqL1xuLWVudW0gdnhmc19tb2RlIHtcbi1cdFZYRlNfSVNVSUQgPSAweDAwMDAwODAwLFx0Lyogc2V0dWlkICovXG4tXHRWWEZTX0lTR0lEID0gMHgwMDAwMDQwMCxcdC8qIHNldGdpZCAqL1xuLVx0VlhGU19JU1ZUWCA9IDB4MDAwMDAyMDAsXHQvKiBzdGlja3kgYml0ICovXG4tXHRWWEZTX0lSRUFEID0gMHgwMDAwMDEwMCxcdC8qIHJlYWQgKi9cbi1cdFZYRlNfSVdSSVRFID0gMHgwMDAwMDA4MCxcdC8qIHdyaXRlICovXG4tXHRWWEZTX0lFWEVDID0gMHgwMDAwMDA0MCxcdC8qIGV4ZWMgKi9cbi1cbi1cdFZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLFx0LyogTmFtZWQgcGlwZSAqL1xuLVx0VlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsXHQvKiBDaGFyYWN0ZXIgZGV2aWNlICovXG4tXHRWWEZTX0lGRElSID0gMHgwMDAwNDAwMCxcdC8qIERpcmVjdG9yeSAqL1xuLVx0VlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsXHQvKiBYZW5peCBkZXZpY2UgPz8gKi9cbi1cdFZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLFx0LyogQmxvY2sgZGV2aWNlICovXG4tXHRWWEZTX0lGUkVHID0gMHgwMDAwODAwMCxcdC8qIFJlZ3VsYXIgZmlsZSAqL1xuLVx0VlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsXHQvKiBDb21wcmVzc2VkIGZpbGUgPyE/ICovXG4tXHRWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCxcdC8qIFN5bWxpbmsgKi9cbi1cdFZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLFx0LyogU29ja2V0ICovXG4tXG4tXHQvKiBWeEZTIGludGVybmFsICovXG4tXHRWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCxcdC8qIEZpbGVzZXQgaGVhZGVyICovXG4tXHRWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCxcdC8qIElub2RlIGxpc3QgKi9cbi1cdFZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLFx0LyogSW5vZGUgYWxsb2NhdGlvbiB1bml0ICovXG4tXHRWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCxcdC8qIEN1cnJlbnQgdXNhZ2UgdGFibGUgKi9cbi1cdFZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLFx0LyogQXR0ci4gaW5vZGUgKi9cbi1cdFZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLFx0LyogTGluayBjb3VudCB0YWJsZSAqL1xuLVx0VlhGU19JRklBVCA9IDB4NzAwMDAwMDAsXHQvKiBJbmRpcmVjdCBhdHRyaWJ1dGUgZmlsZSAqL1xuLVx0VlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIHJlb3JnIGZpbGUgKi9cbi1cdFZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLFx0LyogQlNEIHF1b3RhIGZpbGUgKi9cbi1cdFZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLFx0LyogXCJQYXNzIHRocm91Z2hcIiBpbm9kZSAqL1xuLVx0VlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xuLVx0VlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsXHQvKiBPTFQgZmlsZSAqL1xuLVx0VlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsXHQvKiBMb2cgZmlsZSAqL1xuLVx0VlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cbi1cdFZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cbi1cdFZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xuLVx0VlhGU19JRkRFViA9IDB4MTcwMDAwMDAsXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cbi1cbi19O1xuLVxuLSNkZWZpbmVcdFZYRlNfVFlQRV9NQVNLXHRcdDB4ZmZmZmYwMDBcbi1cbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVx0KCgoaXApLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxuLSNkZWZpbmUgVlhGU19JU0ZJRk8oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxuLSNkZWZpbmUgVlhGU19JU0NIUih4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXG4tI2RlZmluZSBWWEZTX0lTRElSKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcbi0jZGVmaW5lIFZYRlNfSVNOQU0oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxuLSNkZWZpbmUgVlhGU19JU0JMSyh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXG4tI2RlZmluZSBWWEZTX0lTTE5LKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcbi0jZGVmaW5lIFZYRlNfSVNSRUcoeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxuLSNkZWZpbmUgVlhGU19JU0NNUCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXG4tI2RlZmluZSBWWEZTX0lTU09DKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcbi1cbi0jZGVmaW5lIFZYRlNfSVNGU0goeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKVxuLSNkZWZpbmUgVlhGU19JU0lMVCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpXG4tXG4tLypcbi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19PUkdfTk9ORVx0PSAwLFx0LyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqL1xuLVx0VlhGU19PUkdfRVhUNFx0PSAxLFx0LyogRXh0NCAqL1xuLVx0VlhGU19PUkdfSU1NRURcdD0gMixcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xuLVx0VlhGU19PUkdfVFlQRURcdD0gMyxcdC8qIFR5cGVkIGV4dGVudHMgKi9cbi19O1xuLVxuLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKVx0KChpcCktXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXG4tI2RlZmluZSBWWEZTX0lTTk9ORShpcClcdFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcbi0jZGVmaW5lIFZYRlNfSVNFWFQ0KGlwKVx0XHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxuLSNkZWZpbmUgVlhGU19JU0lNTUVEKGlwKVx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfSU1NRUQpXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19UWVBFRClcbi1cbi0vKlxuLSAqIEdldCBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmcm9tIFZGUyBzdXBlcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxuLVx0KChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktXHUwMDNlc19mc19pbmZvKVxuLVxuLSNlbmRpZiAvKiBfVlhGU19TVVBFUl9IXyAqL1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMWI4MjE2ZWIxZDkwYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDI3MiArMCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXN5c3RlbSB0byBkaXNrIGJsb2NrIG1hcHBpbmcuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwidnhmcy5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLXN0YXRpYyB2b2lkXG4tdnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApXG4te1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJ0eXBlPSVMdSBcIiwgdHlwLVx1MDAzZXZ0X2hkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpO1xuLVx0cHJpbnRrKFwib2Zmc2V0PSVMeCBcIiwgdHlwLVx1MDAzZXZ0X2hkciBcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcbi1cdHByaW50ayhcImJsb2NrPSV4IFwiLCB0eXAtXHUwMDNldnRfYmxvY2spO1xuLVx0cHJpbnRrKFwic2l6ZT0leFxcblwiLCB0eXAtXHUwMDNldnRfc2l6ZSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBibjpcdFx0bG9naWNhbCBibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxuLSAqICAgZXh0NC1zdHlsZSBleHRlbnRzICh3aGljaCBhcmUgbXVjaCBsaWtlIHRoZSB0cmFkaXRpb25hbCBVTklYXG4tICogICBpbm9kZSBvcmdhbmlzYXRpb24pLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBkYWRkcl90XG4tdnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibilcbi17XG4tXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtXHUwMDNlaV9zYjtcbi1cdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKHNiKTtcbi1cdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2luZHNpemUpO1xuLVx0aW50IGk7XG4tXG4tXHRpZiAoaW5kc2l6ZSBcdTAwM2Ugc2ItXHUwMDNlc19ibG9ja3NpemUpXG4tXHRcdGdvdG8gZmFpbF9zaXplO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OREFERFI7IGkrKykge1xuLVx0XHRzdHJ1Y3QgZGlyZWN0ICpkID0gdmlwLVx1MDAzZXZpaV9leHQ0LnZlNF9kaXJlY3QgKyBpO1xuLVx0XHRpZiAoYm4gXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiBibiBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZXNpemUpKVxuLVx0XHRcdHJldHVybiAoYm4gKyBmczMyX3RvX2NwdShzYmksIGQtXHUwMDNlZXh0ZW50KSk7XG4tXHRcdGJuIC09IGZzMzJfdG9fY3B1KHNiaSwgZC1cdTAwM2VzaXplKTtcbi1cdH1cbi1cbi1cdGlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6ZSAvIDQpKSA9PSAwKSB7XG4tXHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYnVmO1xuLVx0XHRkYWRkcl90XHRibm87XG4tXHRcdF9fZnMzMiAqaW5kaXI7XG4tXG4tXHRcdGJ1ZiA9IHNiX2JyZWFkKHNiLFxuLVx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdmlwLVx1MDAzZXZpaV9leHQ0LnZlNF9pbmRpclswXSkpO1xuLVx0XHRpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKVxuLVx0XHRcdGdvdG8gZmFpbF9idWY7XG4tXG4tXHRcdGluZGlyID0gKF9fZnMzMiAqKWJ1Zi1cdTAwM2ViX2RhdGE7XG4tXHRcdGJubyA9IGZzMzJfdG9fY3B1KHNiaSwgaW5kaXJbKGJuIC8gaW5kc2l6ZSkgJSAoaW5kc2l6ZSAqIGJuKV0pICtcbi1cdFx0XHQoYm4gJSBpbmRzaXplKTtcbi1cbi1cdFx0YnJlbHNlKGJ1Zik7XG4tXHRcdHJldHVybiBibm87XG4tXHR9IGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcIm5vIG1hdGNoaW5nIGluZGlyP1wiKTtcbi1cbi1cdHJldHVybiAwO1xuLVxuLWZhaWxfc2l6ZTpcbi1cdHByaW50ayhcInZ4ZnM6IGluZGlyZWN0IGV4dGVudCB0b28gYmlnIVxcblwiKTtcbi1mYWlsX2J1Zjpcbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfaW5kaXIgLSByZWN1cnNpb24gZm9yIHZ4ZnNfYm1hcF90eXBlZFxuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaW5kaXI6XHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XG4tICogQHNpemU6XHRzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaFxuLSAqIEBibG9jazpcdHBhcnRpYWxseSByZXN1bHQgZnJvbSBmdXJ0aGVyIHNlYXJjaGVzXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcF9pbmRpciByZWFkcyBhIFx1MDAyNnN0cnVjdCB2eGZzX3R5cGVkIGF0IEBpbmRpclxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTm90ZTpcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwID0gTlVMTDtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYik7IGkrKykge1xuLVx0XHRzdHJ1Y3Qgdnhmc190eXBlZFx0KnR5cDtcbi1cdFx0aW50NjRfdFx0XHRcdG9mZjtcbi1cbi1cdFx0YnAgPSBzYl9icmVhZChpcC1cdTAwM2VpX3NiLFxuLVx0XHRcdFx0aW5kaXIgKyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLVx1MDAzZWlfc2IpKSk7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHR0eXAgPSAoKHN0cnVjdCB2eGZzX3R5cGVkICopYnAtXHUwMDNlYl9kYXRhKSArXG4tXHRcdFx0KGkgJSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC1cdTAwM2VpX3NiKSk7XG4tXHRcdG9mZiA9IGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikgXHUwMDI2IFZYRlNfVFlQRURfT0ZGU0VUTUFTSztcbi1cbi1cdFx0aWYgKGJsb2NrIFx1MDAzYyBvZmYpIHtcbi1cdFx0XHRicmVsc2UoYnApO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXG4tXHRcdHN3aXRjaCAoKHVfaW50MzJfdCkoZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKSBcdTAwM2VcdTAwM2Vcbi1cdFx0XHRcdFZYRlNfVFlQRURfVFlQRVNISUZUKSkge1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6XG4tXHRcdFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9ibG9jayksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpLFxuLVx0XHRcdFx0XHRibG9jayAtIG9mZik7XG4tXHRcdFx0aWYgKHBibG9jayA9PSAtMilcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfREFUQTpcbi1cdFx0XHRpZiAoKGJsb2NrIC0gb2ZmKSBcdTAwM2U9IGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpKVxuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0cGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spICsgYmxvY2sgLSBvZmY7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OlxuLVx0XHRjYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7XG4tXHRcdFx0c3RydWN0IHZ4ZnNfdHlwZWRfZGV2NFx0KnR5cDQgPVxuLVx0XHRcdFx0KHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7XG4tXG4tXHRcdFx0cHJpbnRrKEtFUk5fSU5GTyBcIlxcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCIpO1xuLVx0XHRcdHByaW50ayhLRVJOX0lORk8gXCJibG9jazogJWxsdVxcdHNpemU6ICVsbGRcXHRkZXY6ICVkXFxuXCIsXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0fVxuLVx0XHRkZWZhdWx0OlxuLVx0XHRcdHByaW50ayhLRVJOX0VSUiBcIiVzOiVkIHZ0X2hkciAlbGx1XFxuXCIsIF9fZnVuY19fLFxuLVx0XHRcdFx0X19MSU5FX18sIGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikpO1xuLVx0XHRcdEJVRygpO1xuLVx0XHR9XG4tXHRcdGJyZWxzZShicCk7XG4tXHR9XG4tXG4tZmFpbDpcbi1cdHBibG9jayA9IDA7XG4tb3V0OlxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiAocGJsb2NrKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibWFwX3R5cGVkIC0gYm1hcCBmb3IgdHlwZWQgZXh0ZW50c1xuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaWJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBQZXJmb3JtcyB0aGUgYm1hcCBvcGVyYXRpb24gZm9yIHR5cGVkIGV4dGVudHMuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfdHlwZWQoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwID0gVlhGU19JTk8oaXApO1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRkYWRkcl90XHRcdFx0XHRwYmxvY2sgPSAwO1xuLVx0aW50XHRcdFx0XHRpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OVFlQRUQ7IGkrKykge1xuLVx0XHRzdHJ1Y3Qgdnhmc190eXBlZFx0KnR5cCA9IHZpcC1cdTAwM2V2aWlfb3JnLnR5cGVkICsgaTtcbi1cdFx0dTY0XHRcdFx0aGRyID0gZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKTtcbi1cdFx0aW50NjRfdFx0XHRcdG9mZiA9IChoZHIgXHUwMDI2IFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc190eXBkdW1wKHR5cCk7XG4tI2VuZGlmXG4tXHRcdGlmIChpYmxvY2sgXHUwMDNjIG9mZilcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0c3dpdGNoICgodTMyKShoZHIgXHUwMDNlXHUwMDNlIFZYRlNfVFlQRURfVFlQRVNISUZUKSkge1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6XG4tXHRcdFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9ibG9jayksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpLFxuLVx0XHRcdFx0XHRpYmxvY2sgLSBvZmYpO1xuLVx0XHRcdGlmIChwYmxvY2sgPT0gLTIpXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHRyZXR1cm4gKHBibG9jayk7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBOlxuLVx0XHRcdGlmICgoaWJsb2NrIC0gb2ZmKSBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfc2l6ZSkpXG4tXHRcdFx0XHRyZXR1cm4gKGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSArXG4tXHRcdFx0XHRcdFx0aWJsb2NrIC0gb2ZmKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwiXFxuXFxuVFlQRURfREVWNCBkZXRlY3RlZCFcXG5cIik7XG4tXHRcdFx0cHJpbnRrKEtFUk5fSU5GTyBcImJsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cIixcbi1cdFx0XHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVx1MDAzZXZkNF9ibG9jayksXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfc2l6ZSksXG4tXHRcdFx0ICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfZGV2KSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbi1cdFx0ZGVmYXVsdDpcbi1cdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbi1cdH1cbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXAxIC0gdnhmcy1pbnRlcm5hbCBibWFwIG9wZXJhdGlvblxuLSAqIEBpcDpcdFx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBpYmxvY2s6XHRcdGxvZ2ljYWwgYmxvY2tcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXG4tICogICBmb3Igdnhmcy1pbnRlcm5hbCBwdXJwb3Nlcy5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1kYWRkcl90XG4tdnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXG4tXHRpZiAoVlhGU19JU0VYVDQodmlwKSlcbi1cdFx0cmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spO1xuLVx0aWYgKFZYRlNfSVNUWVBFRCh2aXApKVxuLVx0XHRyZXR1cm4gdnhmc19ibWFwX3R5cGVkKGlwLCBpYmxvY2spO1xuLVx0aWYgKFZYRlNfSVNOT05FKHZpcCkpXG4tXHRcdGdvdG8gdW5zdXBwO1xuLVx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxuLVx0XHRnb3RvIHVuc3VwcDtcbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBpbm9kZSAlbGx1IGhhcyBubyB2YWxpZCBvcmd0eXBlICgleClcXG5cIixcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdEJVRygpO1xuLVxuLXVuc3VwcDpcbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBpbm9kZSAlbGx1IGhhcyBhbiB1bnN1cHBvcnRlZCBvcmd0eXBlICgleClcXG5cIixcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdHJldHVybiAwO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSw2OCArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19ESVJfSF9cbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci5cbi0gKlxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cbi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlc1xuLSAqIGEgaGFzaCBmb3Igc3BlZWRpbmcgdXAgZGlyZWN0b3J5IHNlYXJjaCAobG9va3VwKS5cbi0gKlxuLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGVcbi0gKiBMaW51eCBkcml2ZXIgZm9yIG5vdy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaXJibGsge1xuLVx0X19mczE2XHRcdGRfZnJlZTtcdFx0LyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqL1xuLVx0X19mczE2XHRcdGRfbmhhc2g7XHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xuLVx0X19mczE2XHRcdGRfaGFzaFtdO1x0LyogaGFzaCBjaGFpbiAqL1xuLX07XG4tXG4tLypcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcbi0gKlx0b2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tI2RlZmluZSBWWEZTX05BTUVMRU5cdDI1NlxuLVxuLS8qXG4tICogVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tc3RydWN0IHZ4ZnNfZGlyZWN0IHtcbi1cdF9fZnMzMlx0XHRkX2lubztcdFx0XHQvKiBpbm9kZSBudW1iZXIgKi9cbi1cdF9fZnMxNlx0XHRkX3JlY2xlbjtcdFx0LyogcmVjb3JkIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfbmFtZWxlbjtcdFx0LyogZF9uYW1lIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfaGFzaG5leHQ7XHRcdC8qIG5leHQgaGFzaCBlbnRyeSAqL1xuLVx0Y2hhclx0XHRkX25hbWVbVlhGU19OQU1FTEVOXTtcdC8qIG5hbWUgKi9cbi19O1xuLVxuLS8qXG4tICogVlhGU19ESVJQQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJ5IGJvdW5kYXJpZXMsIGlzIF9tdXN0XyBiZVxuLSAqXHRhIG11bHRpcGxlIG9mIGZvdXIuXG4tICogVlhGU19OQU1FTUlOIGlzIHRoZSBsZW5ndGggb2YgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIE5VTEwgZF9uYW1lLlxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcbi0gKlx0dXNhYmxlIGZvciBkaXJlY3Rvcnkgc2l6ZXMuXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcbi0gKlx0YSBkX25hbWUgd2l0aCBzaXplIGxlbi5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSUEFEXHRcdDRcbi0jZGVmaW5lIFZYRlNfTkFNRU1JTlx0XHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcbi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKVx0KChWWEZTX0RJUlBBRCArIChsZW4pIC0gMSkgXHUwMDI2IH4oVlhGU19ESVJQQUQgLTEpKVxuLSNkZWZpbmUgVlhGU19ESVJMRU4obGVuKVx0KFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICsgKGxlbikpKVxuLVxuLS8qXG4tICogVlhGU19ESVJCTEtPViBpcyB0aGUgb3ZlcmhlYWQgb2YgYSBzcGVjaWZpYyBkaXJibG9jay5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApXHRcXFxuLVx0KChzaXplb2Yoc2hvcnQpICogZnMxNl90b19jcHUoc2JpLCBkYnAtXHUwMDNlZF9uaGFzaCkpICsgNClcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaFxuKysrIC9kZXYvbnVsbFxuQEAgLTEsNDkgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfRVhURVJOX0hfXG4tI2RlZmluZSBfVlhGU19FWFRFUk5fSF9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBleHRlcm5hbCBwcm90b3R5cGVzLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yIGFsbCB2eGZzIGZ1bmN0aW9ucyB1c2VkXG4tICogb3V0c2lkZSB0aGVpciByZXNwZWN0aXZlIHNvdXJjZSBmaWxlcy5cbi0gKi9cbi1cbi1cbi1zdHJ1Y3Qga21lbV9jYWNoZTtcbi1zdHJ1Y3Qgc3VwZXJfYmxvY2s7XG4tc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbztcbi1zdHJ1Y3QgaW5vZGU7XG4tXG4tXG4tLyogdnhmc19ibWFwLmMgKi9cbi1leHRlcm4gZGFkZHJfdFx0XHRcdHZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICosIGxvbmcpO1xuLVxuLS8qIHZ4ZnNfZnNoZWFkLmMgKi9cbi1leHRlcm4gaW50XHRcdFx0dnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7XG4tXG4tLyogdnhmc19pbm9kZS5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzO1xuLWV4dGVybiB2b2lkXHRcdFx0dnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTtcbi1leHRlcm4gc3RydWN0IGlub2RlXHRcdCp2eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZywgaW5vX3QpO1xuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcdFx0KnZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVx0XHQqdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XG4tZXh0ZXJuIHZvaWRcdFx0XHR2eGZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqKTtcbi1cbi0vKiB2eGZzX2xvb2t1cC5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zXHR2eGZzX2Rpcl9pbm9kZV9vcHM7XG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnNcdHZ4ZnNfZGlyX29wZXJhdGlvbnM7XG4tXG4tLyogdnhmc19vbHQuYyAqL1xuLWV4dGVybiBpbnRcdFx0XHR2eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1X2xvbmcpO1xuLVxuLS8qIHZ4ZnNfc3Vici5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzO1xuLWV4dGVybiBzdHJ1Y3QgcGFnZSAqXHRcdHZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgdV9sb25nKTtcbi1leHRlcm4gdm9pZFx0XHRcdHZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKik7XG4tZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqXHR2eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqLCBpbnQpO1xuLVxuLSNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBlNmFiOGJkZjdhNmNhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwxNjYgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciByb3V0aW5lcy5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2lub2RlLmhcIlxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2ZzaGVhZC5oXCJcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLXN0YXRpYyB2b2lkXG4tdnhmc19kdW1wZnNoKHN0cnVjdCB2eGZzX2ZzaCAqZmhwKVxuLXtcbi1cdHByaW50ayhcIlxcblxcbmR1bXBpbmcgZmlsZXNldCBoZWFkZXI6XFxuXCIpO1xuLVx0cHJpbnRrKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblwiKTtcbi1cdHByaW50ayhcInZlcnNpb246ICV1XFxuXCIsIGZocC1cdTAwM2Vmc2hfdmVyc2lvbik7XG4tXHRwcmludGsoXCJmc2luZGV4OiAldVxcblwiLCBmaHAtXHUwMDNlZnNoX2ZzaW5kZXgpO1xuLVx0cHJpbnRrKFwiaWF1aW5vOiAldVxcdG5pbm9kZXM6JXVcXG5cIixcbi1cdFx0XHRmaHAtXHUwMDNlZnNoX2lhdWlubywgZmhwLVx1MDAzZWZzaF9uaW5vZGVzKTtcbi1cdHByaW50ayhcIm1heGlub2RlOiAldVxcdGxjdGlubzogJXVcXG5cIixcbi1cdFx0XHRmaHAtXHUwMDNlZnNoX21heGlub2RlLCBmaHAtXHUwMDNlZnNoX2xjdGlubyk7XG4tXHRwcmludGsoXCJuYXU6ICV1XFxuXCIsIGZocC1cdTAwM2Vmc2hfbmF1KTtcbi1cdHByaW50ayhcImlsaXN0aW5vWzBdOiAldVxcdGlsaXN0aW5vWzFdOiAldVxcblwiLFxuLVx0XHRcdGZocC1cdTAwM2Vmc2hfaWxpc3Rpbm9bMF0sIGZocC1cdTAwM2Vmc2hfaWxpc3Rpbm9bMV0pO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX2dldGZzaCAtIHJlYWQgZmlsZXNldCBoZWFkZXIgaW50byBtZW1vcnlcbi0gKiBAaXA6XHRcdHRoZSAoZmFrZSkgZmlsZXNldCBoZWFkZXIgaW5vZGVcbi0gKiBAd2hpY2g6XHQwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlclxuLSAqICAgZGVzY3JpYmVkIGJ5IEBpcCBpbnRvIG1lbW9yeS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICpcbi12eGZzX2dldGZzaChzdHJ1Y3QgaW5vZGUgKmlwLCBpbnQgd2hpY2gpXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHRcdCpicDtcbi1cbi1cdGJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpO1xuLVx0aWYgKGJwKSB7XG4tXHRcdHN0cnVjdCB2eGZzX2ZzaFx0XHQqZmhwO1xuLVxuLVx0XHRpZiAoIShmaHAgPSBrbWFsbG9jX29iaigqZmhwKSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdG1lbWNweShmaHAsIGJwLVx1MDAzZWJfZGF0YSwgc2l6ZW9mKCpmaHApKTtcbi1cbi1cdFx0cHV0X2JoKGJwKTtcbi1cdFx0cmV0dXJuIChmaHApO1xuLVx0fVxuLW91dDpcbi1cdGJyZWxzZShicCk7XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19yZWFkX2ZzaGVhZCAtIHJlYWQgdGhlIGZpbGVzZXQgaGVhZGVyc1xuLSAqIEBzYnA6XHRzdXBlcmJsb2NrIHRvIHdoaWNoIHRoZSBmaWxlc2V0IGJlbG9uZ3Ncbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX2ZzaGVhZCB3aWxsIGZpbGwgdGhlIGlub2RlIGFuZCBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW4gQHNiLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKC1FSU5WQUwpLlxuLSAqL1xuLWludFxuLXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqaW5mcCA9IFZYRlNfU0JJKHNicCk7XG4tXHRzdHJ1Y3Qgdnhmc19mc2hcdFx0XHQqcGZwLCAqc2ZwO1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwO1xuLVxuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLVx1MDAzZXZzaV9pZXh0LCBpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9mc2hpcCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2ggaW5vZGVcXG5cIik7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuLVxuLVx0dmlwID0gVlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aWYgKCFWWEZTX0lTRlNIKHZpcCkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxuXCIsXG4tXHRcdFx0XHR2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHByaW50ayhcInZ4ZnM6IGZzaCBpbm9kZSBkdW1wOlxcblwiKTtcbi1cdHZ4ZnNfZHVtcGkodmlwLCBpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLSNlbmRpZlxuLVxuLVx0c2ZwID0gdnhmc19nZXRmc2goaW5mcC1cdTAwM2V2c2lfZnNoaXAsIDApO1xuLVx0aWYgKCFzZnApIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxcblwiKTtcbi1cdFx0Z290byBvdXRfaXB1dF9mc2hpcDtcbi1cdH0gXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChzZnApO1xuLSNlbmRpZlxuLVxuLVx0cGZwID0gdnhmc19nZXRmc2goaW5mcC1cdTAwM2V2c2lfZnNoaXAsIDEpO1xuLVx0aWYgKCFwZnApIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxcblwiKTtcbi1cdFx0Z290byBvdXRfZnJlZV9zZnA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChwZnApO1xuLSNlbmRpZlxuLVxuLVx0aW5mcC1cdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsXG4tXHRcdFx0ZnMzMl90b19jcHUoaW5mcCwgc2ZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgc3RydWN0dXJhbCBsaXN0IGlub2RlXFxuXCIpO1xuLVx0XHRnb3RvIG91dF9mcmVlX3BmcDtcbi1cdH1cbi1cdGlmICghVlhGU19JU0lMVChWWEZTX0lOTyhpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogc3RydWN0dXJhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxcblwiLFxuLVx0XHRcdFx0VlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfc3RpbGlzdCktXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfc3RpbGlzdDtcbi1cdH1cbi1cbi1cdGluZnAtXHUwMDNldnNpX2lsaXN0ID0gdnhmc19zdGlnZXQoc2JwLCBmczMyX3RvX2NwdShpbmZwLCBwZnAtXHUwMDNlZnNoX2lsaXN0aW5vWzBdKSk7XG4tXHRpZiAoIWluZnAtXHUwMDNldnNpX2lsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgaW5vZGUgbGlzdCBpbm9kZVxcblwiKTtcbi1cdFx0Z290byBvdXRfaXB1dF9zdGlsaXN0O1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXG5cIixcbi1cdFx0XHRcdFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KS1cdTAwM2V2aWlfbW9kZSBcdTAwMjYgVlhGU19UWVBFX01BU0spO1xuLVx0XHRnb3RvIG91dF9pcHV0X2lsaXN0O1xuLVx0fVxuLVxuLVx0a2ZyZWUocGZwKTtcbi1cdGtmcmVlKHNmcCk7XG4tXHRyZXR1cm4gMDtcbi1cbi0gb3V0X2lwdXRfaWxpc3Q6XG4tIFx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tIG91dF9pcHV0X3N0aWxpc3Q6XG4tIFx0aXB1dChpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KTtcbi0gb3V0X2ZyZWVfcGZwOlxuLVx0a2ZyZWUocGZwKTtcbi0gb3V0X2ZyZWVfc2ZwOlxuLSBcdGtmcmVlKHNmcCk7XG4tIG91dF9pcHV0X2ZzaGlwOlxuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9mc2hpcCk7XG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZGZkMjE0NzU5OWM0OS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxuKysrIC9kZXYvbnVsbFxuQEAgLTEsNDMgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0ZTSEVBRF9IX1xuLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTXG4tICogZmlsZXNldCBoZWFkZXIuXG4tICovXG4tXG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19mc2gge1xuLVx0X19mczMyXHRcdGZzaF92ZXJzaW9uO1x0XHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2ZzaW5kZXg7XHRcdC8qIGZpbGVzZXQgaW5kZXggKi9cbi1cdF9fZnMzMlx0XHRmc2hfdGltZTtcdFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cbi1cdF9fZnMzMlx0XHRmc2hfdXRpbWU7XHRcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdGZzaF9leHRvcDtcdFx0LyogZXh0b3AgZmxhZ3MgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbmlub2RlcztcdFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdGZzaF9uYXU7XHRcdC8qIG51bWJlciBvZiBJQVVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX29sZF9pbGVzaXplO1x0Lyogb2xkIHNpemUgb2YgaWxpc3QgKi9cbi1cdF9fZnMzMlx0XHRmc2hfZGZsYWdzO1x0XHQvKiBmbGFncyAqL1xuLVx0X19mczMyXHRcdGZzaF9xdW90YTtcdFx0LyogcXVvdGEgbGltaXQgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbWF4aW5vZGU7XHRcdC8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lhdWlubztcdFx0LyogSUFVIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lsaXN0aW5vWzJdO1x0LyogaWxpc3QgaW5vZGVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2xjdGlubztcdFx0LyogbGluayBjb3VudCB0YWJsZSBpbm9kZSAqL1xuLVxuLVx0Lypcbi1cdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcbi1cdCAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZFxuLVx0ICogIGIpIGRpZmZlciBhIGxvdCBpbiBkaWZmZXJlbnQgdnhmcyB2ZXJzaW9ucy9wb3J0c1xuLVx0ICovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsNTMgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cHBvcnQgZm9yICdpbW1lZCcgaW5vZGVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tXG4tLyoqXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXG4tICogQGZwOlx0XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ltbWVkX3JlYWRfZm9saW8gcmVhZHMgYSBwYXJ0IG9mIHRoZSBpbW1lZCBhcmVhIG9mIHRoZVxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKlxuLSAqIExvY2tpbmcgc3RhdHVzOlxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2Vob3N0KTtcbi1cdHZvaWQgKnNyYyA9IHZpcC1cdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQgKyBmb2xpb19wb3MoZm9saW8pO1xuLVx0dW5zaWduZWQgbG9uZyBpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZm9saW9fbnJfcGFnZXMoZm9saW8pOyBpKyspIHtcbi1cdFx0bWVtY3B5X3RvX3BhZ2UoZm9saW9fcGFnZShmb2xpbywgaSksIDAsIHNyYywgUEFHRV9TSVpFKTtcbi1cdFx0c3JjICs9IFBBR0VfU0laRTtcbi1cdH1cbi1cbi1cdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuLVx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKlxuLSAqIEFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW1tZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuLSAqL1xuLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzID0ge1xuLVx0LnJlYWRfZm9saW8gPVx0dnhmc19pbW1lZF9yZWFkX2ZvbGlvLFxuLX07XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIxZmM5NGI5ODIwOWYuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMzE0ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgcm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L25hbWVpLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2lub2RlLmhcIlxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi0vKlxuLSAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuXG4tICovXG4tdm9pZFxuLXZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXG4te1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJcXG5cXG5cIik7XG4tXHRpZiAoaW5vKVxuLVx0XHRwcmludGsoS0VSTl9ERUJVRyBcImR1bXBpbmcgdnhmcyBpbm9kZSAlbGRcXG5cIiwgaW5vKTtcbi1cdGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCJkdW1waW5nIHVua25vd24gdnhmcyBpbm9kZVxcblwiKTtcbi1cbi1cdHByaW50ayhLRVJOX0RFQlVHIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCIpO1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJtb2RlIGlzICV4XFxuXCIsIHZpcC1cdTAwM2V2aWlfbW9kZSk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcIm5saW5rOiV1LCB1aWQ6JXUsIGdpZDoldVxcblwiLFxuLVx0XHRcdHZpcC1cdTAwM2V2aWlfbmxpbmssIHZpcC1cdTAwM2V2aWlfdWlkLCB2aXAtXHUwMDNldmlpX2dpZCk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcInNpemU6JUx4LCBibG9ja3M6JXVcXG5cIixcbi1cdFx0XHR2aXAtXHUwMDNldmlpX3NpemUsIHZpcC1cdTAwM2V2aWlfYmxvY2tzKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwib3JndHlwZToldVxcblwiLCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX3RyYW5zbW9kIC0gbW9kZSBmb3IgYSBWeEZTIGlub2RlXG4tICogQHZpcDpcdFZ4RlMgaW5vZGVcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cbi0gKiAgVnhGUyBpbm9kZSBzdHJ1Y3R1cmUuXG4tICovXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxuLXZ4ZnNfdHJhbnNtb2Qoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKVxuLXtcbi1cdHVtb2RlX3RcdFx0XHRyZXQgPSB2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcbi1cbi1cdGlmIChWWEZTX0lTRklGTyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRklGTztcbi1cdGlmIChWWEZTX0lTQ0hSKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGQ0hSO1xuLVx0aWYgKFZYRlNfSVNESVIodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZESVI7XG4tXHRpZiAoVlhGU19JU0JMSyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRkJMSztcbi1cdGlmIChWWEZTX0lTTE5LKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGTE5LO1xuLVx0aWYgKFZYRlNfSVNSRUcodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZSRUc7XG4tXHRpZiAoVlhGU19JU1NPQyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRlNPQ0s7XG4tXG4tXHRyZXR1cm4gKHJldCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXG4te1xuLVx0c3RydWN0IGlub2RlICppbm9kZSA9IFx1MDAyNnZpcC1cdTAwM2V2ZnNfaW5vZGU7XG4tXG4tXHR2aXAtXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfbW9kZSk7XG4tXHR2aXAtXHUwMDNldmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX25saW5rKTtcbi1cdHZpcC1cdTAwM2V2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3VpZCk7XG4tXHR2aXAtXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9naWQpO1xuLVx0dmlwLVx1MDAzZXZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3NpemUpO1xuLVx0dmlwLVx1MDAzZXZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9vcmd0eXBlID0gZGlwLVx1MDAzZXZkaV9vcmd0eXBlO1xuLVxuLVx0dmlwLVx1MDAzZXZpaV9ibG9ja3MgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfYmxvY2tzKTtcbi1cdHZpcC1cdTAwM2V2aWlfZ2VuID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX2dlbik7XG4tXG4tXHRpZiAoVlhGU19JU0RJUih2aXApKVxuLVx0XHR2aXAtXHUwMDNldmlpX2RvdGRvdCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9kb3Rkb3QpO1xuLVx0ZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSBcdTAwMjZcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcbi1cdFx0dmlwLVx1MDAzZXZpaV9yZGV2ID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3JkZXYpO1xuLVxuLVx0LyogZG9uJ3QgZW5kaWFuIHN3YXAgdGhlIGZpZWxkcyB0aGF0IGRpZmZlciBieSBvcmd0eXBlICovXG4tXHRtZW1jcHkoXHUwMDI2dmlwLVx1MDAzZXZpaV9vcmcsIFx1MDAyNmRpcC1cdTAwM2V2ZGlfb3JnLCBzaXplb2YodmlwLVx1MDAzZXZpaV9vcmcpKTtcbi1cbi1cdGlub2RlLVx1MDAzZWlfbW9kZSA9IHZ4ZnNfdHJhbnNtb2QodmlwKTtcbi1cdGlfdWlkX3dyaXRlKGlub2RlLCAodWlkX3QpdmlwLVx1MDAzZXZpaV91aWQpO1xuLVx0aV9naWRfd3JpdGUoaW5vZGUsIChnaWRfdCl2aXAtXHUwMDNldmlpX2dpZCk7XG4tXG4tXHRzZXRfbmxpbmsoaW5vZGUsIHZpcC1cdTAwM2V2aWlfbmxpbmspO1xuLVx0aW5vZGUtXHUwMDNlaV9zaXplID0gdmlwLVx1MDAzZXZpaV9zaXplO1xuLVxuLVx0aW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtXHUwMDNldmlpX2F0aW1lLCAwKTtcbi1cdGlub2RlX3NldF9jdGltZShpbm9kZSwgdmlwLVx1MDAzZXZpaV9jdGltZSwgMCk7XG4tXHRpbm9kZV9zZXRfbXRpbWUoaW5vZGUsIHZpcC1cdTAwM2V2aWlfbXRpbWUsIDApO1xuLVxuLVx0aW5vZGUtXHUwMDNlaV9ibG9ja3MgPSB2aXAtXHUwMDNldmlpX2Jsb2Nrcztcbi1cdGlub2RlLVx1MDAzZWlfZ2VuZXJhdGlvbiA9IHZpcC1cdTAwM2V2aWlfZ2VuO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2Jsa2lnZXQgLSBmaW5kIGlub2RlIGJhc2VkIG9uIGV4dGVudCAjXG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW0gd2Ugc2VhcmNoIGluXG4tICogQGV4dGVudDpcdG51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaFxuLSAqIEBpbm86XHRpbm9kZSBudW1iZXIgdG8gc2VhcmNoXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19ibGtpZ2V0IHNlYXJjaGVzIGlub2RlIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5XG4tICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50LlxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBWeEZTIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICpcbi0gKiBOT1RFOlxuLSAqICBXaGlsZSBfX3Z4ZnNfaWdldCB1c2VzIHRoZSBwYWdlY2FjaGUgdnhmc19ibGtpZ2V0IHVzZXMgdGhlXG4tICogIGJ1ZmZlcmNhY2hlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGVcbi0gKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50LlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgZXh0ZW50LCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHRcdCpicDtcbi1cdHN0cnVjdCBpbm9kZVx0XHRcdCppbm9kZTtcbi1cdHVfbG9uZ1x0XHRcdFx0YmxvY2ssIG9mZnNldDtcbi1cbi1cdGlub2RlID0gbmV3X2lub2RlKHNicCk7XG4tXHRpZiAoIWlub2RlKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdGlub2RlLVx1MDAzZWlfaW5vID0gZ2V0X25leHRfaW5vKCk7XG4tXG4tXHRibG9jayA9IGV4dGVudCArICgoaW5vICogVlhGU19JU0laRSkgLyBzYnAtXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0b2Zmc2V0ID0gKChpbm8gJSAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRSk7XG4tXHRicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spO1xuLVxuLVx0aWYgKGJwIFx1MDAyNlx1MDAyNiBidWZmZXJfbWFwcGVkKGJwKSkge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHQqdmlwID0gVlhGU19JTk8oaW5vZGUpO1xuLVx0XHRzdHJ1Y3Qgdnhmc19kaW5vZGVcdCpkaXA7XG4tXG4tXHRcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoYnAtXHUwMDNlYl9kYXRhICsgb2Zmc2V0KTtcbi1cdFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xuLVx0XHR2aXAtXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcbi0jZW5kaWZcbi1cdFx0YnJlbHNlKGJwKTtcbi1cdFx0cmV0dXJuIGlub2RlO1xuLVx0fVxuLVxuLVx0cHJpbnRrKEtFUk5fV0FSTklORyBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxcblwiLCBibG9jayk7XG4tXHRicmVsc2UoYnApO1xuLVx0aXB1dChpbm9kZSk7XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tLyoqXG4tICogX192eGZzX2lnZXQgLSBnZW5lcmljIGZpbmQgaW5vZGUgZmFjaWxpdHlcbi0gKiBAaWxpc3RwOlx0XHRpbm9kZSBsaXN0XG4tICogQHZpcDpcdFx0VnhGUyBpbm9kZSB0byBmaWxsIGluXG4tICogQGlubzpcdFx0aW5vZGUgbnVtYmVyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgU2VhcmNoIHRoZSBmb3IgaW5vZGUgbnVtYmVyIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW1cbi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYW4gZXJyb3IgY29kZS5cbi0gKi9cbi1zdGF0aWMgaW50XG4tX192eGZzX2lnZXQoc3RydWN0IGlub2RlICppbGlzdHAsIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBwYWdlXHRcdFx0KnBwO1xuLVx0dV9sb25nXHRcdFx0XHRvZmZzZXQ7XG4tXG4tXHRvZmZzZXQgPSAoaW5vICUgKFBBR0VfU0laRSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkU7XG4tXHRwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLVx1MDAzZWlfbWFwcGluZywgaW5vICogVlhGU19JU0laRSAvIFBBR0VfU0laRSk7XG4tXG4tXHRpZiAoIUlTX0VSUihwcCkpIHtcbi1cdFx0c3RydWN0IHZ4ZnNfZGlub2RlXHQqZGlwO1xuLVx0XHRjYWRkcl90XHRcdFx0a2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7XG4tXG4tXHRcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpO1xuLVx0XHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXHUwMDNlaV9zYiksIHZpcCwgZGlwKTtcbi1cdFx0dmlwLVx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc19kdW1waSh2aXAsIGlubyk7XG4tI2VuZGlmXG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBlcnJvciBvbiBwYWdlIDB4JXAgZm9yIGlub2RlICVsZFxcblwiLFxuLVx0XHRwcCwgKHVuc2lnbmVkIGxvbmcpaW5vKTtcbi1cdHJldHVybiBQVFJfRVJSKHBwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3Rcbi0gKiBAc2JwOlx0VkZTIHN1cGVyYmxvY2tcbi0gKiBAaW5vOlx0aW5vZGUgI1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIEZpbmQgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicCB1c2luZ1xuLSAqICB0aGUgc3RydWN0dXJhbCBpbm9kZSBsaXN0LlxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcbi17XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aW5vZGUgPSBuZXdfaW5vZGUoc2JwKTtcbi1cdGlmICghaW5vZGUpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0aW5vZGUtXHUwMDNlaV9pbm8gPSBnZXRfbmV4dF9pbm8oKTtcbi1cbi1cdGVycm9yID0gX192eGZzX2lnZXQoVlhGU19TQkkoc2JwKS1cdTAwM2V2c2lfc3RpbGlzdCwgVlhGU19JTk8oaW5vZGUpLCBpbm8pO1xuLVx0aWYgKGVycm9yKSB7XG4tXHRcdGlwdXQoaW5vZGUpO1xuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdH1cbi1cbi1cdHJldHVybiBpbm9kZTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlXG4tICogQHNicDpcdHRoZSBzdXBlcmJsb2NrIHRvIGdldCB0aGUgaW5vZGUgZm9yXG4tICogQGlubzpcdHRoZSBudW1iZXIgb2YgdGhlIGlub2RlIHRvIGdldFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIHZ4ZnNfcmVhZF9pbm9kZSBjcmVhdGVzIGFuIGlub2RlLCByZWFkcyB0aGUgZGlzayBpbm9kZSBmb3IgQGlubyBhbmQgZmlsbHNcbi0gKiAgaW4gYWxsIHJlbGV2YW50IGZpZWxkcyBpbiB0aGUgbmV3IGlub2RlLlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwO1xuLVx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uc1x0KmFvcHM7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlwO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aXAgPSBpZ2V0X2xvY2tlZChzYnAsIGlubyk7XG4tXHRpZiAoIWlwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbi1cdGlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgXHUwMDI2IElfTkVXKSlcbi1cdFx0cmV0dXJuIGlwO1xuLVxuLVx0dmlwID0gVlhGU19JTk8oaXApO1xuLVx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVx1MDAzZXZzaV9pbGlzdCwgdmlwLCBpbm8pO1xuLVx0aWYgKGVycm9yKSB7XG4tXHRcdGlnZXRfZmFpbGVkKGlwKTtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xuLVx0fVxuLVxuLVx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxuLVx0XHRhb3BzID0gXHUwMDI2dnhmc19pbW1lZF9hb3BzO1xuLVx0ZWxzZVxuLVx0XHRhb3BzID0gXHUwMDI2dnhmc19hb3BzO1xuLVxuLVx0aWYgKFNfSVNSRUcoaXAtXHUwMDNlaV9tb2RlKSkge1xuLVx0XHRpcC1cdTAwM2VpX2ZvcCA9IFx1MDAyNmdlbmVyaWNfcm9fZm9wcztcbi1cdFx0aXAtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gYW9wcztcbi1cdH0gZWxzZSBpZiAoU19JU0RJUihpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlwLVx1MDAzZWlfb3AgPSBcdTAwMjZ2eGZzX2Rpcl9pbm9kZV9vcHM7XG4tXHRcdGlwLVx1MDAzZWlfZm9wID0gXHUwMDI2dnhmc19kaXJfb3BlcmF0aW9ucztcbi1cdFx0aXAtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gYW9wcztcbi1cdH0gZWxzZSBpZiAoU19JU0xOSyhpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlmICghVlhGU19JU0lNTUVEKHZpcCkpIHtcbi1cdFx0XHRpcC1cdTAwM2VpX29wID0gXHUwMDI2cGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7XG4tXHRcdFx0aW5vZGVfbm9oaWdobWVtKGlwKTtcbi1cdFx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0aXAtXHUwMDNlaV9vcCA9IFx1MDAyNnNpbXBsZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7XG4tXHRcdFx0aXAtXHUwMDNlaV9saW5rID0gdmlwLVx1MDAzZXZpaV9pbW1lZC52aV9pbW1lZDtcbi1cdFx0XHRuZF90ZXJtaW5hdGVfbGluayhpcC1cdTAwM2VpX2xpbmssIGlwLVx1MDAzZWlfc2l6ZSxcbi1cdFx0XHRcdFx0ICBzaXplb2YodmlwLVx1MDAzZXZpaV9pbW1lZC52aV9pbW1lZCkgLSAxKTtcbi1cdFx0fVxuLVx0fSBlbHNlXG4tXHRcdGluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtXHUwMDNlaV9tb2RlLCBvbGRfZGVjb2RlX2Rldih2aXAtXHUwMDNldmlpX3JkZXYpKTtcbi1cbi1cdHVubG9ja19uZXdfaW5vZGUoaXApO1xuLVx0cmV0dXJuIGlwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2V2aWN0X2lub2RlIC0gcmVtb3ZlIGlub2RlIGZyb20gbWFpbiBtZW1vcnlcbi0gKiBAaXA6XHRcdGlub2RlIHRvIGRpc2NhcmQuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19ldmljdF9pbm9kZSgpIGlzIGNhbGxlZCBvbiB0aGUgZmluYWwgaXB1dCBhbmQgZnJlZXMgdGhlIHByaXZhdGVcbi0gKiAgaW5vZGUgYXJlYS5cbi0gKi9cbi12b2lkXG4tdnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlwKVxuLXtcbi1cdHRydW5jYXRlX2lub2RlX3BhZ2VzX2ZpbmFsKFx1MDAyNmlwLVx1MDAzZWlfZGF0YSk7XG4tXHRjbGVhcl9pbm9kZShpcCk7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxZTllMTM4ZDJiMzM4Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmhcbisrKyAvZGV2L251bGxcbkBAIC0xLDE2OSArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cbi0jZGVmaW5lIF9WWEZTX0lOT0RFX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uXG4tICovXG4tXG4tXG4tI2RlZmluZSBWWEZTX0lTSVpFXHRcdDB4MTAwXHRcdC8qIElub2RlIHNpemUgKi9cbi1cbi0jZGVmaW5lIFZYRlNfTkRBRERSXHRcdDEwXHRcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cbi0jZGVmaW5lIFZYRlNfTklBRERSXHRcdDJcdFx0LyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05JTU1FRFx0XHQ5Nlx0XHQvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05UWVBFRFx0XHQ2XHRcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0tcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXG4tI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLXHQoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKVxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcdDU2XG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXG4tXHQoKHNicCktXHUwMDNlc19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKVxuLVxuLS8qXG4tICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19UWVBFRF9JTkRJUkVDVFx0XHQ9IDEsXG4tXHRWWEZTX1RZUEVEX0RBVEFcdFx0XHQ9IDIsXG4tXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcdD0gMyxcbi1cdFZYRlNfVFlQRURfREFUQV9ERVY0XHRcdD0gNCxcbi19O1xuLVxuLS8qXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxuLSAqL1xuLXN0cnVjdCB2eGZzX2ltbWVkIHtcbi1cdF9fdThcdFx0XHR2aV9pbW1lZFtWWEZTX05JTU1FRF07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc19leHQ0IHtcbi1cdF9fZnMzMlx0XHRcdHZlNF9zcGFyZTtcdFx0LyogPz8gKi9cbi1cdF9fZnMzMlx0XHRcdHZlNF9pbmRzaXplO1x0XHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xuLVx0X19mczMyXHRcdFx0dmU0X2luZGlyW1ZYRlNfTklBRERSXTtcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cbi1cdHN0cnVjdCBkaXJlY3Qge1x0XHRcdFx0XHQvKiBEaXJlY3QgZXh0ZW50cyAqL1xuLVx0XHRfX2ZzMzJcdFx0ZXh0ZW50O1x0XHRcdC8qIEV4dGVudCBudW1iZXIgKi9cbi1cdFx0X19mczMyXHRcdHNpemU7XHRcdFx0LyogU2l6ZSBvZiBleHRlbnQgKi9cbi1cdH0gdmU0X2RpcmVjdFtWWEZTX05EQUREUl07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZCB7XG4tXHRfX2ZzNjRcdFx0dnRfaGRyO1x0XHQvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqL1xuLVx0X19mczMyXHRcdHZ0X2Jsb2NrO1x0LyogRXh0ZW50IGJsb2NrICovXG4tXHRfX2ZzMzJcdFx0dnRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHtcbi1cdF9fZnM2NFx0XHR2ZDRfaGRyO1x0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfYmxvY2s7XHQvKiBFeHRlbnQgYmxvY2sgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dmQ0X2RldjtcdC8qIERldmljZSBJRCAqL1xuLVx0X191OFx0XHRfX3BhZDE7XG4tfTtcbi1cbi0vKlxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaW5vZGUge1xuLVx0X19mczMyXHRcdHZkaV9tb2RlO1xuLVx0X19mczMyXHRcdHZkaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfdWlkO1x0LyogVUlEICovXG4tXHRfX2ZzMzJcdFx0dmRpX2dpZDtcdC8qIEdJRCAqL1xuLVx0X19mczY0XHRcdHZkaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdGltZTtcdC8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdXRpbWU7XHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9tdXRpbWU7XHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9jdGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2ZGlfYWZsYWdzO1x0LyogQWxsb2NhdGlvbiBmbGFncyAqL1xuLVx0X191OFx0XHR2ZGlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHRfX2ZzMTZcdFx0dmRpX2VvcGZsYWdzO1xuLVx0X19mczMyXHRcdHZkaV9lb3BkYXRhO1xuLVx0dW5pb24ge1xuLVx0XHRfX2ZzMzJcdFx0XHRyZGV2O1xuLVx0XHRfX2ZzMzJcdFx0XHRkb3Rkb3Q7XG4tXHRcdHN0cnVjdCB7XG4tXHRcdFx0X191MzJcdFx0cmVzZXJ2ZWQ7XG4tXHRcdFx0X19mczMyXHRcdGZpeGV4dHNpemU7XG4tXHRcdH0gaV9yZWd1bGFyO1xuLVx0XHRzdHJ1Y3Qge1xuLVx0XHRcdF9fZnMzMlx0XHRtYXRjaGlubztcbi1cdFx0XHRfX2ZzMzJcdFx0ZnNldGluZGV4O1xuLVx0XHR9IGlfdnhzcGVjO1xuLVx0XHRfX3U2NFx0XHRcdGFsaWduO1xuLVx0fSB2ZGlfZnRhcmVhO1xuLVx0X19mczMyXHRcdHZkaV9ibG9ja3M7XHQvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0X19mczY0XHRcdHZkaV92ZXJzaW9uO1x0LyogVmVyc2lvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZkaV9vcmc7XG4tXHRfX2ZzMzJcdFx0dmRpX2lhdHRyaW5vO1xuLX07XG4tXG4tI2RlZmluZSB2ZGlfcmRldlx0dmRpX2Z0YXJlYS5yZGV2XG4tI2RlZmluZSB2ZGlfZG90ZG90XHR2ZGlfZnRhcmVhLmRvdGRvdFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcdHZkaV9mdGFyZWEucmVndWxhci5maXhleHRzaXplXG4tI2RlZmluZSB2ZGlfbWF0Y2hpbm9cdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXG4tI2RlZmluZSB2ZGlfZnNldGluZGV4XHR2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXhcbi1cbi0jZGVmaW5lIHZkaV9pbW1lZFx0dmRpX29yZy5pbW1lZFxuLSNkZWZpbmUgdmRpX2V4dDRcdHZkaV9vcmcuZXh0NFxuLSNkZWZpbmUgdmRpX3R5cGVkXHR2ZGlfb3JnLnR5cGVkXG4tXG4tXG4tLypcbi0gKiBUaGUgaW5vZGUgYXMgcmVwcmVzZW50ZWQgaW4gdGhlIG1haW4gbWVtb3J5LlxuLSAqL1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xuLVx0c3RydWN0IGlub2RlXHR2ZnNfaW5vZGU7XG4tXG4tXHRfX3UzMlx0XHR2aWlfbW9kZTtcbi1cdF9fdTMyXHRcdHZpaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fdTMyXHRcdHZpaV91aWQ7XHQvKiBVSUQgKi9cbi1cdF9fdTMyXHRcdHZpaV9naWQ7XHQvKiBHSUQgKi9cbi1cdF9fdTY0XHRcdHZpaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X191MzJcdFx0dmlpX2F0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXG4tXHRfX3UzMlx0XHR2aWlfYXV0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqL1xuLVx0X191MzJcdFx0dmlpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX211dGltZTtcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXG4tXHRfX3UzMlx0XHR2aWlfY3RpbWU7XHQvKiBDcmVhdGUgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2aWlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHR1bmlvbiB7XG4tXHRcdF9fdTMyXHRcdFx0cmRldjtcbi1cdFx0X191MzJcdFx0XHRkb3Rkb3Q7XG4tXHR9IHZpaV9mdGFyZWE7XG4tXHRfX3UzMlx0XHR2aWlfYmxvY2tzO1x0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXG4tXHRfX3UzMlx0XHR2aWlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZpaV9vcmc7XG4tfTtcbi1cbi0jZGVmaW5lIHZpaV9yZGV2XHR2aWlfZnRhcmVhLnJkZXZcbi0jZGVmaW5lIHZpaV9kb3Rkb3RcdHZpaV9mdGFyZWEuZG90ZG90XG4tXG4tI2RlZmluZSB2aWlfaW1tZWRcdHZpaV9vcmcuaW1tZWRcbi0jZGVmaW5lIHZpaV9leHQ0XHR2aWlfb3JnLmV4dDRcbi0jZGVmaW5lIHZpaV90eXBlZFx0dmlpX29yZy50eXBlZFxuLVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xuLX1cbi1cbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNzMgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBsb29rdXAgYW5kIG90aGVyIGRpcmVjdG9yeSByZWxhdGVkIGNvZGUuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGVsb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2Rpci5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi0vKlxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS1cdTAwM2VzX2Jsb2Nrc2l6ZSkpXG4tXG4tXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlx0dnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTtcbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7XG4tXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xuLVx0Lmxvb2t1cCA9XHRcdHZ4ZnNfbG9va3VwLFxuLX07XG4tXG4tY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0ge1xuLVx0Lmxsc2VlayA9XHRcdGdlbmVyaWNfZmlsZV9sbHNlZWssXG4tXHQucmVhZCA9XHRcdFx0Z2VuZXJpY19yZWFkX2Rpcixcbi1cdC5pdGVyYXRlX3NoYXJlZCA9XHR2eGZzX3JlYWRkaXIsXG4tXHQuc2V0bGVhc2UgPVx0XHRnZW5lcmljX3NldGxlYXNlLFxuLX07XG4tXG4tXG4tLyoqXG4tICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeVxuLSAqIEBpcDpcdFx0ZGlyZWN0b3J5IGlub2RlXG4tICogQGRwOlx0XHRkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdFxuLSAqIEBwcHA6XHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcdTAwMjZzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5XG4tICogICBjYWNoZSBlbnRyeSBAZHAuICBAcHBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBhZ2UgdGhlIHJldHVyblxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19kaXJlY3QgKlxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXG4te1xuLVx0dV9sb25nIGJzaXplID0gaXAtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNvbnN0IGNoYXIgKm5hbWUgPSBkcC1cdTAwM2VkX25hbWUubmFtZTtcbi1cdGludCBuYW1lbGVuID0gZHAtXHUwMDNlZF9uYW1lLmxlbjtcbi1cdGxvZmZfdCBsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXHUwMDNlaV9zaXplKTtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGVfZXhpdCA9IE5VTEw7XG4tXHRsb2ZmX3QgcG9zID0gMDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLVx1MDAzZWlfc2IpO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICsgKHBvcyBcdTAwMjYgflBBR0VfTUFTSykpO1xuLVx0XHRcdFx0aW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7XG4tXG4tXHRcdFx0XHRwb3MgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XG4tXG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX3JlY2xlbikge1xuLVx0XHRcdFx0cG9zICs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9pbm8pXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfbmFtZWxlbikpXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRpZiAoIW1lbWNtcChuYW1lLCBkZS1cdTAwM2VkX25hbWUsIG5hbWVsZW4pKSB7XG4tXHRcdFx0XHQqcHBwID0gcHA7XG4tXHRcdFx0XHRkZV9leGl0ID0gZGU7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4tXHRcdH1cbi1cdFx0aWYgKCFkZV9leGl0KVxuLVx0XHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRlbHNlXG4tXHRcdFx0YnJlYWs7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZGVfZXhpdDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19pbm9kZV9ieV9uYW1lIC0gZmluZCBpbm9kZSBudW1iZXIgZm9yIGRlbnRyeVxuLSAqIEBkaXA6XHRkaXJlY3RvcnkgdG8gc2VhcmNoIGluXG4tICogQGRwOlx0XHRkZW50cnkgd2Ugc2VhcmNoIGZvclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2lub2RlX2J5X25hbWUgZmluZHMgb3V0IHRoZSBpbm9kZSBudW1iZXIgb2Zcbi0gKiAgIHRoZSBwYXRoIGNvbXBvbmVudCBkZXNjcmliZWQgYnkgQGRwIGluIEBkaXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHdhbnRlZCBpbm9kZSBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBpbm9fdFxuLXZ4ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHApXG4te1xuLVx0c3RydWN0IHZ4ZnNfZGlyZWN0XHRcdCpkZTtcbi1cdHN0cnVjdCBwYWdlXHRcdFx0KnBwO1xuLVx0aW5vX3RcdFx0XHRcdGlubyA9IDA7XG4tXG4tXHRkZSA9IHZ4ZnNfZmluZF9lbnRyeShkaXAsIGRwLCBcdTAwMjZwcCk7XG4tXHRpZiAoZGUpIHtcbi1cdFx0aW5vID0gZnMzMl90b19jcHUoVlhGU19TQkkoZGlwLVx1MDAzZWlfc2IpLCBkZS1cdTAwM2VkX2lubyk7XG4tXHRcdGt1bm1hcChwcCk7XG4tXHRcdHB1dF9wYWdlKHBwKTtcbi1cdH1cbi1cdFxuLVx0cmV0dXJuIChpbm8pO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2xvb2t1cCAtIGxvb2t1cCBwYXRobmFtZSBjb21wb25lbnRcbi0gKiBAZGlwOlx0ZGlyIGluIHdoaWNoIHdlIGxvb2t1cFxuLSAqIEBkcDpcdFx0ZGVudHJ5IHdlIGxvb2t1cFxuLSAqIEBmbGFnczpcdGxvb2t1cCBmbGFnc1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2xvb2t1cCB0cmllcyB0byBsb29rdXAgdGhlIHBhdGhuYW1lIGNvbXBvbmVudCBkZXNjcmliZWRcbi0gKiAgIGJ5IEBkcCBpbiBAZGlwLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIEEgTlVMTC1wb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWRcbi0gKiAgIGluIHRoZSByZXR1cm4gcG9pbnRlci5cbi0gKi9cbi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXG4tdnhmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4te1xuLVx0c3RydWN0IGlub2RlXHRcdCppcCA9IE5VTEw7XG4tXHRpbm9fdFx0XHRcdGlubztcbi1cdFx0XHQgXG4tXHRpZiAoZHAtXHUwMDNlZF9uYW1lLmxlbiBcdTAwM2UgVlhGU19OQU1FTEVOKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTtcbi1cdFx0XHRcdCBcbi1cdGlubyA9IHZ4ZnNfaW5vZGVfYnlfbmFtZShkaXAsIGRwKTtcbi1cdGlmIChpbm8pXG4tXHRcdGlwID0gdnhmc19pZ2V0KGRpcC1cdTAwM2VpX3NiLCBpbm8pO1xuLVx0cmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfcmVhZGRpciAtIHJlYWQgYSBkaXJlY3Rvcnlcbi0gKiBAZnA6XHRcdHRoZSBkaXJlY3RvcnkgdG8gcmVhZFxuLSAqIEBjdHg6XHRkaXJfY29udGV4dCBmb3IgZmlsbGRpci9yZWFkZGlyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfcmVhZGRpciBmaWxscyBAcmV0cCB3aXRoIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gQGZwXG4tICogICB1c2luZyB0aGUgVkZTIHN1cHBsaWVkIGNhbGxiYWNrIEBmaWxsZXIuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVyby5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4te1xuLVx0c3RydWN0IGlub2RlXHRcdCppcCA9IGZpbGVfaW5vZGUoZnApO1xuLVx0c3RydWN0IHN1cGVyX2Jsb2NrXHQqc2JwID0gaXAtXHUwMDNlaV9zYjtcbi1cdHVfbG9uZ1x0XHRcdGJzaXplID0gc2JwLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0bG9mZl90XHRcdFx0cG9zLCBsaW1pdDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm9cdCpzYmkgPSBWWEZTX1NCSShzYnApO1xuLVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMCkge1xuLVx0XHRpZiAoIWRpcl9lbWl0X2RvdChmcCwgY3R4KSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y3R4LVx1MDAzZXBvcysrO1xuLVx0fVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMSkge1xuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgXCIuLlwiLCAyLCBWWEZTX0lOTyhpcCktXHUwMDNldmlpX2RvdGRvdCwgRFRfRElSKSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y3R4LVx1MDAzZXBvcysrO1xuLVx0fVxuLVxuLVx0bGltaXQgPSBWWEZTX0RJUlJPVU5EKGlwLVx1MDAzZWlfc2l6ZSk7XG4tXHRpZiAoY3R4LVx1MDAzZXBvcyBcdTAwM2UgbGltaXQpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cG9zID0gY3R4LVx1MDAzZXBvcyBcdTAwMjYgfjNMO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cdFx0aW50IHJjID0gMDtcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICsgKHBvcyBcdTAwMjYgflBBR0VfTUFTSykpO1xuLVx0XHRcdFx0aW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7XG4tXG4tXHRcdFx0XHRwb3MgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XG4tXG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX3JlY2xlbikge1xuLVx0XHRcdFx0cG9zICs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9pbm8pXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRyYyA9IGRpcl9lbWl0KGN0eCwgZGUtXHUwMDNlZF9uYW1lLFxuLVx0XHRcdFx0XHRmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfbmFtZWxlbiksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9pbm8pLFxuLVx0XHRcdFx0XHREVF9VTktOT1dOKTtcbi1cdFx0XHRpZiAoIXJjKSB7XG4tXHRcdFx0XHQvKiB0aGUgZGlyIGVudHJ5IHdhcyBub3QgcmVhZCwgZml4IHBvcy4gKi9cbi1cdFx0XHRcdHBvcyAtPSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfcmVjbGVuKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cdFx0fVxuLVx0XHR2eGZzX3B1dF9wYWdlKHBwKTtcbi1cdFx0aWYgKCFyYylcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cbi1cdGN0eC1cdTAwM2Vwb3MgPSBwb3MgfCAyO1xuLVxuLW91dDpcbi1cdHJldHVybiAwO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyM2YzNTE4N2MyODk2Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwxMDUgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qIFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCJ2eGZzLmhcIlxuLSNpbmNsdWRlIFwidnhmc19vbHQuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9mc2hlYWQoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICpmc2hwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cdTAwM2VvbHRfZnNpbm9bMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9pbGlzdChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9pZXh0KTtcbi1cdGluZnAtXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXHUwMDNlb2x0X2lleHRbMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHVfbG9uZ1xuLXZ4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0QlVHX09OKHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcbi1cdHJldHVybiAoYmxvY2sgKiAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcbi19XG4tXG4tXG4tLyoqXG4tICogdnhmc19yZWFkX29sdCAtIHJlYWQgb2x0XG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKiBAYnNpemU6XHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXG4tICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKi9cbi1pbnRcbi12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19vbHRcdFx0Km9wO1xuLVx0Y2hhclx0XHRcdCpvYWRkciwgKmVhZGRyO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC1cdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xuLVx0aWYgKCFicCB8fCAhYnAtXHUwMDNlYl9kYXRhKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X21hZ2ljKSAhPSBWWEZTX09MVF9NQUdJQykge1xuLVx0XHRwcmludGsoS0VSTl9OT1RJQ0UgXCJ2eGZzOiBpdmFsaWQgb2x0IG1hZ2ljIG51bWJlclxcblwiKTtcbi1cdFx0Z290byBmYWlsO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIEl0IGlzIGluIHRoZW9yeSBwb3NzaWJsZSB0aGF0IHZzaV9vbHRzaXplIGlzIFx1MDAzZSAxLlxuLVx0ICogSSd2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSdtIGxhenkuLiAgLS1oY2hcbi1cdCAqL1xuLVx0aWYgKGluZnAtXHUwMDNldnNpX29sdHNpemUgXHUwMDNlIDEpIHtcbi1cdFx0cHJpbnRrKEtFUk5fTk9USUNFIFwidnhmczogb2x0c2l6ZSBcdTAwM2UgMSBkZXRlY3RlZC5cXG5cIik7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcInZ4ZnM6IHBsZWFzZSBub3RpZnkgaGNoQGluZnJhZGVhZC5vcmdcXG5cIik7XG4tXHRcdGdvdG8gZmFpbDtcbi1cdH1cbi1cbi1cdG9hZGRyID0gYnAtXHUwMDNlYl9kYXRhICsgZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0ZWFkZHIgPSBicC1cdTAwM2ViX2RhdGEgKyAoaW5mcC1cdTAwM2V2c2lfb2x0c2l6ZSAqIHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4tXG4tXHR3aGlsZSAob2FkZHIgXHUwMDNjIGVhZGRyKSB7XG4tXHRcdHN0cnVjdCB2eGZzX29sdGNvbW1vblx0Km9jcCA9XG4tXHRcdFx0KHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyO1xuLVx0XHRcbi1cdFx0c3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtXHUwMDNlb2x0X3R5cGUpKSB7XG4tXHRcdGNhc2UgVlhGU19PTFRfRlNIRUFEOlxuLVx0XHRcdHZ4ZnNfZ2V0X2ZzaGVhZCgoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICopb2FkZHIsIGluZnApO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHRjYXNlIFZYRlNfT0xUX0lMSVNUOlxuLVx0XHRcdHZ4ZnNfZ2V0X2lsaXN0KChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqKW9hZGRyLCBpbmZwKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVxuLVx0XHRvYWRkciArPSBmczMyX3RvX2NwdShpbmZwLCBvY3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0fVxuLVxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiAoaW5mcC1cdTAwM2V2c2lfZnNoaW5vIFx1MDAyNlx1MDAyNiBpbmZwLVx1MDAzZXZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMO1xuLVxuLWZhaWw6XG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIC1FSU5WQUw7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmggYi9mcy9mcmVldnhmcy92eGZzX29sdC5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDUzYWZiYTA4ZDYxN2YuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcbisrKyAvZGV2L251bGxcbkBAIC0xLDEyMCArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cbi0jZGVmaW5lIF9WWEZTX09MVF9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxuLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVx1MDAzZW9sdF9tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1x0XHQweGE1MDRGQ0Y1XG4tXG4tLypcbi0gKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy5cbi0gKi9cbi1lbnVtIHtcbi1cdFZYRlNfT0xUX0ZSRUVcdD0gMSxcbi1cdFZYRlNfT0xUX0ZTSEVBRFx0PSAyLFxuLVx0VlhGU19PTFRfQ1VUXHQ9IDMsXG4tXHRWWEZTX09MVF9JTElTVFx0PSA0LFxuLVx0VlhGU19PTFRfREVWXHQ9IDUsXG4tXHRWWEZTX09MVF9TQlx0PSA2XG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgT0xUIGhlYWRlci5cbi0gKlxuLSAqIFRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgaGVhZGVyIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2hcbi0gKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHQge1xuLVx0X19mczMyXHRcdG9sdF9tYWdpYztcdC8qIG1hZ2ljIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgZW50cnlcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfY2hlY2tzdW07XHQvKiBjaGVja3N1bSBvZiBleHRlbnRcdFx0Ki9cbi1cdF9fdTMyXHRcdF9fdW51c2VkMTtcdC8qID8/P1x0XHRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXRpbWU7XHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAoc2VjKVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXV0aW1lO1x0LyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpXHQqL1xuLVx0X19mczMyXHRcdG9sdF90b3RmcmVlO1x0LyogZnJlZSBzcGFjZSBpbiBPTFQgZXh0ZW50XHQqL1xuLVx0X19mczMyXHRcdG9sdF9leHRlbnRzWzJdO1x0LyogYWRkciBvZiB0aGlzIGV4dGVudCwgcmVwbGljYVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfZXNpemU7XHQvKiBzaXplIG9mIHRoaXMgZXh0ZW50XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25leHRbMl07ICAgIC8qIGFkZHIgb2YgbmV4dCBleHRlbnQsIHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25zaXplO1x0Lyogc2l6ZSBvZiBuZXh0IGV4dGVudFx0XHQqL1xuLVx0X191MzJcdFx0X191bnVzZWQyO1x0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XHQqL1xuLX07XG4tXG4tLypcbi0gKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGNvbW1vbiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgZnJlZSBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFx0Ki9cbi19O1xuLVxuLS8qXG4tICogVnhGUyBpbml0aWFsLWlub2RlIGxpc3QgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGlsaXN0IHtcbi1cdF9fZnMzMlx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9pZXh0WzJdO1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXHQqL1xuLX07XG4tXG4tLypcbi0gKiBDdXJyZW50IFVzYWdlIFRhYmxlIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGN1dCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2N1dGlubztcdC8qIGlub2RlIG9mIGN1cnJlbnQgdXNhZ2UgdGFibGVcdCovXG4tXHRfX3U4XHRcdF9fcGFkO1x0XHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblx0XHQqL1xuLX07XG4tXG4tLypcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdHNiIHtcbi1cdF9fZnMzMlx0XHRvbHRfdHlwZTtcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2Jpbm87XHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcdCovXG4tXHRfX3UzMlx0XHRfX3VudXNlZDE7XHQvKiA/Pz9cdFx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2xvZ2lub1syXTtcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X29sdGlub1syXTtcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVx0Ki9cbi19O1xuLVxuLS8qXG4tICogSW5vZGUgY29udGFpbmluZyBkZXZpY2UgY29uZmlndXJhdGlvbiArIGl0J3MgcmVwbGljYSBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHRkZXYge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9kZXZpbm9bMl07XHQvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzXHQqL1xuLX07XG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHRmc2hlYWQge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBudW1iZXJcdFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2lub1syXTsgICAvKiBpbm9kZXMgb2YgZmlsZXNldCBoZWFkZXJcdCovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfT0xUX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBmNDM5ODc3ZWE2ZTgwLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMTUyICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tXG4tXG4tc3RhdGljIGludFx0XHR2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKiwgc3RydWN0IGZvbGlvICopO1xuLXN0YXRpYyBzZWN0b3JfdFx0XHR2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QpO1xuLVxuLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0ge1xuLVx0LnJlYWRfZm9saW8gPVx0XHR2eGZzX3JlYWRfZm9saW8sXG4tXHQuYm1hcCA9XHRcdFx0dnhmc19ibWFwLFxuLX07XG4tXG4taW5saW5lIHZvaWRcbi12eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwcClcbi17XG4tXHRrdW5tYXAocHApO1xuLVx0cHV0X3BhZ2UocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2dldF9wYWdlIC0gcmVhZCBhIHBhZ2UgaW50byBtZW1vcnkuXG4tICogQG1hcHBpbmc6XHRtYXBwaW5nIHRvIHJlYWQgZnJvbVxuLSAqIEBuOlx0XHRwYWdlIG51bWJlclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICovXG4tc3RydWN0IHBhZ2UgKlxuLXZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKVxuLXtcbi1cdHN0cnVjdCBwYWdlICpcdFx0XHRwcDtcbi1cbi1cdHBwID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7XG4tXG4tXHRpZiAoIUlTX0VSUihwcCkpIHtcbi1cdFx0a21hcChwcCk7XG4tXHRcdC8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovXG4tXHRcdFx0LyoqIHZ4ZnNfY2hlY2tfcGFnZShwcCk7ICoqL1xuLVx0fVxuLVx0XG4tXHRyZXR1cm4gKHBwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19icmVhZCAtIHJlYWQgYnVmZmVyIGZvciBhIGdpdmUgaW5vZGUsYmxvY2sgdHVwbGVcbi0gKiBAaXA6XHRcdGlub2RlXG4tICogQGJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mXG4tICogICBAaXAgaW50byB0aGUgYnVmZmVyY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHJlc3VsdGluZyBcdTAwMjZzdHJ1Y3QgYnVmZmVyX2hlYWQuXG4tICovXG4tc3RydWN0IGJ1ZmZlcl9oZWFkICpcbi12eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaylcbi17XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdCpicDtcbi1cdGRhZGRyX3RcdFx0XHRwYmxvY2s7XG4tXG4tXHRwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7XG4tXHRicCA9IHNiX2JyZWFkKGlwLVx1MDAzZWlfc2IsIHBibG9jayk7XG4tXG4tXHRyZXR1cm4gKGJwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19nZXRibGsgLSBsb2NhdGUgYnVmZmVyIGZvciBnaXZlbiBpbm9kZSxibG9jayB0dXBsZVxuLSAqIEBpcDpcdFx0aW5vZGVcbi0gKiBAaWJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqIEBicDpcdFx0YnVmZmVyIHNrZWxldG9uXG4tICogQGNyZWF0ZTpcdCVUUlVFIGlmIGJsb2NrcyBtYXkgYmUgbmV3bHkgYWxsb2NhdGVkLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19nZXRibGsgZnVuY3Rpb24gZmlsbHMgQGJwIHdpdGggdGhlIHJpZ2h0IHBoeXNpY2FsXG4tICogICBibG9jayBhbmQgZGV2aWNlIG51bWJlciB0byBwZXJmb3JtIGEgbG93bGV2ZWwgcmVhZC93cml0ZSBvblxuLSAqICAgaXQuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdiBlcnJvciBjb2RlICgtRUlPKS5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19nZXRibGsoc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgaWJsb2NrLFxuLVx0ICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYnAsIGludCBjcmVhdGUpXG4te1xuLVx0ZGFkZHJfdFx0XHRcdHBibG9jaztcbi1cbi1cdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGlibG9jayk7XG4tXHRpZiAocGJsb2NrICE9IDApIHtcbi1cdFx0bWFwX2JoKGJwLCBpcC1cdTAwM2VpX3NiLCBwYmxvY2spO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHJldHVybiAtRUlPO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRfZm9saW8gLSByZWFkIG9uZSBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUgcGFnZWNhY2hlXG4tICogQGZpbGU6XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGVcbi0gKiAgIHBhZ2VjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLlxuLSAqXG4tICogTG9ja2luZyBzdGF0dXM6XG4tICogICBAZm9saW8gaXMgbG9ja2VkIGFuZCB3aWxsIGJlIHVubG9ja2VkLlxuLSAqL1xuLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLXtcbi1cdHJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTtcbi19XG4tIFxuLS8qKlxuLSAqIHZ4ZnNfYm1hcCAtIHBlcmZvcm0gbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXG4tICogQG1hcHBpbmc6XHRsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlXG4tICogQGJsb2NrOlx0bG9naWNhbCBibG9jayAocmVsYXRpdmUgdG8gQG1hcHBpbmcpLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBWeGZzX2JtYXAgZmluZCBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgcGhzaWNhbCBibG9jayB0byB0aGVcbi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTG9ja2luZyBzdGF0dXM6XG4tICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC5cbi0gKi9cbi1zdGF0aWMgc2VjdG9yX3Rcbi12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKVxuLXtcbi1cdHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGQ3ZDg0N2Q3NWMzZDUuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMzQ3ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrZGV2LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdmZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfZGlyLmhcIlxuLSNpbmNsdWRlIFwidnhmc19pbm9kZS5oXCJcbi1cbi1cbi1NT0RVTEVfQVVUSE9SKFwiQ2hyaXN0b3BoIEhlbGx3aWcsIEtyenlzenRvZiBCbGFzemtvd3NraVwiKTtcbi1NT0RVTEVfREVTQ1JJUFRJT04oXCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlclwiKTtcbi1NT0RVTEVfTElDRU5TRShcIkR1YWwgQlNEL0dQTFwiKTtcbi1cbi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwO1xuLVxuLS8qKlxuLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlc1xuLSAqIEBzYnA6XHRWRlMgc3VwZXJibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19wdXRfc3VwZXIgZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIEBzYnBcbi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC5cbi0gKi9cbi1cbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwKVxuLXtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm9cdCppbmZwID0gVlhGU19TQkkoc2JwKTtcbi1cbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLVxuLVx0YnJlbHNlKGluZnAtXHUwMDNldnNpX2JwKTtcbi1cdGtmcmVlKGluZnApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3N0YXRmcyAtIGdldCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uXG4tICogQGRlbnRyeTpcdFZGUyBkZW50cnkgdG8gbG9jYXRlIHN1cGVyYmxvY2tcbi0gKiBAYnVmcDpcdG91dHB1dCBidWZmZXJcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvblxuLSAqICAgYWJvdXQgdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IEBkZW50cnkuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVyby5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBObyBsb2NrcyBoZWxkLlxuLSAqXG4tICogTm90ZXM6XG4tICogICBUaGlzIGlzIGV2ZXJ5dGhpbmcgYnV0IGNvbXBsZXRlLi4uXG4tICovXG4tc3RhdGljIGludFxuLXZ4ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqaW5mcCA9IFZYRlNfU0JJKGRlbnRyeS1cdTAwM2VkX3NiKTtcbi1cdHN0cnVjdCB2eGZzX3NiICpyYXdfc2IgPSBpbmZwLVx1MDAzZXZzaV9yYXc7XG4tXHR1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoZGVudHJ5LVx1MDAzZWRfc2ItXHUwMDNlc19iZGV2LVx1MDAzZWJkX2Rldik7XG4tXG4tXHRidWZwLVx1MDAzZWZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7XG4tXHRidWZwLVx1MDAzZWZfYnNpemUgPSBkZW50cnktXHUwMDNlZF9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGJ1ZnAtXHUwMDNlZl9ibG9ja3MgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfZHNpemUpO1xuLVx0YnVmcC1cdTAwM2VmX2JmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVx1MDAzZXZzX2ZyZWUpO1xuLVx0YnVmcC1cdTAwM2VmX2JhdmFpbCA9IDA7XG4tXHRidWZwLVx1MDAzZWZfZmlsZXMgPSAwO1xuLVx0YnVmcC1cdTAwM2VmX2ZmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVx1MDAzZXZzX2lmcmVlKTtcbi1cdGJ1ZnAtXHUwMDNlZl9mc2lkID0gdTY0X3RvX2ZzaWQoaWQpO1xuLVx0YnVmcC1cdTAwM2VmX25hbWVsZW4gPSBWWEZTX05BTUVMRU47XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCB2eGZzX3JlY29uZmlndXJlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzeW5jX2ZpbGVzeXN0ZW0oZmMtXHUwMDNlcm9vdC1cdTAwM2VkX3NiKTtcbi1cdGZjLVx1MDAzZXNiX2ZsYWdzIHw9IFNCX1JET05MWTtcbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgc3RydWN0IGlub2RlICp2eGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmk7XG4tXG4tXHR2aSA9IGFsbG9jX2lub2RlX3NiKHNiLCB2eGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXZpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdGlub2RlX2luaXRfb25jZShcdTAwMjZ2aS1cdTAwM2V2ZnNfaW5vZGUpO1xuLVx0cmV0dXJuIFx1MDAyNnZpLVx1MDAzZXZmc19pbm9kZTtcbi19XG4tXG4tc3RhdGljIHZvaWQgdnhmc19mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4te1xuLVx0a21lbV9jYWNoZV9mcmVlKHZ4ZnNfaW5vZGVfY2FjaGVwLCBWWEZTX0lOTyhpbm9kZSkpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdnhmc19zdXBlcl9vcHMgPSB7XG4tXHQuYWxsb2NfaW5vZGVcdFx0PSB2eGZzX2FsbG9jX2lub2RlLFxuLVx0LmZyZWVfaW5vZGVcdFx0PSB2eGZzX2ZyZWVfaW5vZGUsXG4tXHQuZXZpY3RfaW5vZGVcdFx0PSB2eGZzX2V2aWN0X2lub2RlLFxuLVx0LnB1dF9zdXBlclx0XHQ9IHZ4ZnNfcHV0X3N1cGVyLFxuLVx0LnN0YXRmc1x0XHRcdD0gdnhmc19zdGF0ZnMsXG4tfTtcbi1cbi1zdGF0aWMgaW50IHZ4ZnNfdHJ5X3NiX21hZ2ljKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXG4tXHRcdHVuc2lnbmVkIGJsaywgX19mczMyIG1hZ2ljKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZCAqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19zYiAqcnNicDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0aW50IHNpbGVudCA9IGZjLVx1MDAzZXNiX2ZsYWdzIFx1MDAyNiBTQl9TSUxFTlQ7XG4tXHRpbnQgcmMgPSAtRU5PTUVNO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIGJsayk7XG4tXHRkbyB7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKSB7XG4tXHRcdFx0aWYgKCFzaWxlbnQpIHtcbi1cdFx0XHRcdHdhcm5mKGZjLFxuLVx0XHRcdFx0ICAgICAgXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2sgYXQgJXVcIixcbi1cdFx0XHRcdCAgICAgIGJsayk7XG4tXHRcdFx0fVxuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXG4tXHRcdHJjID0gLUVJTlZBTDtcbi1cdFx0cnNicCA9IChzdHJ1Y3Qgdnhmc19zYiAqKWJwLVx1MDAzZWJfZGF0YTtcbi1cdFx0aWYgKHJzYnAtXHUwMDNldnNfbWFnaWMgIT0gbWFnaWMpIHtcbi1cdFx0XHRpZiAoIXNpbGVudClcbi1cdFx0XHRcdGluZm9mKGZjLFxuLVx0XHRcdFx0ICAgICAgXCJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljICUwOHggYXQgJXVcIixcbi1cdFx0XHRcdCAgICAgIHJzYnAtXHUwMDNldnNfbWFnaWMsIGJsayk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0cmMgPSAwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9yYXcgPSByc2JwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9icCA9IGJwO1xuLVx0fSB3aGlsZSAoMCk7XG4tXG4tXHRpZiAocmMpIHtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfcmF3ID0gTlVMTDtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfYnAgPSBOVUxMO1xuLVx0XHRicmVsc2UoYnApO1xuLVx0fVxuLVxuLVx0cmV0dXJuIHJjO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2ZpbGxfc3VwZXIgLSByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGluaXRpYWxpemUgZmlsZXN5c3RlbVxuLSAqIEBzYnA6XHRcdFZGUyBzdXBlcmJsb2NrICh0byBmaWxsKVxuLSAqIEBmYzpcdFx0XHRmaWxlc3l0ZW0gY29udGV4dFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGVcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cdTAwM2VzX2xvY2suXG4tICovXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqaW5mcDtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCpyc2JwO1xuLVx0dV9sb25nXHRcdFx0YnNpemU7XG4tXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XG4tXHRpbnQgcmV0ID0gLUVJTlZBTDtcbi1cdGludCBzaWxlbnQgPSBmYy1cdTAwM2VzYl9mbGFncyBcdTAwMjYgU0JfU0lMRU5UO1xuLVx0dTMyIGo7XG4tXG4tXHRzYnAtXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XG4tXG4tXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xuLVx0aWYgKCFpbmZwKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbmNvcmUgc3VwZXJibG9ja1wiKTtcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHR9XG4tXG4tXHRic2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2JwLCBCTE9DS19TSVpFKTtcbi1cdGlmICghYnNpemUpIHtcbi1cdFx0d2FybmYoZmMsIFwidnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcIik7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0c2JwLVx1MDAzZXNfb3AgPSBcdTAwMjZ2eGZzX3N1cGVyX29wcztcbi1cdHNicC1cdTAwM2VzX2ZzX2luZm8gPSBpbmZwO1xuLVx0c2JwLVx1MDAzZXNfdGltZV9taW4gPSAwO1xuLVx0c2JwLVx1MDAzZXNfdGltZV9tYXggPSBVMzJfTUFYO1xuLVxuLVx0aWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLFxuLVx0XHRcdChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fbGUzMihWWEZTX1NVUEVSX01BR0lDKSkpIHtcbi1cdFx0LyogVW5peHdhcmUsIHg4NiAqL1xuLVx0XHRpbmZwLVx1MDAzZWJ5dGVfb3JkZXIgPSBWWEZTX0JPX0xFO1xuLVx0fSBlbHNlIGlmICghdnhmc190cnlfc2JfbWFnaWMoc2JwLCBmYywgOCxcbi1cdFx0XHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2JlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XG4tXHRcdC8qIEhQLVVYLCBwYXJpc2MgKi9cbi1cdFx0aW5mcC1cdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19CRTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmICghc2lsZW50KVxuLVx0XHRcdGluZm9mKGZjLCBcInZ4ZnM6IGNhbid0IGZpbmQgc3VwZXJibG9jay5cIik7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0cnNicCA9IGluZnAtXHUwMDNldnNpX3Jhdztcbi1cdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX3ZlcnNpb24pO1xuLVx0aWYgKChqIFx1MDAzYyAyIHx8IGogXHUwMDNlIDQpIFx1MDAyNlx1MDAyNiAhc2lsZW50KSB7XG4tXHRcdGluZm9mKGZjLCBcInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXCIsIGopO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJ2eGZzOiBzdXBwb3J0ZWQgVnhGUyB2ZXJzaW9uICglZClcXG5cIiwgaik7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcInZ4ZnM6IGJsb2Nrc2l6ZTogJWRcXG5cIixcbi1cdFx0ZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19ic2l6ZSkpO1xuLSNlbmRpZlxuLVxuLVx0c2JwLVx1MDAzZXNfbWFnaWMgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX21hZ2ljKTtcbi1cbi1cdGluZnAtXHUwMDNldnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfb2x0ZXh0WzBdKTtcbi1cdGluZnAtXHUwMDNldnNpX29sdHNpemUgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX29sdHNpemUpO1xuLVxuLVx0aiA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfYnNpemUpO1xuLVx0aWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgaikpIHtcbi1cdFx0d2FybmYoZmMsIFwidnhmczogdW5hYmxlIHRvIHNldCBmaW5hbCBibG9jayBzaXplXCIpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIG9sdFwiKTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRpZiAodnhmc19yZWFkX2ZzaGVhZChzYnApKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGZzaGVhZFwiKTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRyb290ID0gdnhmc19pZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7XG4tXHRpZiAoSVNfRVJSKHJvb3QpKSB7XG4tXHRcdHJldCA9IFBUUl9FUlIocm9vdCk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVx0c2JwLVx1MDAzZXNfcm9vdCA9IGRfbWFrZV9yb290KHJvb3QpO1xuLVx0aWYgKCFzYnAtXHUwMDNlc19yb290KSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgcm9vdCBkZW50cnkuXCIpO1xuLVx0XHRnb3RvIG91dF9mcmVlX2lsaXN0O1xuLVx0fVxuLVxuLVx0cmV0dXJuIDA7XG4tXHRcbi1vdXRfZnJlZV9pbGlzdDpcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLW91dDpcbi1cdGJyZWxzZShpbmZwLVx1MDAzZXZzaV9icCk7XG4tXHRrZnJlZShpbmZwKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLS8qXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfZ2V0X3RyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHJldHVybiBnZXRfdHJlZV9iZGV2KGZjLCB2eGZzX2ZpbGxfc3VwZXIpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGZzX2NvbnRleHRfb3BlcmF0aW9ucyB2eGZzX2NvbnRleHRfb3BzID0ge1xuLVx0LmdldF90cmVlXHQ9IHZ4ZnNfZ2V0X3RyZWUsXG4tXHQucmVjb25maWd1cmVcdD0gdnhmc19yZWNvbmZpZ3VyZSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdGZjLVx1MDAzZW9wcyA9IFx1MDAyNnZ4ZnNfY29udGV4dF9vcHM7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZ4ZnNfZnNfdHlwZSA9IHtcbi1cdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuLVx0Lm5hbWVcdFx0PSBcInZ4ZnNcIixcbi1cdC5raWxsX3NiXHQ9IGtpbGxfYmxvY2tfc3VwZXIsXG4tXHQuZnNfZmxhZ3NcdD0gRlNfUkVRVUlSRVNfREVWLFxuLVx0LmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LFxuLX07XG4tTU9EVUxFX0FMSUFTX0ZTKFwidnhmc1wiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovXG4tTU9EVUxFX0FMSUFTKFwidnhmc1wiKTtcbi1cbi1zdGF0aWMgaW50IF9faW5pdFxuLXZ4ZnNfaW5pdCh2b2lkKVxuLXtcbi1cdGludCBydjtcbi1cbi1cdHZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoXCJ2eGZzX2lub2RlXCIsXG4tXHRcdFx0c2l6ZW9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8pLCAwLFxuLVx0XHRcdFNMQUJfUkVDTEFJTV9BQ0NPVU5ULFxuLVx0XHRcdG9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksXG4tXHRcdFx0c2l6ZW9mX2ZpZWxkKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sXG4tXHRcdFx0XHR2aWlfaW1tZWQudmlfaW1tZWQpLFxuLVx0XHRcdE5VTEwpO1xuLVx0aWYgKCF2eGZzX2lub2RlX2NhY2hlcClcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHRydiA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oXHUwMDI2dnhmc19mc190eXBlKTtcbi1cdGlmIChydiBcdTAwM2MgMClcbi1cdFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcbi1cdHJldHVybiBydjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0XG4tdnhmc19jbGVhbnVwKHZvaWQpXG4te1xuLVx0dW5yZWdpc3Rlcl9maWxlc3lzdGVtKFx1MDAyNnZ4ZnNfZnNfdHlwZSk7XG4tXHQvKlxuLVx0ICogTWFrZSBzdXJlIGFsbCBkZWxheWVkIHJjdSBmcmVlIGlub2RlcyBhcmUgZmx1c2hlZCBiZWZvcmUgd2Vcbi1cdCAqIGRlc3Ryb3kgY2FjaGUuXG4tXHQgKi9cbi1cdHJjdV9iYXJyaWVyKCk7XG4tXHRrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApO1xuLX1cbi1cbi1tb2R1bGVfaW5pdCh2eGZzX2luaXQpO1xuLW1vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0zMFQxODo0MDoxMC43MTI4NjY3NzJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NjcyNzczMTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhpcyBwYXRjaCB0aGF0IGVzc2VudGlhbGx5IG51a2VzIHRoZSBgZnJlZXZ4ZnNgIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBJdCdzIGEgY29tcGxldGUgcmVtb3ZhbDsgdGhlIGVudGlyZSBgZnMvZnJlZXZ4ZnMvYCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgYXJlIGdvbmUuIE5hdHVyYWxseSwgdGhlIGFzc29jaWF0ZWQgZW50cmllcyBpbiBgZnMvS2NvbmZpZ2AsIGBmcy9NYWtlZmlsZWAsIGFuZCBgTUFJTlRBSU5FUlNgIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIHdlbGwuXG5cblRoZSBpbW1lZGlhdGUgdGhvdWdodCBpczogU2luY2Ugd2UncmUgKnJlbW92aW5nKiBjb2RlLCB0aGVyZSdzIG5vdGhpbmcgKm5ldyogdG8gZnV6ei4gTm8gbmV3IGF0dGFjayBzdXJmYWNlIGludHJvZHVjZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5CdXQsIGFzIGFsd2F5cywgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBMZXQncyBzZWUuLi4gdGhlIHByb21wdCByZW1pbmRzIG1lIHRoYXQgY2VydGFpbiB0eXBlcyBvZiBjaGFuZ2VzIGRvbid0IHdhcnJhbnQgZnV6emluZy4gVGhpbmdzIGxpa2UgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLCBLY29uZmlnIHR3ZWFrcywgb3IgY29tbWVudCBjaGFuZ2VzIGFyZSBleGNsdWRlZC4gQWxzbyBkZWNvcmF0aXZlIGxvZ2dpbmcsIHVucmVhY2hhYmxlIGNvZGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCBzcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYSAqcmVtb3ZhbCogb2YgdGhlIGNvZGUuXG5cbkFscmlnaHQsIGxldCdzIGNvbmZpcm0gdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIFRoZSBkaWZmIHNob3dzLi4uIHllYWgsIGl0J3MgYSB3aG9sZXNhbGUgZGVsZXRpb24uIFRoZSBNQUlOVEFJTkVSUywgS2NvbmZpZywgTWFrZWZpbGUgYW5kIGFsbCB0aGUgZmlsZXMgaW5zaWRlIHRoZSBkaXJlY3RvcnksIGFsbCBkZWxldGVkOiBgdnhmcy5oYCwgYHZ4ZnNfYm1hcC5jYCwgYHZ4ZnNfZGlyLmhgLCBgdnhmc19leHRlcm4uaGAsIGFuZCBvbiBhbmQgb24uLi5hbGwgZGVsZXRlZC5cblxuU28sIHRoZXJlJ3Mgbm8gbmV3IGNvZGUgaW50cm9kdWNlZCwganVzdCBjb2RlIHJlbW92ZWQuIE5vIG5lZWQgdG8gZnV6eiBhbnl0aGluZyBoZXJlLlxuXG5Pa2F5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCB0YWtlIG9uZSBsYXN0IGxvb2sgdGhyb3VnaCB0aGUgZGlmZiB0byBtYWtlIHN1cmUgbm90aGluZyBlbHNlIHNsaXBwZWQgaW4uIE5vLCB0aGF0J3MgaXQuIEl0J3MgcHVyZWx5IGEgZGVsZXRpb24gb2YgdGhlIGBmcmVldnhmc2AgZmlsZXN5c3RlbS5cblxuVGhlcmVmb3JlLCBteSBmaW5hbCBhc3Nlc3NtZW50IGlzIGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTc0NCwiT3V0cHV0VG9rZW5zIjo1OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTMwVDE4OjQwOjE5LjM4NTY0MjcyMloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc1MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIGZyZWV2eGZzIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBUaGVyZSBpcyBubyBuZXcgb3IgbW9kaWZpZWQgY29kZSB0byBmdXp6LCBvbmx5IGRlbGV0ZWQgY29kZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowrtmws[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-30 18:25:03 +0000 UTC FinishedAt: 2026-07-30 18:40:20 +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+CgkJCTx0ZD4yMDI2LzA3LzMwIDE4OjQwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8zMCAxODo0MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDhkYWU1MTQ4YzEwNDVmZDAwZTVhYTkxMzFmN2QzNTg0NjRjMGM4ZTVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEp1bCAzMCAxODo0MDowOSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtMTA1NjUsMTIgJiM0MzsxMDU2NSw2IEBAIEw6XHRsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZ1xuIFM6XHRPcnBoYW5cbiBGOlx0ZHJpdmVycy91c2IvcGh5L3BoeS1mc2wtdXNiKlxuIFxuLUZSRUVWWEZTIEZJTEVTWVNURU1cbi1NOlx0Q2hyaXN0b3BoIEhlbGx3aWcgXHUwMDNjaGNoQGluZnJhZGVhZC5vcmdcdTAwM2Vcbi1TOlx0TWFpbnRhaW5lZFxuLVc6XHRmdHA6Ly9mdHAub3BlbmxpbnV4Lm9yZy9wdWIvcGVvcGxlL2hjaC92eGZzXG4tRjpcdGZzL2ZyZWV2eGZzL1xuLVxuIEZSRUVaRVJcbiBNOlx0XCYjMzQ7UmFmYWVsIEouIFd5c29ja2lcJiMzNDsgXHUwMDNjcmFmYWVsQGtlcm5lbC5vcmdcdTAwM2VcbiBSOlx0UGF2ZWwgTWFjaGVrIFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcdTAwM2VcbmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZ1xuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcbi0tLSBhL2ZzL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL0tjb25maWdcbkBAIC0zMjEsNyAmIzQzOzMyMSw2IEBAIHNvdXJjZSBcJiMzNDtmcy9qZmZzMi9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL3ViaWZzL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvY3JhbWZzL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvc3F1YXNoZnMvS2NvbmZpZ1wmIzM0O1xuLXNvdXJjZSBcJiMzNDtmcy9mcmVldnhmcy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL21pbml4L0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZnMvb21mcy9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2ZzL2hwZnMvS2NvbmZpZ1wmIzM0O1xuZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGVcbmluZGV4IDg5YThhOWQyMDdkMWMuLmFjMGQxYzAwNTIzZjAgMTAwNjQ0XG4tLS0gYS9mcy9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZnMvTWFrZWZpbGVcbkBAIC04MCw3ICYjNDM7ODAsNiBAQCBvYmotJChDT05GSUdfSVNPOTY2MF9GUylcdCYjNDM7PSBpc29mcy9cbiBvYmotJChDT05GSUdfSEZTUExVU19GUylcdCYjNDM7PSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUyYjNDM7XG4gb2JqLSQoQ09ORklHX0hGU19GUylcdFx0JiM0Mzs9IGhmcy9cbiBvYmotJChDT05GSUdfRUNSWVBUX0ZTKVx0XHQmIzQzOz0gZWNyeXB0ZnMvXG4tb2JqLSQoQ09ORklHX1ZYRlNfRlMpXHRcdCYjNDM7PSBmcmVldnhmcy9cbiBvYmotJChDT05GSUdfTkZTX0ZTKVx0XHQmIzQzOz0gbmZzL1xuIG9iai0kKENPTkZJR19FWFBPUlRGUylcdFx0JiM0Mzs9IGV4cG9ydGZzL1xuIG9iai0kKENPTkZJR19ORlNEKVx0XHQmIzQzOz0gbmZzZC9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA5MTIxMDdlYmVhNmY0Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwyNyAmIzQzOzAsMCBAQFxuLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLWNvbmZpZyBWWEZTX0ZTXG4tXHR0cmlzdGF0ZSBcJiMzNDtGcmVlVnhGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChWRVJJVEFTIFZ4RlMoVE0pIGNvbXBhdGlibGUpXCYjMzQ7XG4tXHRkZXBlbmRzIG9uIEJMT0NLXG4tXHRzZWxlY3QgQlVGRkVSX0hFQURcbi1cdGhlbHBcbi1cdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXG4tXHQgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtXG4tXHQgIG9mIFNDTyBVbml4V2FyZSAoYW5kIHBvc3NpYmx5IG90aGVycykgYW5kIG9wdGlvbmFsbHkgYXZhaWxhYmxlXG4tXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXG4tXHQgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrXG4tXHQgIGRhdGEgZW5kaWFubmVzcyBhbmQvb3Igc3VwZXJibG9jayBvZmZzZXQuIFRoZSB2eGZzIG1vZHVsZSBoYXMgYmVlblxuLVx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxuLVx0ICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zXG4tXHQgIDIsIDMgYW5kIDQuIFRlc3RzIHdlcmUgcGVyZm9ybWVkIHdpdGggSFAtVVggVnhGUyB2ZXJzaW9uIDMuXG4tXG4tXHQgIE5PVEU6IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGFzIHVzZWQgYnkgbW91bnQoMSksIG1vdW50KDIpIGFuZFxuLVx0ICBmc3RhYig1KSBpcyAmIzM5O3Z4ZnMmIzM5OyBhcyBpdCBkZXNjcmliZXMgdGhlIGZpbGUgc3lzdGVtIGZvcm1hdCwgbm90XG4tXHQgIHRoZSBhY3R1YWwgZHJpdmVyLlxuLVxuLVx0ICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXNcbi1cdCAgY3JlYXRpbmcgSFAtVVggbG9naWNhbCB2b2x1bWVzIGVhc3kgZnJvbSBIUC1VWCBkaXNrIGJsb2NrIGRldmljZSBmaWxlXG4tXHQgIG9yIHJlZ3VsYXIgZmlsZSB3aXRoIGltYWdlIG9mIHRoZSBkaXNrLiBTZWU6XG4tXHQgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzL1xuLVxuLVx0ICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxuLVx0ICBjYWxsZWQgZnJlZXZ4ZnMuICBJZiB1bnN1cmUsIHNheSBOLlxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZTZlZTU5MjkxNTIxYy4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDkgJiM0MzswLDAgQEBcbi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0jXG4tIyBWeEZTIE1ha2VmaWxlXG4tI1xuLVxuLW9iai0kKENPTkZJR19WWEZTX0ZTKSAmIzQzOz0gZnJlZXZ4ZnMub1xuLVxuLWZyZWV2eGZzLW9ianMgOj0gdnhmc19ibWFwLm8gdnhmc19mc2hlYWQubyB2eGZzX2ltbWVkLm8gdnhmc19pbm9kZS5vIFxcXG4tXHRcdCB2eGZzX2xvb2t1cC5vIHZ4ZnNfb2x0Lm8gdnhmc19zdWJyLm8gdnhmc19zdXBlci5vXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGJmZmQxNTZkNjQzNGMuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMjU3ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfU1VQRVJfSF9cbi0jZGVmaW5lIF9WWEZTX1NVUEVSX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmVcbi0gKiBzdXBlcmJsb2NrcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2Vcbi1cbi0vKlxuLSAqIFN1cGVyYmxvY2sgbWFnaWMgbnVtYmVyICh2eGZzX3N1cGVyLVx1MDAzZXZzX21hZ2ljKS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfU1VQRVJfTUFHSUNcdDB4YTUwMUZDRjVcbi1cbi0vKlxuLSAqIFRoZSByb290IGlub2RlLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19ST09UX0lOT1x0XHQyXG4tXG4tLypcbi0gKiBOdW0gb2YgZW50cmllcyBpbiBmcmVlIGV4dGVudCBhcnJheVxuLSAqL1xuLSNkZWZpbmUgVlhGU19ORUZSRUVcdFx0MzJcbi1cbi1lbnVtIHZ4ZnNfYnl0ZV9vcmRlciB7XG4tXHRWWEZTX0JPX0xFLFxuLVx0VlhGU19CT19CRSxcbi19O1xuLVxuLXR5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fZnMxNjtcbi10eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2ZzMzI7XG4tdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19mczY0O1xuLVxuLS8qXG4tICogVnhGUyBzdXBlcmJsb2NrIChkaXNrKS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19zYiB7XG4tXHQvKlxuLVx0ICogUmVhZG9ubHkgZmllbGRzIGZvciB0aGUgdmVyc2lvbiAxIHN1cGVyYmxvY2suXG4tXHQgKlxuLVx0ICogTG90cyBvZiB0aGlzIGZpZWxkcyBhcmUgbm8gbW9yZSB1c2VkIGJ5IHZlcnNpb24gMlxuLVx0ICogYW5kIG5ldmVyIGZpbGVzeXN0ZW1zLlxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfbWFnaWM7XHRcdC8qIE1hZ2ljIG51bWJlciAqL1xuLVx0X19mczMyXHRcdHZzX3ZlcnNpb247XHRcdC8qIFZ4RlMgdmVyc2lvbiAqL1xuLVx0X19mczMyXHRcdHZzX2N0aW1lO1x0XHQvKiBjcmVhdGUgdGltZSAtIHNlY3MgKi9cbi1cdF9fZnMzMlx0XHR2c19jdXRpbWU7XHRcdC8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi9cbi1cdF9fZnMzMlx0XHRfX3VudXNlZDE7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdF9fdW51c2VkMjtcdFx0LyogdW51c2VkICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2xvZ3N0YXJ0O1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbG9nZW5kO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2JzaXplO1x0XHQvKiBibG9jayBzaXplICovXG4tXHRfX2ZzMzJcdFx0dnNfc2l6ZTtcdFx0LyogbnVtYmVyIG9mIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2RzaXplO1x0XHQvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmlub2RlO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9uYXU7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0X191bnVzZWQzO1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfZGVmaWV4dHNpemU7XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbGJzaXplO1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2ltbWVkbGVuO1x0XHQvKiBzaXplIG9mIGltbWVkaWF0ZSBkYXRhIGFyZWEgKi9cbi1cdF9fZnMzMlx0XHR2c19uZGFkZHI7XHRcdC8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19maXJzdGF1O1x0XHQvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfZW1hcDtcdFx0Lyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbWFwO1x0XHQvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfaWV4dG9wO1x0XHQvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2lzdGFydDtcdFx0Lyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19ic3RhcnQ7XHRcdC8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfZmVtYXA7XHRcdC8qIGF1Zmlyc3QgJiM0MzsgZW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpbWFwO1x0XHQvKiBhdWZpcnN0ICYjNDM7IGltYXAgKi9cbi1cdF9fZnMzMlx0XHR2c19maWV4dG9wO1x0XHQvKiBhdWZpcnN0ICYjNDM7IGlleHRvcCAqL1xuLVx0X19mczMyXHRcdHZzX2Zpc3RhcnQ7XHRcdC8qIGF1Zmlyc3QgJiM0MzsgaXN0YXJ0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZmJzdGFydDtcdFx0LyogYXVmaXJzdCAmIzQzOyBic3RhcnQgKi9cbi1cdF9fZnMzMlx0XHR2c19uaW5kaXI7XHRcdC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGluZGlyICovXG4tXHRfX2ZzMzJcdFx0dnNfYXVsZW47XHRcdC8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWltbGVuO1x0XHQvKiBsZW5ndGggb2YgaW1hcCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWVtbGVuO1x0XHQvKiBsZW5ndGggb2YgZW1hcCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWlsZW47XHRcdC8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdXBhZDtcdFx0LyogbGVuZ3RoIG9mIHBhZCBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWJsb2NrcztcdFx0LyogZGF0YSBibG9ja3MgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19tYXh0aWVyO1x0XHQvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfaW5vcGI7XHRcdC8qIG51bWJlciBvZiBpbm9kZXMgcGVyIGJsayAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbm9wYXU7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2lub3BpbGI7XHRcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX25kaXJpcGF1O1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19pYWRkcmxlbjtcdFx0Lyogc2l6ZSBvZiBpbmRpcmVjdCBhZGRyIGV4dC4gKi9cbi1cdF9fZnMzMlx0XHR2c19ic2hpZnQ7XHRcdC8qIGxvZyBiYXNlIDIgb2YgYnNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbm9zaGlmdDtcdFx0LyogbG9nIGJhc2UgMiBvZiBpbm9icCAqL1xuLVx0X19mczMyXHRcdHZzX2JtYXNrO1x0XHQvKiB+KCBic2l6ZSAtIDEgKSAqL1xuLVx0X19mczMyXHRcdHZzX2JvZmZtYXNrO1x0XHQvKiBic2l6ZSAtIDEgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaW5vbWFzaztcdFx0Lyogb2xkX2lub3BpbGIgLSAxICovXG4tXHRfX2ZzMzJcdFx0dnNfY2hlY2tzdW07XHRcdC8qIGNoZWNrc3VtIG9mIFYxIGRhdGEgKi9cbi1cdFxuLVx0Lypcbi1cdCAqIFZlcnNpb24gMSwgd3JpdGFibGVcbi1cdCAqL1xuLVx0X19mczMyXHRcdHZzX2ZyZWU7XHRcdC8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2lmcmVlO1x0XHQvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19lZnJlZVtWWEZTX05FRlJFRV07XHQvKiBudW1iZXIgb2YgZnJlZSBleHRlbnRzIGJ5IHNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19mbGFncztcdFx0LyogZmxhZ3MgPyE/ICovXG4tXHRfX3U4XHRcdHZzX21vZDtcdFx0XHQvKiBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi9cbi1cdF9fdThcdFx0dnNfY2xlYW47XHRcdC8qIGNsZWFuIEZTICovXG4tXHRfX2ZzMTZcdFx0X191bnVzZWQ0O1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHR2c19maXJzdGxvZ2lkO1x0XHQvKiBtb3VudCB0aW1lIGxvZyBJRCAqL1xuLVx0X19mczMyXHRcdHZzX3d0aW1lO1x0XHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZzX3d1dGltZTtcdFx0LyogbGFzdCB0aW1lIHdyaXR0ZW4gLSB1c2VjICovXG4tXHRfX3U4XHRcdHZzX2ZuYW1lWzZdO1x0XHQvKiBGUyBuYW1lICovXG4tXHRfX3U4XHRcdHZzX2ZwYWNrWzZdO1x0XHQvKiBGUyBwYWNrIG5hbWUgKi9cbi1cdF9fZnMzMlx0XHR2c19sb2d2ZXJzaW9uO1x0XHQvKiBsb2cgZm9ybWF0IHZlcnNpb24gKi9cbi1cdF9fdTMyXHRcdF9fdW51c2VkNTtcdFx0LyogdW51c2VkICovXG4tXHRcbi1cdC8qXG4tXHQgKiBWZXJzaW9uIDIsIFJlYWQtb25seVxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfb2x0ZXh0WzJdO1x0XHQvKiBPTFQgZXh0ZW50IGFuZCByZXBsaWNhICovXG4tXHRfX2ZzMzJcdFx0dnNfb2x0c2l6ZTtcdFx0LyogT0xUIGV4dGVudCBzaXplICovXG4tXHRfX2ZzMzJcdFx0dnNfaWF1aW1sZW47XHRcdC8qIHNpemUgb2YgaW5vZGUgbWFwICovXG4tXHRfX2ZzMzJcdFx0dnNfaWF1c2l6ZTtcdFx0Lyogc2l6ZSBvZiBJQVUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfZGlub3NpemU7XHRcdC8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfZG5pYWRkcjtcdFx0LyogaW5kaXIgbGV2ZWxzIHBlciBpbm9kZSAqL1xuLVx0X19mczMyXHRcdHZzX2NoZWNrc3VtMjtcdFx0LyogY2hlY2tzdW0gb2YgVjIgUk8gKi9cbi1cbi1cdC8qXG4tXHQgKiBBY3R1YWxseSBtdWNoIG1vcmUuLi5cbi1cdCAqL1xuLX07XG4tXG4tXG4tLypcbi0gKiBJbiBjb3JlIHN1cGVyYmxvY2sgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZm9yIFZ4RlMuXG4tICovXG4tc3RydWN0IHZ4ZnNfc2JfaW5mbyB7XG4tXHRzdHJ1Y3Qgdnhmc19zYlx0XHQqdnNpX3JhdztcdC8qIHJhdyAob24gZGlzaykgc3VwZXJibG9jayAqL1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqdnNpX2JwO1x0LyogYnVmZmVyIGZvciByYXcgc3VwZXJibG9jayovXG4tXHRzdHJ1Y3QgaW5vZGVcdFx0KnZzaV9mc2hpcDtcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXG4tXHRzdHJ1Y3QgaW5vZGVcdFx0KnZzaV9pbGlzdDtcdC8qIGlub2RlIGxpc3QgaW5vZGUgKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX3N0aWxpc3Q7XHQvKiBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW5vZGUgKi9cbi1cdHVfbG9uZ1x0XHRcdHZzaV9pZXh0O1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0ICovXG4tXHRpbm9fdFx0XHRcdHZzaV9mc2hpbm87XHQvKiBmaWxlc2V0IGhlYWRlciBpbm9kZSAqL1xuLVx0ZGFkZHJfdFx0XHRcdHZzaV9vbHRleHQ7XHQvKiBPTFQgZXh0ZW50ICovXG4tXHRkYWRkcl90XHRcdFx0dnNpX29sdHNpemU7XHQvKiBPTFQgc2l6ZSAqL1xuLVx0ZW51bSB2eGZzX2J5dGVfb3JkZXJcdGJ5dGVfb3JkZXI7XG4tfTtcbi1cbi1zdGF0aWMgaW5saW5lIHUxNiBmczE2X3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMxNiBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmUxNl90b19jcHUoKF9fZm9yY2UgX19iZTE2KWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgX19sZTE2KWEpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHUzMiBmczMyX3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMzMiBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmUzMl90b19jcHUoKF9fZm9yY2UgX19iZTMyKWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGUzMl90b19jcHUoKF9fZm9yY2UgX19sZTMyKWEpO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHU2NCBmczY0X3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnM2NCBhKVxuLXtcbi1cdGlmIChzYmktXHUwMDNlYnl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKVxuLVx0XHRyZXR1cm4gYmU2NF90b19jcHUoKF9fZm9yY2UgX19iZTY0KWEpO1xuLVx0ZWxzZVxuLVx0XHRyZXR1cm4gbGU2NF90b19jcHUoKF9fZm9yY2UgX19sZTY0KWEpO1xuLX1cbi1cbi0vKlxuLSAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZFxuLSAqIG5vdCBiZSBwYXNzZWQgYmFjayB0byBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBzeXN0ZW0uICB2eGZzIGZpbGUgdHlwZXMgbXVzdFxuLSAqIG5ldmVyIGhhdmUgb25lIG9mIHRoZSByZWd1bGFyIGZpbGUgdHlwZSBiaXRzIHNldC5cbi0gKi9cbi1lbnVtIHZ4ZnNfbW9kZSB7XG4tXHRWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCxcdC8qIHNldHVpZCAqL1xuLVx0VlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsXHQvKiBzZXRnaWQgKi9cbi1cdFZYRlNfSVNWVFggPSAweDAwMDAwMjAwLFx0Lyogc3RpY2t5IGJpdCAqL1xuLVx0VlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsXHQvKiByZWFkICovXG4tXHRWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsXHQvKiB3cml0ZSAqL1xuLVx0VlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsXHQvKiBleGVjICovXG4tXG4tXHRWWEZTX0lGSUZPID0gMHgwMDAwMTAwMCxcdC8qIE5hbWVkIHBpcGUgKi9cbi1cdFZYRlNfSUZDSFIgPSAweDAwMDAyMDAwLFx0LyogQ2hhcmFjdGVyIGRldmljZSAqL1xuLVx0VlhGU19JRkRJUiA9IDB4MDAwMDQwMDAsXHQvKiBEaXJlY3RvcnkgKi9cbi1cdFZYRlNfSUZOQU0gPSAweDAwMDA1MDAwLFx0LyogWGVuaXggZGV2aWNlID8/ICovXG4tXHRWWEZTX0lGQkxLID0gMHgwMDAwNjAwMCxcdC8qIEJsb2NrIGRldmljZSAqL1xuLVx0VlhGU19JRlJFRyA9IDB4MDAwMDgwMDAsXHQvKiBSZWd1bGFyIGZpbGUgKi9cbi1cdFZYRlNfSUZDTVAgPSAweDAwMDA5MDAwLFx0LyogQ29tcHJlc3NlZCBmaWxlID8hPyAqL1xuLVx0VlhGU19JRkxOSyA9IDB4MDAwMGEwMDAsXHQvKiBTeW1saW5rICovXG4tXHRWWEZTX0lGU09DID0gMHgwMDAwYzAwMCxcdC8qIFNvY2tldCAqL1xuLVxuLVx0LyogVnhGUyBpbnRlcm5hbCAqL1xuLVx0VlhGU19JRkZTSCA9IDB4MTAwMDAwMDAsXHQvKiBGaWxlc2V0IGhlYWRlciAqL1xuLVx0VlhGU19JRklMVCA9IDB4MjAwMDAwMDAsXHQvKiBJbm9kZSBsaXN0ICovXG4tXHRWWEZTX0lGSUFVID0gMHgzMDAwMDAwMCxcdC8qIElub2RlIGFsbG9jYXRpb24gdW5pdCAqL1xuLVx0VlhGU19JRkNVVCA9IDB4NDAwMDAwMDAsXHQvKiBDdXJyZW50IHVzYWdlIHRhYmxlICovXG4tXHRWWEZTX0lGQVRUID0gMHg1MDAwMDAwMCxcdC8qIEF0dHIuIGlub2RlICovXG4tXHRWWEZTX0lGTENUID0gMHg2MDAwMDAwMCxcdC8qIExpbmsgY291bnQgdGFibGUgKi9cbi1cdFZYRlNfSUZJQVQgPSAweDcwMDAwMDAwLFx0LyogSW5kaXJlY3QgYXR0cmlidXRlIGZpbGUgKi9cbi1cdFZYRlNfSUZFTVIgPSAweDgwMDAwMDAwLFx0LyogRXh0ZW50IG1hcCByZW9yZyBmaWxlICovXG4tXHRWWEZTX0lGUVVPID0gMHg5MDAwMDAwMCxcdC8qIEJTRCBxdW90YSBmaWxlICovXG4tXHRWWEZTX0lGUFRJID0gMHhhMDAwMDAwMCxcdC8qIFwmIzM0O1Bhc3MgdGhyb3VnaFwmIzM0OyBpbm9kZSAqL1xuLVx0VlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xuLVx0VlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsXHQvKiBPTFQgZmlsZSAqL1xuLVx0VlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsXHQvKiBMb2cgZmlsZSAqL1xuLVx0VlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cbi1cdFZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cbi1cdFZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xuLVx0VlhGU19JRkRFViA9IDB4MTcwMDAwMDAsXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cbi1cbi19O1xuLVxuLSNkZWZpbmVcdFZYRlNfVFlQRV9NQVNLXHRcdDB4ZmZmZmYwMDBcbi1cbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVx0KCgoaXApLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxuLSNkZWZpbmUgVlhGU19JU0ZJRk8oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxuLSNkZWZpbmUgVlhGU19JU0NIUih4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXG4tI2RlZmluZSBWWEZTX0lTRElSKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcbi0jZGVmaW5lIFZYRlNfSVNOQU0oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxuLSNkZWZpbmUgVlhGU19JU0JMSyh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXG4tI2RlZmluZSBWWEZTX0lTTE5LKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcbi0jZGVmaW5lIFZYRlNfSVNSRUcoeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxuLSNkZWZpbmUgVlhGU19JU0NNUCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXG4tI2RlZmluZSBWWEZTX0lTU09DKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcbi1cbi0jZGVmaW5lIFZYRlNfSVNGU0goeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKVxuLSNkZWZpbmUgVlhGU19JU0lMVCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpXG4tXG4tLypcbi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19PUkdfTk9ORVx0PSAwLFx0LyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqL1xuLVx0VlhGU19PUkdfRVhUNFx0PSAxLFx0LyogRXh0NCAqL1xuLVx0VlhGU19PUkdfSU1NRURcdD0gMixcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xuLVx0VlhGU19PUkdfVFlQRURcdD0gMyxcdC8qIFR5cGVkIGV4dGVudHMgKi9cbi19O1xuLVxuLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKVx0KChpcCktXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXG4tI2RlZmluZSBWWEZTX0lTTk9ORShpcClcdFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcbi0jZGVmaW5lIFZYRlNfSVNFWFQ0KGlwKVx0XHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxuLSNkZWZpbmUgVlhGU19JU0lNTUVEKGlwKVx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfSU1NRUQpXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19UWVBFRClcbi1cbi0vKlxuLSAqIEdldCBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmcm9tIFZGUyBzdXBlcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxuLVx0KChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktXHUwMDNlc19mc19pbmZvKVxuLVxuLSNlbmRpZiAvKiBfVlhGU19TVVBFUl9IXyAqL1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMWI4MjE2ZWIxZDkwYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDI3MiAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzeXN0ZW0gdG8gZGlzayBibG9jayBtYXBwaW5nLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2lub2RlLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfdHlwZHVtcChzdHJ1Y3Qgdnhmc190eXBlZCAqdHlwKVxuLXtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3R5cGU9JUx1IFwmIzM0OywgdHlwLVx1MDAzZXZ0X2hkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpO1xuLVx0cHJpbnRrKFwmIzM0O29mZnNldD0lTHggXCYjMzQ7LCB0eXAtXHUwMDNldnRfaGRyIFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0spO1xuLVx0cHJpbnRrKFwmIzM0O2Jsb2NrPSV4IFwmIzM0OywgdHlwLVx1MDAzZXZ0X2Jsb2NrKTtcbi1cdHByaW50ayhcJiMzNDtzaXplPSV4XFxuXCYjMzQ7LCB0eXAtXHUwMDNldnRfc2l6ZSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBibjpcdFx0bG9naWNhbCBibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxuLSAqICAgZXh0NC1zdHlsZSBleHRlbnRzICh3aGljaCBhcmUgbXVjaCBsaWtlIHRoZSB0cmFkaXRpb25hbCBVTklYXG4tICogICBpbm9kZSBvcmdhbmlzYXRpb24pLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBkYWRkcl90XG4tdnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibilcbi17XG4tXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtXHUwMDNlaV9zYjtcbi1cdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKHNiKTtcbi1cdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2luZHNpemUpO1xuLVx0aW50IGk7XG4tXG4tXHRpZiAoaW5kc2l6ZSBcdTAwM2Ugc2ItXHUwMDNlc19ibG9ja3NpemUpXG4tXHRcdGdvdG8gZmFpbF9zaXplO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OREFERFI7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHN0cnVjdCBkaXJlY3QgKmQgPSB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2RpcmVjdCAmIzQzOyBpO1xuLVx0XHRpZiAoYm4gXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiBibiBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZXNpemUpKVxuLVx0XHRcdHJldHVybiAoYm4gJiM0MzsgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZWV4dGVudCkpO1xuLVx0XHRibiAtPSBmczMyX3RvX2NwdShzYmksIGQtXHUwMDNlc2l6ZSk7XG4tXHR9XG4tXG4tXHRpZiAoKGJuIC8gKGluZHNpemUgKiBpbmRzaXplICogYnNpemUgLyA0KSkgPT0gMCkge1xuLVx0XHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1Zjtcbi1cdFx0ZGFkZHJfdFx0Ym5vO1xuLVx0XHRfX2ZzMzIgKmluZGlyO1xuLVxuLVx0XHRidWYgPSBzYl9icmVhZChzYixcbi1cdFx0XHRmczMyX3RvX2NwdShzYmksIHZpcC1cdTAwM2V2aWlfZXh0NC52ZTRfaW5kaXJbMF0pKTtcbi1cdFx0aWYgKCFidWYgfHwgIWJ1ZmZlcl9tYXBwZWQoYnVmKSlcbi1cdFx0XHRnb3RvIGZhaWxfYnVmO1xuLVxuLVx0XHRpbmRpciA9IChfX2ZzMzIgKilidWYtXHUwMDNlYl9kYXRhO1xuLVx0XHRibm8gPSBmczMyX3RvX2NwdShzYmksIGluZGlyWyhibiAvIGluZHNpemUpICUgKGluZHNpemUgKiBibildKSAmIzQzO1xuLVx0XHRcdChibiAlIGluZHNpemUpO1xuLVxuLVx0XHRicmVsc2UoYnVmKTtcbi1cdFx0cmV0dXJuIGJubztcbi1cdH0gZWxzZVxuLVx0XHRwcmludGsoS0VSTl9XQVJOSU5HIFwmIzM0O25vIG1hdGNoaW5nIGluZGlyP1wmIzM0Oyk7XG4tXG4tXHRyZXR1cm4gMDtcbi1cbi1mYWlsX3NpemU6XG4tXHRwcmludGsoXCYjMzQ7dnhmczogaW5kaXJlY3QgZXh0ZW50IHRvbyBiaWchXFxuXCYjMzQ7KTtcbi1mYWlsX2J1Zjpcbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfaW5kaXIgLSByZWN1cnNpb24gZm9yIHZ4ZnNfYm1hcF90eXBlZFxuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaW5kaXI6XHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XG4tICogQHNpemU6XHRzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaFxuLSAqIEBibG9jazpcdHBhcnRpYWxseSByZXN1bHQgZnJvbSBmdXJ0aGVyIHNlYXJjaGVzXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcF9pbmRpciByZWFkcyBhIFx1MDAyNnN0cnVjdCB2eGZzX3R5cGVkIGF0IEBpbmRpclxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTm90ZTpcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwID0gTlVMTDtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYik7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHQqdHlwO1xuLVx0XHRpbnQ2NF90XHRcdFx0b2ZmO1xuLVxuLVx0XHRicCA9IHNiX2JyZWFkKGlwLVx1MDAzZWlfc2IsXG4tXHRcdFx0XHRpbmRpciAmIzQzOyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLVx1MDAzZWlfc2IpKSk7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHR0eXAgPSAoKHN0cnVjdCB2eGZzX3R5cGVkICopYnAtXHUwMDNlYl9kYXRhKSAmIzQzO1xuLVx0XHRcdChpICUgVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYikpO1xuLVx0XHRvZmYgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9oZHIpIFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0s7XG4tXG4tXHRcdGlmIChibG9jayBcdTAwM2Mgb2ZmKSB7XG4tXHRcdFx0YnJlbHNlKGJwKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHRzd2l0Y2ggKCh1X2ludDMyX3QpKGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikgXHUwMDNlXHUwMDNlXG4tXHRcdFx0XHRWWEZTX1RZUEVEX1RZUEVTSElGVCkpIHtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUOlxuLVx0XHRcdHBibG9jayA9IHZ4ZnNfYm1hcF9pbmRpcihpcCxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSxcbi1cdFx0XHRcdFx0YmxvY2sgLSBvZmYpO1xuLVx0XHRcdGlmIChwYmxvY2sgPT0gLTIpXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEE6XG4tXHRcdFx0aWYgKChibG9jayAtIG9mZikgXHUwMDNlPSBmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSlcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdHBibG9jayA9IGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSAmIzQzOyBibG9jayAtIG9mZjtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O1xcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCYjMzQ7KTtcbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O2Jsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cJiMzNDssXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0fVxuLVx0XHRkZWZhdWx0OlxuLVx0XHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDslczolZCB2dF9oZHIgJWxsdVxcblwmIzM0OywgX19mdW5jX18sXG4tXHRcdFx0XHRfX0xJTkVfXywgZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKSk7XG4tXHRcdFx0QlVHKCk7XG4tXHRcdH1cbi1cdFx0YnJlbHNlKGJwKTtcbi1cdH1cbi1cbi1mYWlsOlxuLVx0cGJsb2NrID0gMDtcbi1vdXQ6XG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIChwYmxvY2spO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfdHlwZWQgLSBibWFwIGZvciB0eXBlZCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBpYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFBlcmZvcm1zIHRoZSBibWFwIG9wZXJhdGlvbiBmb3IgdHlwZWQgZXh0ZW50cy5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgZGFkZHJfdFxuLXZ4ZnNfYm1hcF90eXBlZChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCpzYmkgPSBWWEZTX1NCSShpcC1cdTAwM2VpX3NiKTtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBWWEZTX05UWVBFRDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0c3RydWN0IHZ4ZnNfdHlwZWRcdCp0eXAgPSB2aXAtXHUwMDNldmlpX29yZy50eXBlZCAmIzQzOyBpO1xuLVx0XHR1NjRcdFx0XHRoZHIgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9oZHIpO1xuLVx0XHRpbnQ2NF90XHRcdFx0b2ZmID0gKGhkciBcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX3R5cGR1bXAodHlwKTtcbi0jZW5kaWZcbi1cdFx0aWYgKGlibG9jayBcdTAwM2Mgb2ZmKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRzd2l0Y2ggKCh1MzIpKGhkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcbi1cdFx0XHRwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfc2l6ZSksXG4tXHRcdFx0XHRcdGlibG9jayAtIG9mZik7XG4tXHRcdFx0aWYgKHBibG9jayA9PSAtMilcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdHJldHVybiAocGJsb2NrKTtcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEE6XG4tXHRcdFx0aWYgKChpYmxvY2sgLSBvZmYpIFx1MDAzYyBmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9zaXplKSlcbi1cdFx0XHRcdHJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spICYjNDM7XG4tXHRcdFx0XHRcdFx0aWJsb2NrIC0gb2ZmKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O1xcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCYjMzQ7KTtcbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwmIzM0O2Jsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cJiMzNDssXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4tXHRcdGRlZmF1bHQ6XG4tXHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuLVx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4tXHR9XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibWFwMSAtIHZ4ZnMtaW50ZXJuYWwgYm1hcCBvcGVyYXRpb25cbi0gKiBAaXA6XHRcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaWJsb2NrOlx0XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcDEgcGVyZm9tcyBhIGxvZ2ljYWwgdG8gcGh5c2ljYWwgYmxvY2sgbWFwcGluZ1xuLSAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICovXG4tZGFkZHJfdFxuLXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwID0gVlhGU19JTk8oaXApO1xuLVxuLVx0aWYgKFZYRlNfSVNFWFQ0KHZpcCkpXG4tXHRcdHJldHVybiB2eGZzX2JtYXBfZXh0NChpcCwgaWJsb2NrKTtcbi1cdGlmIChWWEZTX0lTVFlQRUQodmlwKSlcbi1cdFx0cmV0dXJuIHZ4ZnNfYm1hcF90eXBlZChpcCwgaWJsb2NrKTtcbi1cdGlmIChWWEZTX0lTTk9ORSh2aXApKVxuLVx0XHRnb3RvIHVuc3VwcDtcbi1cdGlmIChWWEZTX0lTSU1NRUQodmlwKSlcbi1cdFx0Z290byB1bnN1cHA7XG4tXG4tXHRwcmludGsoS0VSTl9XQVJOSU5HIFwmIzM0O3Z4ZnM6IGlub2RlICVsbHUgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxcblwmIzM0Oyxcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdEJVRygpO1xuLVxuLXVuc3VwcDpcbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCYjMzQ7dnhmczogaW5vZGUgJWxsdSBoYXMgYW4gdW5zdXBwb3J0ZWQgb3JndHlwZSAoJXgpXFxuXCYjMzQ7LFxuLVx0XHRcdGlwLVx1MDAzZWlfaW5vLCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLVx0cmV0dXJuIDA7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDhjNjc2MjdmMmEzZDkuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmhcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDY4ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19ESVJfSF9cbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci5cbi0gKlxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cbi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlc1xuLSAqIGEgaGFzaCBmb3Igc3BlZWRpbmcgdXAgZGlyZWN0b3J5IHNlYXJjaCAobG9va3VwKS5cbi0gKlxuLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGVcbi0gKiBMaW51eCBkcml2ZXIgZm9yIG5vdy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaXJibGsge1xuLVx0X19mczE2XHRcdGRfZnJlZTtcdFx0LyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqL1xuLVx0X19mczE2XHRcdGRfbmhhc2g7XHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xuLVx0X19mczE2XHRcdGRfaGFzaFtdO1x0LyogaGFzaCBjaGFpbiAqL1xuLX07XG4tXG4tLypcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcbi0gKlx0b2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tI2RlZmluZSBWWEZTX05BTUVMRU5cdDI1NlxuLVxuLS8qXG4tICogVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tc3RydWN0IHZ4ZnNfZGlyZWN0IHtcbi1cdF9fZnMzMlx0XHRkX2lubztcdFx0XHQvKiBpbm9kZSBudW1iZXIgKi9cbi1cdF9fZnMxNlx0XHRkX3JlY2xlbjtcdFx0LyogcmVjb3JkIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfbmFtZWxlbjtcdFx0LyogZF9uYW1lIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfaGFzaG5leHQ7XHRcdC8qIG5leHQgaGFzaCBlbnRyeSAqL1xuLVx0Y2hhclx0XHRkX25hbWVbVlhGU19OQU1FTEVOXTtcdC8qIG5hbWUgKi9cbi19O1xuLVxuLS8qXG4tICogVlhGU19ESVJQQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJ5IGJvdW5kYXJpZXMsIGlzIF9tdXN0XyBiZVxuLSAqXHRhIG11bHRpcGxlIG9mIGZvdXIuXG4tICogVlhGU19OQU1FTUlOIGlzIHRoZSBsZW5ndGggb2YgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIE5VTEwgZF9uYW1lLlxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcbi0gKlx0dXNhYmxlIGZvciBkaXJlY3Rvcnkgc2l6ZXMuXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcbi0gKlx0YSBkX25hbWUgd2l0aCBzaXplIGxlbi5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSUEFEXHRcdDRcbi0jZGVmaW5lIFZYRlNfTkFNRU1JTlx0XHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcbi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKVx0KChWWEZTX0RJUlBBRCAmIzQzOyAobGVuKSAtIDEpIFx1MDAyNiB+KFZYRlNfRElSUEFEIC0xKSlcbi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbilcdChWWEZTX0RJUlJPVU5EKFZYRlNfTkFNRU1JTiAmIzQzOyAobGVuKSkpXG4tXG4tLypcbi0gKiBWWEZTX0RJUkJMS09WIGlzIHRoZSBvdmVyaGVhZCBvZiBhIHNwZWNpZmljIGRpcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19ESVJCTEtPVihzYmksIGRicClcdFxcXG4tXHQoKHNpemVvZihzaG9ydCkgKiBmczE2X3RvX2NwdShzYmksIGRicC1cdTAwM2VkX25oYXNoKSkgJiM0MzsgNClcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsNDkgJiM0MzswLDAgQEBcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0VYVEVSTl9IX1xuLSNkZWZpbmUgX1ZYRlNfRVhURVJOX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZXh0ZXJuYWwgcHJvdG90eXBlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyBwcm90b3R5cGVzIGZvciBhbGwgdnhmcyBmdW5jdGlvbnMgdXNlZFxuLSAqIG91dHNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBzb3VyY2UgZmlsZXMuXG4tICovXG4tXG4tXG4tc3RydWN0IGttZW1fY2FjaGU7XG4tc3RydWN0IHN1cGVyX2Jsb2NrO1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm87XG4tc3RydWN0IGlub2RlO1xuLVxuLVxuLS8qIHZ4ZnNfYm1hcC5jICovXG4tZXh0ZXJuIGRhZGRyX3RcdFx0XHR2eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqLCBsb25nKTtcbi1cbi0vKiB2eGZzX2ZzaGVhZC5jICovXG4tZXh0ZXJuIGludFx0XHRcdHZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICopO1xuLVxuLS8qIHZ4ZnNfaW5vZGUuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfaW1tZWRfYW9wcztcbi1leHRlcm4gdm9pZFx0XHRcdHZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqLCBpbm9fdCk7XG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVx0XHQqdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1X2xvbmcsIGlub190KTtcbi1leHRlcm4gc3RydWN0IGlub2RlXHRcdCp2eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpO1xuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcdFx0KnZ4ZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpO1xuLWV4dGVybiB2b2lkXHRcdFx0dnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7XG4tXG4tLyogdnhmc19sb29rdXAuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9uc1x0dnhmc19kaXJfaW5vZGVfb3BzO1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zXHR2eGZzX2Rpcl9vcGVyYXRpb25zO1xuLVxuLS8qIHZ4ZnNfb2x0LmMgKi9cbi1leHRlcm4gaW50XHRcdFx0dnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTtcbi1cbi0vKiB2eGZzX3N1YnIuYyAqL1xuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wcztcbi1leHRlcm4gc3RydWN0IHBhZ2UgKlx0XHR2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7XG4tZXh0ZXJuIHZvaWRcdFx0XHR2eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICopO1xuLWV4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlx0dnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRVhURVJOX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZTZhYjhiZGY3YTZjYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTY2ICYjNDM7MCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzZXQgaGVhZGVyIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnMuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2ZzaGVhZC5oXCYjMzQ7XG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfZHVtcGZzaChzdHJ1Y3Qgdnhmc19mc2ggKmZocClcbi17XG4tXHRwcmludGsoXCYjMzQ7XFxuXFxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcXG5cJiMzNDspO1xuLVx0cHJpbnRrKFwmIzM0Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cJiMzNDspO1xuLVx0cHJpbnRrKFwmIzM0O3ZlcnNpb246ICV1XFxuXCYjMzQ7LCBmaHAtXHUwMDNlZnNoX3ZlcnNpb24pO1xuLVx0cHJpbnRrKFwmIzM0O2ZzaW5kZXg6ICV1XFxuXCYjMzQ7LCBmaHAtXHUwMDNlZnNoX2ZzaW5kZXgpO1xuLVx0cHJpbnRrKFwmIzM0O2lhdWlubzogJXVcXHRuaW5vZGVzOiV1XFxuXCYjMzQ7LFxuLVx0XHRcdGZocC1cdTAwM2Vmc2hfaWF1aW5vLCBmaHAtXHUwMDNlZnNoX25pbm9kZXMpO1xuLVx0cHJpbnRrKFwmIzM0O21heGlub2RlOiAldVxcdGxjdGlubzogJXVcXG5cJiMzNDssXG4tXHRcdFx0ZmhwLVx1MDAzZWZzaF9tYXhpbm9kZSwgZmhwLVx1MDAzZWZzaF9sY3Rpbm8pO1xuLVx0cHJpbnRrKFwmIzM0O25hdTogJXVcXG5cJiMzNDssIGZocC1cdTAwM2Vmc2hfbmF1KTtcbi1cdHByaW50ayhcJiMzNDtpbGlzdGlub1swXTogJXVcXHRpbGlzdGlub1sxXTogJXVcXG5cJiMzNDssXG4tXHRcdFx0ZmhwLVx1MDAzZWZzaF9pbGlzdGlub1swXSwgZmhwLVx1MDAzZWZzaF9pbGlzdGlub1sxXSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeVxuLSAqIEBpcDpcdFx0dGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZVxuLSAqIEB3aGljaDpcdDAgZm9yIHRoZSBzdHJ1Y3R1cmFsLCAxIGZvciB0aGUgcHJpbWFyeSBmc2guXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfZ2V0ZnNoIHJlYWRzIGVpdGhlciB0aGUgc3RydWN0dXJhbCBvciBwcmltYXJ5IGZpbGVzZXQgaGVhZGVyXG4tICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19mc2ggKlxuLXZ4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaClcbi17XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwO1xuLVxuLVx0YnAgPSB2eGZzX2JyZWFkKGlwLCB3aGljaCk7XG4tXHRpZiAoYnApIHtcbi1cdFx0c3RydWN0IHZ4ZnNfZnNoXHRcdCpmaHA7XG4tXG4tXHRcdGlmICghKGZocCA9IGttYWxsb2Nfb2JqKCpmaHApKSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0bWVtY3B5KGZocCwgYnAtXHUwMDNlYl9kYXRhLCBzaXplb2YoKmZocCkpO1xuLVxuLVx0XHRwdXRfYmgoYnApO1xuLVx0XHRyZXR1cm4gKGZocCk7XG4tXHR9XG4tb3V0OlxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRfZnNoZWFkIC0gcmVhZCB0aGUgZmlsZXNldCBoZWFkZXJzXG4tICogQHNicDpcdHN1cGVyYmxvY2sgdG8gd2hpY2ggdGhlIGZpbGVzZXQgYmVsb25nc1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3JlYWRfZnNoZWFkIHdpbGwgZmlsbCB0aGUgaW5vZGUgYW5kIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbiBAc2IuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSAoLUVJTlZBTCkuXG4tICovXG4taW50XG4tdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicClcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCppbmZwID0gVlhGU19TQkkoc2JwKTtcbi1cdHN0cnVjdCB2eGZzX2ZzaFx0XHRcdCpwZnAsICpzZnA7XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXA7XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9mc2hpcCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsIGluZnAtXHUwMDNldnNpX2ZzaGlubyk7XG4tXHRpZiAoIWluZnAtXHUwMDNldnNpX2ZzaGlwKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2ggaW5vZGVcXG5cJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdH1cbi1cbi1cdHZpcCA9IFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2ZzaGlwKTtcbi1cdGlmICghVlhGU19JU0ZTSCh2aXApKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiBmc2ggbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXG5cJiMzNDssXG4tXHRcdFx0XHR2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHByaW50ayhcJiMzNDt2eGZzOiBmc2ggaW5vZGUgZHVtcDpcXG5cJiMzNDspO1xuLVx0dnhmc19kdW1waSh2aXAsIGluZnAtXHUwMDNldnNpX2ZzaGlubyk7XG4tI2VuZGlmXG4tXG4tXHRzZnAgPSB2eGZzX2dldGZzaChpbmZwLVx1MDAzZXZzaV9mc2hpcCwgMCk7XG4tXHRpZiAoIXNmcCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxcblwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9IFxuLVxuLSNpZmRlZiBESUFHTk9TVElDXG4tXHR2eGZzX2R1bXBmc2goc2ZwKTtcbi0jZW5kaWZcbi1cbi1cdHBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtXHUwMDNldnNpX2ZzaGlwLCAxKTtcbi1cdGlmICghcGZwKSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IHByaW1hcnkgZnNoXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBvdXRfZnJlZV9zZnA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChwZnApO1xuLSNlbmRpZlxuLVxuLVx0aW5mcC1cdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsXG4tXHRcdFx0ZnMzMl90b19jcHUoaW5mcCwgc2ZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IHN0cnVjdHVyYWwgbGlzdCBpbm9kZVxcblwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0X2ZyZWVfcGZwO1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX3N0aWxpc3QpKSkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogc3RydWN0dXJhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxcblwmIzM0Oyxcbi1cdFx0XHRcdFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX3N0aWxpc3QpLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7IFxuLVx0XHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XG4tXHR9XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9pbGlzdCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBpbm9kZSBsaXN0IGlub2RlXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBvdXRfaXB1dF9zdGlsaXN0O1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwmIzM0O3Z4ZnM6IGlub2RlIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxuXCYjMzQ7LFxuLVx0XHRcdFx0VlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfaWxpc3QpLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7XG4tXHRcdGdvdG8gb3V0X2lwdXRfaWxpc3Q7XG4tXHR9XG4tXG4tXHRrZnJlZShwZnApO1xuLVx0a2ZyZWUoc2ZwKTtcbi1cdHJldHVybiAwO1xuLVxuLSBvdXRfaXB1dF9pbGlzdDpcbi0gXHRpcHV0KGluZnAtXHUwMDNldnNpX2lsaXN0KTtcbi0gb3V0X2lwdXRfc3RpbGlzdDpcbi0gXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLSBvdXRfZnJlZV9wZnA6XG4tXHRrZnJlZShwZnApO1xuLSBvdXRfZnJlZV9zZnA6XG4tIFx0a2ZyZWUoc2ZwKTtcbi0gb3V0X2lwdXRfZnNoaXA6XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX2ZzaGlwKTtcbi1cdHJldHVybiAtRUlOVkFMO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBkZmQyMTQ3NTk5YzQ5Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSw0MyAmIzQzOzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0ZTSEVBRF9IX1xuLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTXG4tICogZmlsZXNldCBoZWFkZXIuXG4tICovXG4tXG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19mc2gge1xuLVx0X19mczMyXHRcdGZzaF92ZXJzaW9uO1x0XHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2ZzaW5kZXg7XHRcdC8qIGZpbGVzZXQgaW5kZXggKi9cbi1cdF9fZnMzMlx0XHRmc2hfdGltZTtcdFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cbi1cdF9fZnMzMlx0XHRmc2hfdXRpbWU7XHRcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdGZzaF9leHRvcDtcdFx0LyogZXh0b3AgZmxhZ3MgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbmlub2RlcztcdFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdGZzaF9uYXU7XHRcdC8qIG51bWJlciBvZiBJQVVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX29sZF9pbGVzaXplO1x0Lyogb2xkIHNpemUgb2YgaWxpc3QgKi9cbi1cdF9fZnMzMlx0XHRmc2hfZGZsYWdzO1x0XHQvKiBmbGFncyAqL1xuLVx0X19mczMyXHRcdGZzaF9xdW90YTtcdFx0LyogcXVvdGEgbGltaXQgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbWF4aW5vZGU7XHRcdC8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lhdWlubztcdFx0LyogSUFVIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lsaXN0aW5vWzJdO1x0LyogaWxpc3QgaW5vZGVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2xjdGlubztcdFx0LyogbGluayBjb3VudCB0YWJsZSBpbm9kZSAqL1xuLVxuLVx0Lypcbi1cdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcbi1cdCAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZFxuLVx0ICogIGIpIGRpZmZlciBhIGxvdCBpbiBkaWZmZXJlbnQgdnhmcyB2ZXJzaW9ucy9wb3J0c1xuLVx0ICovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsNTMgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBwb3J0IGZvciAmIzM5O2ltbWVkJiMzOTsgaW5vZGVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19pbm9kZS5oXCYjMzQ7XG4tXG4tLyoqXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXG4tICogQGZwOlx0XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ltbWVkX3JlYWRfZm9saW8gcmVhZHMgYSBwYXJ0IG9mIHRoZSBpbW1lZCBhcmVhIG9mIHRoZVxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKlxuLSAqIExvY2tpbmcgc3RhdHVzOlxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2Vob3N0KTtcbi1cdHZvaWQgKnNyYyA9IHZpcC1cdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQgJiM0MzsgZm9saW9fcG9zKGZvbGlvKTtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsgaSYjNDM7JiM0MzspIHtcbi1cdFx0bWVtY3B5X3RvX3BhZ2UoZm9saW9fcGFnZShmb2xpbywgaSksIDAsIHNyYywgUEFHRV9TSVpFKTtcbi1cdFx0c3JjICYjNDM7PSBQQUdFX1NJWkU7XG4tXHR9XG4tXG4tXHRmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTtcbi1cdGZvbGlvX3VubG9jayhmb2xpbyk7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tLypcbi0gKiBBZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy5cbi0gKi9cbi1jb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfaW1tZWRfYW9wcyA9IHtcbi1cdC5yZWFkX2ZvbGlvID1cdHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyxcbi19O1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyMWZjOTRiOTgyMDlmLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDMxNCAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBpbm9kZSByb3V0aW5lcy5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnMuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLS8qXG4tICogRHVtcCBpbm9kZSBjb250ZW50cyAocGFydGlhbGx5KS5cbi0gKi9cbi12b2lkXG4tdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubylcbi17XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtcXG5cXG5cJiMzNDspO1xuLVx0aWYgKGlubylcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7ZHVtcGluZyB2eGZzIGlub2RlICVsZFxcblwmIzM0OywgaW5vKTtcbi1cdGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7ZHVtcGluZyB1bmtub3duIHZ4ZnMgaW5vZGVcXG5cJiMzNDspO1xuLVxuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCYjMzQ7KTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O21vZGUgaXMgJXhcXG5cJiMzNDssIHZpcC1cdTAwM2V2aWlfbW9kZSk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcXG5cJiMzNDssXG4tXHRcdFx0dmlwLVx1MDAzZXZpaV9ubGluaywgdmlwLVx1MDAzZXZpaV91aWQsIHZpcC1cdTAwM2V2aWlfZ2lkKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3NpemU6JUx4LCBibG9ja3M6JXVcXG5cJiMzNDssXG4tXHRcdFx0dmlwLVx1MDAzZXZpaV9zaXplLCB2aXAtXHUwMDNldmlpX2Jsb2Nrcyk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcJiMzNDtvcmd0eXBlOiV1XFxuXCYjMzQ7LCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX3RyYW5zbW9kIC0gbW9kZSBmb3IgYSBWeEZTIGlub2RlXG4tICogQHZpcDpcdFZ4RlMgaW5vZGVcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cbi0gKiAgVnhGUyBpbm9kZSBzdHJ1Y3R1cmUuXG4tICovXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxuLXZ4ZnNfdHJhbnNtb2Qoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKVxuLXtcbi1cdHVtb2RlX3RcdFx0XHRyZXQgPSB2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcbi1cbi1cdGlmIChWWEZTX0lTRklGTyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRklGTztcbi1cdGlmIChWWEZTX0lTQ0hSKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGQ0hSO1xuLVx0aWYgKFZYRlNfSVNESVIodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZESVI7XG4tXHRpZiAoVlhGU19JU0JMSyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRkJMSztcbi1cdGlmIChWWEZTX0lTTE5LKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGTE5LO1xuLVx0aWYgKFZYRlNfSVNSRUcodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZSRUc7XG4tXHRpZiAoVlhGU19JU1NPQyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRlNPQ0s7XG4tXG4tXHRyZXR1cm4gKHJldCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXG4te1xuLVx0c3RydWN0IGlub2RlICppbm9kZSA9IFx1MDAyNnZpcC1cdTAwM2V2ZnNfaW5vZGU7XG4tXG4tXHR2aXAtXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfbW9kZSk7XG4tXHR2aXAtXHUwMDNldmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX25saW5rKTtcbi1cdHZpcC1cdTAwM2V2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3VpZCk7XG4tXHR2aXAtXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9naWQpO1xuLVx0dmlwLVx1MDAzZXZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3NpemUpO1xuLVx0dmlwLVx1MDAzZXZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9vcmd0eXBlID0gZGlwLVx1MDAzZXZkaV9vcmd0eXBlO1xuLVxuLVx0dmlwLVx1MDAzZXZpaV9ibG9ja3MgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfYmxvY2tzKTtcbi1cdHZpcC1cdTAwM2V2aWlfZ2VuID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX2dlbik7XG4tXG4tXHRpZiAoVlhGU19JU0RJUih2aXApKVxuLVx0XHR2aXAtXHUwMDNldmlpX2RvdGRvdCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9kb3Rkb3QpO1xuLVx0ZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSBcdTAwMjZcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcbi1cdFx0dmlwLVx1MDAzZXZpaV9yZGV2ID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3JkZXYpO1xuLVxuLVx0LyogZG9uJiMzOTt0IGVuZGlhbiBzd2FwIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYnkgb3JndHlwZSAqL1xuLVx0bWVtY3B5KFx1MDAyNnZpcC1cdTAwM2V2aWlfb3JnLCBcdTAwMjZkaXAtXHUwMDNldmRpX29yZywgc2l6ZW9mKHZpcC1cdTAwM2V2aWlfb3JnKSk7XG4tXG4tXHRpbm9kZS1cdTAwM2VpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7XG4tXHRpX3VpZF93cml0ZShpbm9kZSwgKHVpZF90KXZpcC1cdTAwM2V2aWlfdWlkKTtcbi1cdGlfZ2lkX3dyaXRlKGlub2RlLCAoZ2lkX3QpdmlwLVx1MDAzZXZpaV9naWQpO1xuLVxuLVx0c2V0X25saW5rKGlub2RlLCB2aXAtXHUwMDNldmlpX25saW5rKTtcbi1cdGlub2RlLVx1MDAzZWlfc2l6ZSA9IHZpcC1cdTAwM2V2aWlfc2l6ZTtcbi1cbi1cdGlub2RlX3NldF9hdGltZShpbm9kZSwgdmlwLVx1MDAzZXZpaV9hdGltZSwgMCk7XG4tXHRpbm9kZV9zZXRfY3RpbWUoaW5vZGUsIHZpcC1cdTAwM2V2aWlfY3RpbWUsIDApO1xuLVx0aW5vZGVfc2V0X210aW1lKGlub2RlLCB2aXAtXHUwMDNldmlpX210aW1lLCAwKTtcbi1cbi1cdGlub2RlLVx1MDAzZWlfYmxvY2tzID0gdmlwLVx1MDAzZXZpaV9ibG9ja3M7XG4tXHRpbm9kZS1cdTAwM2VpX2dlbmVyYXRpb24gPSB2aXAtXHUwMDNldmlpX2dlbjtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibGtpZ2V0IC0gZmluZCBpbm9kZSBiYXNlZCBvbiBleHRlbnQgI1xuLSAqIEBzYnA6XHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpblxuLSAqIEBleHRlbnQ6XHRudW1iZXIgb2YgdGhlIGV4dGVudCB0byBzZWFyY2hcbi0gKiBAaW5vOlx0aW5vZGUgbnVtYmVyIHRvIHNlYXJjaFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIHZ4ZnNfYmxraWdldCBzZWFyY2hlcyBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieVxuLSAqICBAc2JwIGluIHRoZSBleHRlbnQgQGV4dGVudC5cbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqXG4tICogTk9URTpcbi0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZVxuLSAqICBidWZmZXJjYWNoZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUgdGhlXG4tICogIHJlYWRfc3VwZXIoKSBtZXRob2QsIG90aGVyd2lzZSB0aGUgZGF0YSBtYXkgYmUgaW5jb2hlcmVudC5cbi0gKi9cbi1zdHJ1Y3QgaW5vZGUgKlxuLXZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGV4dGVudCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZFx0XHQqYnA7XG4tXHRzdHJ1Y3QgaW5vZGVcdFx0XHQqaW5vZGU7XG4tXHR1X2xvbmdcdFx0XHRcdGJsb2NrLCBvZmZzZXQ7XG4tXG4tXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xuLVx0aWYgKCFpbm9kZSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRpbm9kZS1cdTAwM2VpX2lubyA9IGdldF9uZXh0X2lubygpO1xuLVxuLVx0YmxvY2sgPSBleHRlbnQgJiM0MzsgKChpbm8gKiBWWEZTX0lTSVpFKSAvIHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4tXHRvZmZzZXQgPSAoKGlubyAlIChzYnAtXHUwMDNlc19ibG9ja3NpemUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFKTtcbi1cdGJwID0gc2JfYnJlYWQoc2JwLCBibG9jayk7XG4tXG4tXHRpZiAoYnAgXHUwMDI2XHUwMDI2IGJ1ZmZlcl9tYXBwZWQoYnApKSB7XG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cdCp2aXAgPSBWWEZTX0lOTyhpbm9kZSk7XG4tXHRcdHN0cnVjdCB2eGZzX2Rpbm9kZVx0KmRpcDtcbi1cbi1cdFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShicC1cdTAwM2ViX2RhdGEgJiM0Mzsgb2Zmc2V0KTtcbi1cdFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xuLVx0XHR2aXAtXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcbi0jZW5kaWZcbi1cdFx0YnJlbHNlKGJwKTtcbi1cdFx0cmV0dXJuIGlub2RlO1xuLVx0fVxuLVxuLVx0cHJpbnRrKEtFUk5fV0FSTklORyBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBibG9jayAlbGRcXG5cJiMzNDssIGJsb2NrKTtcbi1cdGJyZWxzZShicCk7XG4tXHRpcHV0KGlub2RlKTtcbi1cdHJldHVybiBOVUxMO1xuLX1cbi1cbi0vKipcbi0gKiBfX3Z4ZnNfaWdldCAtIGdlbmVyaWMgZmluZCBpbm9kZSBmYWNpbGl0eVxuLSAqIEBpbGlzdHA6XHRcdGlub2RlIGxpc3Rcbi0gKiBAdmlwOlx0XHRWeEZTIGlub2RlIHRvIGZpbGwgaW5cbi0gKiBAaW5vOlx0XHRpbm9kZSBudW1iZXJcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbVxuLSAqICBkZXNjcmliZWQgYnkgQHNicC4gIFVzZSB0aGUgc3BlY2lmaWVkIGlub2RlIHRhYmxlIChAaWxpc3RwKS5cbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhbiBlcnJvciBjb2RlLlxuLSAqL1xuLXN0YXRpYyBpbnRcbi1fX3Z4ZnNfaWdldChzdHJ1Y3QgaW5vZGUgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IHBhZ2VcdFx0XHQqcHA7XG4tXHR1X2xvbmdcdFx0XHRcdG9mZnNldDtcbi1cbi1cdG9mZnNldCA9IChpbm8gJSAoUEFHRV9TSVpFIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRTtcbi1cdHBwID0gdnhmc19nZXRfcGFnZShpbGlzdHAtXHUwMDNlaV9tYXBwaW5nLCBpbm8gKiBWWEZTX0lTSVpFIC8gUEFHRV9TSVpFKTtcbi1cbi1cdGlmICghSVNfRVJSKHBwKSkge1xuLVx0XHRzdHJ1Y3Qgdnhmc19kaW5vZGVcdCpkaXA7XG4tXHRcdGNhZGRyX3RcdFx0XHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcbi1cbi1cdFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShrYWRkciAmIzQzOyBvZmZzZXQpO1xuLVx0XHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXHUwMDNlaV9zYiksIHZpcCwgZGlwKTtcbi1cdFx0dmlwLVx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc19kdW1waSh2aXAsIGlubyk7XG4tI2VuZGlmXG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCYjMzQ7dnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcXG5cJiMzNDssXG4tXHRcdHBwLCAodW5zaWduZWQgbG9uZylpbm8pO1xuLVx0cmV0dXJuIFBUUl9FUlIocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3N0aWdldCAtIGZpbmQgaW5vZGUgdXNpbmcgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdFxuLSAqIEBzYnA6XHRWRlMgc3VwZXJibG9ja1xuLSAqIEBpbm86XHRpbm9kZSAjXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nXG4tICogIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QuXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICovXG4tc3RydWN0IGlub2RlICpcbi12eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xuLVx0aWYgKCFpbm9kZSlcbi1cdFx0cmV0dXJuIE5VTEw7XG4tXHRpbm9kZS1cdTAwM2VpX2lubyA9IGdldF9uZXh0X2lubygpO1xuLVxuLVx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVx1MDAzZXZzaV9zdGlsaXN0LCBWWEZTX0lOTyhpbm9kZSksIGlubyk7XG4tXHRpZiAoZXJyb3IpIHtcbi1cdFx0aXB1dChpbm9kZSk7XG4tXHRcdHJldHVybiBOVUxMO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGlub2RlO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2lnZXQgLSBnZXQgYW4gaW5vZGVcbi0gKiBAc2JwOlx0dGhlIHN1cGVyYmxvY2sgdG8gZ2V0IHRoZSBpbm9kZSBmb3Jcbi0gKiBAaW5vOlx0dGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gZ2V0XG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19yZWFkX2lub2RlIGNyZWF0ZXMgYW4gaW5vZGUsIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaW5vIGFuZCBmaWxsc1xuLSAqICBpbiBhbGwgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBuZXcgaW5vZGUuXG4tICovXG4tc3RydWN0IGlub2RlICpcbi12eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXA7XG4tXHRjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zXHQqYW9wcztcbi1cdHN0cnVjdCBpbm9kZSAqaXA7XG4tXHRpbnQgZXJyb3I7XG4tXG4tXHRpcCA9IGlnZXRfbG9ja2VkKHNicCwgaW5vKTtcbi1cdGlmICghaXApXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuLVx0aWYgKCEoaW5vZGVfc3RhdGVfcmVhZF9vbmNlKGlwKSBcdTAwMjYgSV9ORVcpKVxuLVx0XHRyZXR1cm4gaXA7XG4tXG4tXHR2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXHRlcnJvciA9IF9fdnhmc19pZ2V0KFZYRlNfU0JJKHNicCktXHUwMDNldnNpX2lsaXN0LCB2aXAsIGlubyk7XG4tXHRpZiAoZXJyb3IpIHtcbi1cdFx0aWdldF9mYWlsZWQoaXApO1xuLVx0XHRyZXR1cm4gRVJSX1BUUihlcnJvcik7XG4tXHR9XG4tXG4tXHRpZiAoVlhGU19JU0lNTUVEKHZpcCkpXG4tXHRcdGFvcHMgPSBcdTAwMjZ2eGZzX2ltbWVkX2FvcHM7XG4tXHRlbHNlXG4tXHRcdGFvcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tXG4tXHRpZiAoU19JU1JFRyhpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlwLVx1MDAzZWlfZm9wID0gXHUwMDI2Z2VuZXJpY19yb19mb3BzO1xuLVx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBhb3BzO1xuLVx0fSBlbHNlIGlmIChTX0lTRElSKGlwLVx1MDAzZWlfbW9kZSkpIHtcbi1cdFx0aXAtXHUwMDNlaV9vcCA9IFx1MDAyNnZ4ZnNfZGlyX2lub2RlX29wcztcbi1cdFx0aXAtXHUwMDNlaV9mb3AgPSBcdTAwMjZ2eGZzX2Rpcl9vcGVyYXRpb25zO1xuLVx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBhb3BzO1xuLVx0fSBlbHNlIGlmIChTX0lTTE5LKGlwLVx1MDAzZWlfbW9kZSkpIHtcbi1cdFx0aWYgKCFWWEZTX0lTSU1NRUQodmlwKSkge1xuLVx0XHRcdGlwLVx1MDAzZWlfb3AgPSBcdTAwMjZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcbi1cdFx0XHRpbm9kZV9ub2hpZ2htZW0oaXApO1xuLVx0XHRcdGlwLVx1MDAzZWlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRpcC1cdTAwM2VpX29wID0gXHUwMDI2c2ltcGxlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcbi1cdFx0XHRpcC1cdTAwM2VpX2xpbmsgPSB2aXAtXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkO1xuLVx0XHRcdG5kX3Rlcm1pbmF0ZV9saW5rKGlwLVx1MDAzZWlfbGluaywgaXAtXHUwMDNlaV9zaXplLFxuLVx0XHRcdFx0XHQgIHNpemVvZih2aXAtXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpO1xuLVx0XHR9XG4tXHR9IGVsc2Vcbi1cdFx0aW5pdF9zcGVjaWFsX2lub2RlKGlwLCBpcC1cdTAwM2VpX21vZGUsIG9sZF9kZWNvZGVfZGV2KHZpcC1cdTAwM2V2aWlfcmRldikpO1xuLVxuLVx0dW5sb2NrX25ld19pbm9kZShpcCk7XG4tXHRyZXR1cm4gaXA7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfZXZpY3RfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeVxuLSAqIEBpcDpcdFx0aW5vZGUgdG8gZGlzY2FyZC5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX2V2aWN0X2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZVxuLSAqICBpbm9kZSBhcmVhLlxuLSAqL1xuLXZvaWRcbi12eGZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaXApXG4te1xuLVx0dHJ1bmNhdGVfaW5vZGVfcGFnZXNfZmluYWwoXHUwMDI2aXAtXHUwMDNlaV9kYXRhKTtcbi1cdGNsZWFyX2lub2RlKGlwKTtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDFlOWUxMzhkMmIzMzguLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTY5ICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cbi0jZGVmaW5lIF9WWEZTX0lOT0RFX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uXG4tICovXG4tXG4tXG4tI2RlZmluZSBWWEZTX0lTSVpFXHRcdDB4MTAwXHRcdC8qIElub2RlIHNpemUgKi9cbi1cbi0jZGVmaW5lIFZYRlNfTkRBRERSXHRcdDEwXHRcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cbi0jZGVmaW5lIFZYRlNfTklBRERSXHRcdDJcdFx0LyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05JTU1FRFx0XHQ5Nlx0XHQvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05UWVBFRFx0XHQ2XHRcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0tcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXG4tI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLXHQoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKVxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcdDU2XG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXG4tXHQoKHNicCktXHUwMDNlc19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKVxuLVxuLS8qXG4tICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19UWVBFRF9JTkRJUkVDVFx0XHQ9IDEsXG4tXHRWWEZTX1RZUEVEX0RBVEFcdFx0XHQ9IDIsXG4tXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcdD0gMyxcbi1cdFZYRlNfVFlQRURfREFUQV9ERVY0XHRcdD0gNCxcbi19O1xuLVxuLS8qXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxuLSAqL1xuLXN0cnVjdCB2eGZzX2ltbWVkIHtcbi1cdF9fdThcdFx0XHR2aV9pbW1lZFtWWEZTX05JTU1FRF07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc19leHQ0IHtcbi1cdF9fZnMzMlx0XHRcdHZlNF9zcGFyZTtcdFx0LyogPz8gKi9cbi1cdF9fZnMzMlx0XHRcdHZlNF9pbmRzaXplO1x0XHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xuLVx0X19mczMyXHRcdFx0dmU0X2luZGlyW1ZYRlNfTklBRERSXTtcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cbi1cdHN0cnVjdCBkaXJlY3Qge1x0XHRcdFx0XHQvKiBEaXJlY3QgZXh0ZW50cyAqL1xuLVx0XHRfX2ZzMzJcdFx0ZXh0ZW50O1x0XHRcdC8qIEV4dGVudCBudW1iZXIgKi9cbi1cdFx0X19mczMyXHRcdHNpemU7XHRcdFx0LyogU2l6ZSBvZiBleHRlbnQgKi9cbi1cdH0gdmU0X2RpcmVjdFtWWEZTX05EQUREUl07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZCB7XG4tXHRfX2ZzNjRcdFx0dnRfaGRyO1x0XHQvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqL1xuLVx0X19mczMyXHRcdHZ0X2Jsb2NrO1x0LyogRXh0ZW50IGJsb2NrICovXG4tXHRfX2ZzMzJcdFx0dnRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHtcbi1cdF9fZnM2NFx0XHR2ZDRfaGRyO1x0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfYmxvY2s7XHQvKiBFeHRlbnQgYmxvY2sgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dmQ0X2RldjtcdC8qIERldmljZSBJRCAqL1xuLVx0X191OFx0XHRfX3BhZDE7XG4tfTtcbi1cbi0vKlxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaW5vZGUge1xuLVx0X19mczMyXHRcdHZkaV9tb2RlO1xuLVx0X19mczMyXHRcdHZkaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfdWlkO1x0LyogVUlEICovXG4tXHRfX2ZzMzJcdFx0dmRpX2dpZDtcdC8qIEdJRCAqL1xuLVx0X19mczY0XHRcdHZkaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdGltZTtcdC8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdXRpbWU7XHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9tdXRpbWU7XHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9jdGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2ZGlfYWZsYWdzO1x0LyogQWxsb2NhdGlvbiBmbGFncyAqL1xuLVx0X191OFx0XHR2ZGlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHRfX2ZzMTZcdFx0dmRpX2VvcGZsYWdzO1xuLVx0X19mczMyXHRcdHZkaV9lb3BkYXRhO1xuLVx0dW5pb24ge1xuLVx0XHRfX2ZzMzJcdFx0XHRyZGV2O1xuLVx0XHRfX2ZzMzJcdFx0XHRkb3Rkb3Q7XG4tXHRcdHN0cnVjdCB7XG4tXHRcdFx0X191MzJcdFx0cmVzZXJ2ZWQ7XG4tXHRcdFx0X19mczMyXHRcdGZpeGV4dHNpemU7XG4tXHRcdH0gaV9yZWd1bGFyO1xuLVx0XHRzdHJ1Y3Qge1xuLVx0XHRcdF9fZnMzMlx0XHRtYXRjaGlubztcbi1cdFx0XHRfX2ZzMzJcdFx0ZnNldGluZGV4O1xuLVx0XHR9IGlfdnhzcGVjO1xuLVx0XHRfX3U2NFx0XHRcdGFsaWduO1xuLVx0fSB2ZGlfZnRhcmVhO1xuLVx0X19mczMyXHRcdHZkaV9ibG9ja3M7XHQvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0X19mczY0XHRcdHZkaV92ZXJzaW9uO1x0LyogVmVyc2lvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZkaV9vcmc7XG4tXHRfX2ZzMzJcdFx0dmRpX2lhdHRyaW5vO1xuLX07XG4tXG4tI2RlZmluZSB2ZGlfcmRldlx0dmRpX2Z0YXJlYS5yZGV2XG4tI2RlZmluZSB2ZGlfZG90ZG90XHR2ZGlfZnRhcmVhLmRvdGRvdFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcdHZkaV9mdGFyZWEucmVndWxhci5maXhleHRzaXplXG4tI2RlZmluZSB2ZGlfbWF0Y2hpbm9cdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXG4tI2RlZmluZSB2ZGlfZnNldGluZGV4XHR2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXhcbi1cbi0jZGVmaW5lIHZkaV9pbW1lZFx0dmRpX29yZy5pbW1lZFxuLSNkZWZpbmUgdmRpX2V4dDRcdHZkaV9vcmcuZXh0NFxuLSNkZWZpbmUgdmRpX3R5cGVkXHR2ZGlfb3JnLnR5cGVkXG4tXG4tXG4tLypcbi0gKiBUaGUgaW5vZGUgYXMgcmVwcmVzZW50ZWQgaW4gdGhlIG1haW4gbWVtb3J5LlxuLSAqL1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xuLVx0c3RydWN0IGlub2RlXHR2ZnNfaW5vZGU7XG4tXG4tXHRfX3UzMlx0XHR2aWlfbW9kZTtcbi1cdF9fdTMyXHRcdHZpaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fdTMyXHRcdHZpaV91aWQ7XHQvKiBVSUQgKi9cbi1cdF9fdTMyXHRcdHZpaV9naWQ7XHQvKiBHSUQgKi9cbi1cdF9fdTY0XHRcdHZpaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X191MzJcdFx0dmlpX2F0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXG4tXHRfX3UzMlx0XHR2aWlfYXV0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqL1xuLVx0X191MzJcdFx0dmlpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX211dGltZTtcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXG4tXHRfX3UzMlx0XHR2aWlfY3RpbWU7XHQvKiBDcmVhdGUgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2aWlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHR1bmlvbiB7XG4tXHRcdF9fdTMyXHRcdFx0cmRldjtcbi1cdFx0X191MzJcdFx0XHRkb3Rkb3Q7XG4tXHR9IHZpaV9mdGFyZWE7XG4tXHRfX3UzMlx0XHR2aWlfYmxvY2tzO1x0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXG4tXHRfX3UzMlx0XHR2aWlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZpaV9vcmc7XG4tfTtcbi1cbi0jZGVmaW5lIHZpaV9yZGV2XHR2aWlfZnRhcmVhLnJkZXZcbi0jZGVmaW5lIHZpaV9kb3Rkb3RcdHZpaV9mdGFyZWEuZG90ZG90XG4tXG4tI2RlZmluZSB2aWlfaW1tZWRcdHZpaV9vcmcuaW1tZWRcbi0jZGVmaW5lIHZpaV9leHQ0XHR2aWlfb3JnLmV4dDRcbi0jZGVmaW5lIHZpaV90eXBlZFx0dmlpX29yZy50eXBlZFxuLVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xuLX1cbi1cbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwyNzMgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gbG9va3VwIGFuZCBvdGhlciBkaXJlY3RvcnkgcmVsYXRlZCBjb2RlLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdGltZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2hpZ2htZW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCYjMzQ7dnhmcy5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19kaXIuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi0vKlxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS1cdTAwM2VzX2Jsb2Nrc2l6ZSkpXG4tXG4tXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlx0dnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTtcbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7XG4tXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xuLVx0Lmxvb2t1cCA9XHRcdHZ4ZnNfbG9va3VwLFxuLX07XG4tXG4tY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0ge1xuLVx0Lmxsc2VlayA9XHRcdGdlbmVyaWNfZmlsZV9sbHNlZWssXG4tXHQucmVhZCA9XHRcdFx0Z2VuZXJpY19yZWFkX2Rpcixcbi1cdC5pdGVyYXRlX3NoYXJlZCA9XHR2eGZzX3JlYWRkaXIsXG4tXHQuc2V0bGVhc2UgPVx0XHRnZW5lcmljX3NldGxlYXNlLFxuLX07XG4tXG4tXG4tLyoqXG4tICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeVxuLSAqIEBpcDpcdFx0ZGlyZWN0b3J5IGlub2RlXG4tICogQGRwOlx0XHRkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdFxuLSAqIEBwcHA6XHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcdTAwMjZzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5XG4tICogICBjYWNoZSBlbnRyeSBAZHAuICBAcHBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBhZ2UgdGhlIHJldHVyblxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19kaXJlY3QgKlxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXG4te1xuLVx0dV9sb25nIGJzaXplID0gaXAtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNvbnN0IGNoYXIgKm5hbWUgPSBkcC1cdTAwM2VkX25hbWUubmFtZTtcbi1cdGludCBuYW1lbGVuID0gZHAtXHUwMDNlZF9uYW1lLmxlbjtcbi1cdGxvZmZfdCBsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXHUwMDNlaV9zaXplKTtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGVfZXhpdCA9IE5VTEw7XG4tXHRsb2ZmX3QgcG9zID0gMDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLVx1MDAzZWlfc2IpO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICYjNDM7IChwb3MgXHUwMDI2IH5QQUdFX01BU0spKTtcbi1cdFx0XHRcdGludCBvdmVyaGVhZCA9IFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApO1xuLVxuLVx0XHRcdFx0cG9zICYjNDM7PSBvdmVyaGVhZDtcbi1cdFx0XHRcdHBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciAmIzQzOyBwZ19vZnMpO1xuLVxuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9yZWNsZW4pIHtcbi1cdFx0XHRcdHBvcyAmIzQzOz0gYnNpemUgLSAxO1xuLVx0XHRcdFx0cG9zIFx1MDAyNj0gfihic2l6ZSAtIDEpO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdHBnX29mcyAmIzQzOz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfcmVjbGVuKTtcbi1cdFx0XHRpZiAoIWRlLVx1MDAzZWRfaW5vKVxuLVx0XHRcdFx0Y29udGludWU7XG4tXG4tXHRcdFx0aWYgKG5hbWVsZW4gIT0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX25hbWVsZW4pKVxuLVx0XHRcdFx0Y29udGludWU7XG4tXHRcdFx0aWYgKCFtZW1jbXAobmFtZSwgZGUtXHUwMDNlZF9uYW1lLCBuYW1lbGVuKSkge1xuLVx0XHRcdFx0KnBwcCA9IHBwO1xuLVx0XHRcdFx0ZGVfZXhpdCA9IGRlO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHRcdGlmICghZGVfZXhpdClcbi1cdFx0XHR2eGZzX3B1dF9wYWdlKHBwKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0cmV0dXJuIGRlX2V4aXQ7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfaW5vZGVfYnlfbmFtZSAtIGZpbmQgaW5vZGUgbnVtYmVyIGZvciBkZW50cnlcbi0gKiBAZGlwOlx0ZGlyZWN0b3J5IHRvIHNlYXJjaCBpblxuLSAqIEBkcDpcdFx0ZGVudHJ5IHdlIHNlYXJjaCBmb3Jcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mXG4tICogICB0aGUgcGF0aCBjb21wb25lbnQgZGVzY3JpYmVkIGJ5IEBkcCBpbiBAZGlwLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSB3YW50ZWQgaW5vZGUgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgaW5vX3Rcbi12eGZzX2lub2RlX2J5X25hbWUoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwKVxuLXtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdFx0XHQqZGU7XG4tXHRzdHJ1Y3QgcGFnZVx0XHRcdCpwcDtcbi1cdGlub190XHRcdFx0XHRpbm8gPSAwO1xuLVxuLVx0ZGUgPSB2eGZzX2ZpbmRfZW50cnkoZGlwLCBkcCwgXHUwMDI2cHApO1xuLVx0aWYgKGRlKSB7XG4tXHRcdGlubyA9IGZzMzJfdG9fY3B1KFZYRlNfU0JJKGRpcC1cdTAwM2VpX3NiKSwgZGUtXHUwMDNlZF9pbm8pO1xuLVx0XHRrdW5tYXAocHApO1xuLVx0XHRwdXRfcGFnZShwcCk7XG4tXHR9XG4tXHRcbi1cdHJldHVybiAoaW5vKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19sb29rdXAgLSBsb29rdXAgcGF0aG5hbWUgY29tcG9uZW50XG4tICogQGRpcDpcdGRpciBpbiB3aGljaCB3ZSBsb29rdXBcbi0gKiBAZHA6XHRcdGRlbnRyeSB3ZSBsb29rdXBcbi0gKiBAZmxhZ3M6XHRsb29rdXAgZmxhZ3Ncbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkXG4tICogICBieSBAZHAgaW4gQGRpcC5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBBIE5VTEwtcG9pbnRlciBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBlbmNvZGVkXG4tICogICBpbiB0aGUgcmV0dXJuIHBvaW50ZXIuXG4tICovXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlxuLXZ4ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgdW5zaWduZWQgaW50IGZsYWdzKVxuLXtcbi1cdHN0cnVjdCBpbm9kZVx0XHQqaXAgPSBOVUxMO1xuLVx0aW5vX3RcdFx0XHRpbm87XG4tXHRcdFx0IFxuLVx0aWYgKGRwLVx1MDAzZWRfbmFtZS5sZW4gXHUwMDNlIFZYRlNfTkFNRUxFTilcbi1cdFx0cmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7XG4tXHRcdFx0XHQgXG4tXHRpbm8gPSB2eGZzX2lub2RlX2J5X25hbWUoZGlwLCBkcCk7XG4tXHRpZiAoaW5vKVxuLVx0XHRpcCA9IHZ4ZnNfaWdldChkaXAtXHUwMDNlaV9zYiwgaW5vKTtcbi1cdHJldHVybiBkX3NwbGljZV9hbGlhcyhpcCwgZHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5XG4tICogQGZwOlx0XHR0aGUgZGlyZWN0b3J5IHRvIHJlYWRcbi0gKiBAY3R4Olx0ZGlyX2NvbnRleHQgZm9yIGZpbGxkaXIvcmVhZGRpclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3JlYWRkaXIgZmlsbHMgQHJldHAgd2l0aCBkaXJlY3RvcnkgZW50cmllcyBmcm9tIEBmcFxuLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8uXG4tICovXG4tc3RhdGljIGludFxuLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuLXtcbi1cdHN0cnVjdCBpbm9kZVx0XHQqaXAgPSBmaWxlX2lub2RlKGZwKTtcbi1cdHN0cnVjdCBzdXBlcl9ibG9ja1x0KnNicCA9IGlwLVx1MDAzZWlfc2I7XG4tXHR1X2xvbmdcdFx0XHRic2l6ZSA9IHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGxvZmZfdFx0XHRcdHBvcywgbGltaXQ7XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqc2JpID0gVlhGU19TQkkoc2JwKTtcbi1cbi1cdGlmIChjdHgtXHUwMDNlcG9zID09IDApIHtcbi1cdFx0aWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdGN0eC1cdTAwM2Vwb3MmIzQzOyYjNDM7O1xuLVx0fVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMSkge1xuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgXCYjMzQ7Li5cJiMzNDssIDIsIFZYRlNfSU5PKGlwKS1cdTAwM2V2aWlfZG90ZG90LCBEVF9ESVIpKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRjdHgtXHUwMDNlcG9zJiM0MzsmIzQzOztcbi1cdH1cbi1cbi1cdGxpbWl0ID0gVlhGU19ESVJST1VORChpcC1cdTAwM2VpX3NpemUpO1xuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgXHUwMDNlIGxpbWl0KVxuLVx0XHRnb3RvIG91dDtcbi1cbi1cdHBvcyA9IGN0eC1cdTAwM2Vwb3MgXHUwMDI2IH4zTDtcbi1cbi1cdHdoaWxlIChwb3MgXHUwMDNjIGxpbWl0KSB7XG4tXHRcdHN0cnVjdCBwYWdlICpwcDtcbi1cdFx0Y2hhciAqa2FkZHI7XG4tXHRcdGludCBwZ19vZnMgPSBwb3MgXHUwMDI2IH5QQUdFX01BU0s7XG4tXHRcdGludCByYyA9IDA7XG4tXG4tXHRcdHBwID0gdnhmc19nZXRfcGFnZShpcC1cdTAwM2VpX21hcHBpbmcsIHBvcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4tXHRcdGlmIChJU19FUlIocHApKVxuLVx0XHRcdHJldHVybiAtRU5PTUVNO1xuLVxuLVx0XHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcbi1cbi1cdFx0d2hpbGUgKHBnX29mcyBcdTAwM2MgUEFHRV9TSVpFIFx1MDAyNlx1MDAyNiBwb3MgXHUwMDNjIGxpbWl0KSB7XG4tXHRcdFx0c3RydWN0IHZ4ZnNfZGlyZWN0ICpkZTtcbi1cbi1cdFx0XHRpZiAoKHBvcyBcdTAwMjYgKGJzaXplIC0gMSkpIFx1MDAzYyA0KSB7XG4tXHRcdFx0XHRzdHJ1Y3Qgdnhmc19kaXJibGsgKmRicCA9XG4tXHRcdFx0XHRcdChzdHJ1Y3Qgdnhmc19kaXJibGsgKilcbi1cdFx0XHRcdFx0IChrYWRkciAmIzQzOyAocG9zIFx1MDAyNiB+UEFHRV9NQVNLKSk7XG4tXHRcdFx0XHRpbnQgb3ZlcmhlYWQgPSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKTtcbi1cbi1cdFx0XHRcdHBvcyAmIzQzOz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgJiM0Mzs9IG92ZXJoZWFkO1xuLVx0XHRcdH1cbi1cdFx0XHRkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTtcbi1cbi1cdFx0XHRpZiAoIWRlLVx1MDAzZWRfcmVjbGVuKSB7XG4tXHRcdFx0XHRwb3MgJiM0Mzs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdHBvcyAmIzQzOz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX2lubylcbi1cdFx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRcdHJjID0gZGlyX2VtaXQoY3R4LCBkZS1cdTAwM2VkX25hbWUsXG4tXHRcdFx0XHRcdGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9uYW1lbGVuKSxcbi1cdFx0XHRcdFx0ZnMzMl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX2lubyksXG4tXHRcdFx0XHRcdERUX1VOS05PV04pO1xuLVx0XHRcdGlmICghcmMpIHtcbi1cdFx0XHRcdC8qIHRoZSBkaXIgZW50cnkgd2FzIG5vdCByZWFkLCBmaXggcG9zLiAqL1xuLVx0XHRcdFx0cG9zIC09IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuLVx0XHR9XG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRpZiAoIXJjKVxuLVx0XHRcdGJyZWFrO1xuLVx0fVxuLVxuLVx0Y3R4LVx1MDAzZXBvcyA9IHBvcyB8IDI7XG4tXG4tb3V0OlxuLVx0cmV0dXJuIDA7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIzZjM1MTg3YzI4OTYuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmNcbiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGxcbkBAIC0xLDEwNSAmIzQzOzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qIFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCYjMzQ7dnhmcy5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19vbHQuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9mc2hlYWQoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICpmc2hwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cdTAwM2VvbHRfZnNpbm9bMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9pbGlzdChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9pZXh0KTtcbi1cdGluZnAtXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXHUwMDNlb2x0X2lleHRbMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHVfbG9uZ1xuLXZ4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0QlVHX09OKHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcbi1cdHJldHVybiAoYmxvY2sgKiAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcbi19XG4tXG4tXG4tLyoqXG4tICogdnhmc19yZWFkX29sdCAtIHJlYWQgb2x0XG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKiBAYnNpemU6XHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXG4tICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKi9cbi1pbnRcbi12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19vbHRcdFx0Km9wO1xuLVx0Y2hhclx0XHRcdCpvYWRkciwgKmVhZGRyO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC1cdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xuLVx0aWYgKCFicCB8fCAhYnAtXHUwMDNlYl9kYXRhKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X21hZ2ljKSAhPSBWWEZTX09MVF9NQUdJQykge1xuLVx0XHRwcmludGsoS0VSTl9OT1RJQ0UgXCYjMzQ7dnhmczogaXZhbGlkIG9sdCBtYWdpYyBudW1iZXJcXG5cJiMzNDspO1xuLVx0XHRnb3RvIGZhaWw7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogSXQgaXMgaW4gdGhlb3J5IHBvc3NpYmxlIHRoYXQgdnNpX29sdHNpemUgaXMgXHUwMDNlIDEuXG4tXHQgKiBJJiMzOTt2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSYjMzk7bSBsYXp5Li4gIC0taGNoXG4tXHQgKi9cbi1cdGlmIChpbmZwLVx1MDAzZXZzaV9vbHRzaXplIFx1MDAzZSAxKSB7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcJiMzNDt2eGZzOiBvbHRzaXplIFx1MDAzZSAxIGRldGVjdGVkLlxcblwmIzM0Oyk7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcJiMzNDt2eGZzOiBwbGVhc2Ugbm90aWZ5IGhjaEBpbmZyYWRlYWQub3JnXFxuXCYjMzQ7KTtcbi1cdFx0Z290byBmYWlsO1xuLVx0fVxuLVxuLVx0b2FkZHIgPSBicC1cdTAwM2ViX2RhdGEgJiM0MzsgZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0ZWFkZHIgPSBicC1cdTAwM2ViX2RhdGEgJiM0MzsgKGluZnAtXHUwMDNldnNpX29sdHNpemUgKiBzYnAtXHUwMDNlc19ibG9ja3NpemUpO1xuLVxuLVx0d2hpbGUgKG9hZGRyIFx1MDAzYyBlYWRkcikge1xuLVx0XHRzdHJ1Y3Qgdnhmc19vbHRjb21tb25cdCpvY3AgPVxuLVx0XHRcdChzdHJ1Y3Qgdnhmc19vbHRjb21tb24gKilvYWRkcjtcbi1cdFx0XG4tXHRcdHN3aXRjaCAoZnMzMl90b19jcHUoaW5mcCwgb2NwLVx1MDAzZW9sdF90eXBlKSkge1xuLVx0XHRjYXNlIFZYRlNfT0xUX0ZTSEVBRDpcbi1cdFx0XHR2eGZzX2dldF9mc2hlYWQoKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqKW9hZGRyLCBpbmZwKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX09MVF9JTElTVDpcbi1cdFx0XHR2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0b2FkZHIgJiM0Mzs9IGZzMzJfdG9fY3B1KGluZnAsIG9jcC1cdTAwM2VvbHRfc2l6ZSk7XG4tXHR9XG4tXG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIChpbmZwLVx1MDAzZXZzaV9mc2hpbm8gXHUwMDI2XHUwMDI2IGluZnAtXHUwMDNldnNpX2lleHQpID8gMCA6IC1FSU5WQUw7XG4tXG4tZmFpbDpcbi1cdGJyZWxzZShicCk7XG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggNTNhZmJhMDhkNjE3Zi4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaFxuJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbFxuQEAgLTEsMTIwICYjNDM7MCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cbi0jZGVmaW5lIF9WWEZTX09MVF9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxuLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVx1MDAzZW9sdF9tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1x0XHQweGE1MDRGQ0Y1XG4tXG4tLypcbi0gKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy5cbi0gKi9cbi1lbnVtIHtcbi1cdFZYRlNfT0xUX0ZSRUVcdD0gMSxcbi1cdFZYRlNfT0xUX0ZTSEVBRFx0PSAyLFxuLVx0VlhGU19PTFRfQ1VUXHQ9IDMsXG4tXHRWWEZTX09MVF9JTElTVFx0PSA0LFxuLVx0VlhGU19PTFRfREVWXHQ9IDUsXG4tXHRWWEZTX09MVF9TQlx0PSA2XG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgT0xUIGhlYWRlci5cbi0gKlxuLSAqIFRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgaGVhZGVyIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2hcbi0gKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHQge1xuLVx0X19mczMyXHRcdG9sdF9tYWdpYztcdC8qIG1hZ2ljIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgZW50cnlcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfY2hlY2tzdW07XHQvKiBjaGVja3N1bSBvZiBleHRlbnRcdFx0Ki9cbi1cdF9fdTMyXHRcdF9fdW51c2VkMTtcdC8qID8/P1x0XHRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXRpbWU7XHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAoc2VjKVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXV0aW1lO1x0LyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpXHQqL1xuLVx0X19mczMyXHRcdG9sdF90b3RmcmVlO1x0LyogZnJlZSBzcGFjZSBpbiBPTFQgZXh0ZW50XHQqL1xuLVx0X19mczMyXHRcdG9sdF9leHRlbnRzWzJdO1x0LyogYWRkciBvZiB0aGlzIGV4dGVudCwgcmVwbGljYVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfZXNpemU7XHQvKiBzaXplIG9mIHRoaXMgZXh0ZW50XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25leHRbMl07ICAgIC8qIGFkZHIgb2YgbmV4dCBleHRlbnQsIHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25zaXplO1x0Lyogc2l6ZSBvZiBuZXh0IGV4dGVudFx0XHQqL1xuLVx0X191MzJcdFx0X191bnVzZWQyO1x0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XHQqL1xuLX07XG4tXG4tLypcbi0gKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGNvbW1vbiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgZnJlZSBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFx0Ki9cbi19O1xuLVxuLS8qXG4tICogVnhGUyBpbml0aWFsLWlub2RlIGxpc3QgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGlsaXN0IHtcbi1cdF9fZnMzMlx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9pZXh0WzJdO1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXHQqL1xuLX07XG4tXG4tLypcbi0gKiBDdXJyZW50IFVzYWdlIFRhYmxlIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGN1dCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2N1dGlubztcdC8qIGlub2RlIG9mIGN1cnJlbnQgdXNhZ2UgdGFibGVcdCovXG4tXHRfX3U4XHRcdF9fcGFkO1x0XHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblx0XHQqL1xuLX07XG4tXG4tLypcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdHNiIHtcbi1cdF9fZnMzMlx0XHRvbHRfdHlwZTtcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2Jpbm87XHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcdCovXG4tXHRfX3UzMlx0XHRfX3VudXNlZDE7XHQvKiA/Pz9cdFx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2xvZ2lub1syXTtcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X29sdGlub1syXTtcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVx0Ki9cbi19O1xuLVxuLS8qXG4tICogSW5vZGUgY29udGFpbmluZyBkZXZpY2UgY29uZmlndXJhdGlvbiAmIzQzOyBpdCYjMzk7cyByZXBsaWNhIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGRldiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2Rldmlub1syXTtcdC8qIGlub2RlIG9mIGRldmljZSBjb25maWcgZmlsZXNcdCovXG4tfTtcbi1cbi0vKlxuLSAqIEZpbGVzZXQgaGVhZGVyIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZzaGVhZCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2ZzaW5vWzJdOyAgIC8qIGlub2RlcyBvZiBmaWxlc2V0IGhlYWRlclx0Ki9cbi19O1xuLVxuLSNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGY0Mzk4NzdlYTZlODAuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwxNTIgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfZXh0ZXJuLmhcJiMzNDtcbi1cbi1cbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZm9saW8gKik7XG4tc3RhdGljIHNlY3Rvcl90XHRcdHZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7XG4tXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2FvcHMgPSB7XG4tXHQucmVhZF9mb2xpbyA9XHRcdHZ4ZnNfcmVhZF9mb2xpbyxcbi1cdC5ibWFwID1cdFx0XHR2eGZzX2JtYXAsXG4tfTtcbi1cbi1pbmxpbmUgdm9pZFxuLXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBwKVxuLXtcbi1cdGt1bm1hcChwcCk7XG4tXHRwdXRfcGFnZShwcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS5cbi0gKiBAbWFwcGluZzpcdG1hcHBpbmcgdG8gcmVhZCBmcm9tXG4tICogQG46XHRcdHBhZ2UgbnVtYmVyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfZ2V0X3BhZ2UgcmVhZHMgdGhlIEBuIHRoIHBhZ2Ugb2YgQGlwIGludG8gdGhlIHBhZ2VjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIHBhZ2Ugb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci5cbi0gKi9cbi1zdHJ1Y3QgcGFnZSAqXG4tdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdV9sb25nIG4pXG4te1xuLVx0c3RydWN0IHBhZ2UgKlx0XHRcdHBwO1xuLVxuLVx0cHAgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBuLCBOVUxMKTtcbi1cbi1cdGlmICghSVNfRVJSKHBwKSkge1xuLVx0XHRrbWFwKHBwKTtcbi1cdFx0LyoqIGlmICghUGFnZUNoZWNrZWQocHApKSAqKi9cbi1cdFx0XHQvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovXG4tXHR9XG4tXHRcbi1cdHJldHVybiAocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JyZWFkIC0gcmVhZCBidWZmZXIgZm9yIGEgZ2l2ZSBpbm9kZSxibG9jayB0dXBsZVxuLSAqIEBpcDpcdFx0aW5vZGVcbi0gKiBAYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX2JyZWFkIGZ1bmN0aW9uIHJlYWRzIGJsb2NrIG5vIEBibG9jayAgb2Zcbi0gKiAgIEBpcCBpbnRvIHRoZSBidWZmZXJjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcmVzdWx0aW5nIFx1MDAyNnN0cnVjdCBidWZmZXJfaGVhZC5cbi0gKi9cbi1zdHJ1Y3QgYnVmZmVyX2hlYWQgKlxuLXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICppcCwgaW50IGJsb2NrKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZFx0KmJwO1xuLVx0ZGFkZHJfdFx0XHRcdHBibG9jaztcbi1cbi1cdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGJsb2NrKTtcbi1cdGJwID0gc2JfYnJlYWQoaXAtXHUwMDNlaV9zYiwgcGJsb2NrKTtcbi1cbi1cdHJldHVybiAoYnApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2dldGJsayAtIGxvY2F0ZSBidWZmZXIgZm9yIGdpdmVuIGlub2RlLGJsb2NrIHR1cGxlXG4tICogQGlwOlx0XHRpbm9kZVxuLSAqIEBpYmxvY2s6XHRsb2dpY2FsIGJsb2NrXG4tICogQGJwOlx0XHRidWZmZXIgc2tlbGV0b25cbi0gKiBAY3JlYXRlOlx0JVRSVUUgaWYgYmxvY2tzIG1heSBiZSBuZXdseSBhbGxvY2F0ZWQuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX2dldGJsayBmdW5jdGlvbiBmaWxscyBAYnAgd2l0aCB0aGUgcmlnaHQgcGh5c2ljYWxcbi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uXG4tICogICBpdC5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2IGVycm9yIGNvZGUgKC1FSU8pLlxuLSAqL1xuLXN0YXRpYyBpbnRcbi12eGZzX2dldGJsayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBpYmxvY2ssXG4tXHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSlcbi17XG4tXHRkYWRkcl90XHRcdFx0cGJsb2NrO1xuLVxuLVx0cGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTtcbi1cdGlmIChwYmxvY2sgIT0gMCkge1xuLVx0XHRtYXBfYmgoYnAsIGlwLVx1MDAzZWlfc2IsIHBibG9jayk7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0cmV0dXJuIC1FSU87XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfcmVhZF9mb2xpbyAtIHJlYWQgb25lIHBhZ2Ugc3luY2hyb25vdXNseSBpbnRvIHRoZSBwYWdlY2FjaGVcbi0gKiBAZmlsZTpcdGZpbGUgY29udGV4dCAodW51c2VkKVxuLSAqIEBmb2xpbzpcdGZvbGlvIHRvIGZpbGwgaW4uXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFRoZSB2eGZzX3JlYWRfZm9saW8gcm91dGluZSByZWFkcyBAZm9saW8gc3luY2hyb25vdXNseSBpbnRvIHRoZVxuLSAqICAgcGFnZWNhY2hlLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4tICpcbi0gKiBMb2NraW5nIHN0YXR1czpcbi0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuXG4tICovXG4tc3RhdGljIGludCB2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0cmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9mb2xpbyhmb2xpbywgdnhmc19nZXRibGspO1xuLX1cbi0gXG4tLyoqXG4tICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmdcbi0gKiBAbWFwcGluZzpcdGxvZ2ljYWwgdG8gcGh5c2ljYWwgbWFwcGluZyB0byB1c2Vcbi0gKiBAYmxvY2s6XHRsb2dpY2FsIGJsb2NrIChyZWxhdGl2ZSB0byBAbWFwcGluZykuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIFZ4ZnNfYm1hcCBmaW5kIG91dCB0aGUgY29ycmVzcG9uZGluZyBwaHNpY2FsIGJsb2NrIHRvIHRoZVxuLSAqICAgQG1hcHBpbmcsIEBibG9jayBwYWlyLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICpcbi0gKiBMb2NraW5nIHN0YXR1czpcbi0gKiAgIFdlIGFyZSB1bmRlciB0aGUgYmtsLlxuLSAqL1xuLXN0YXRpYyBzZWN0b3JfdFxuLXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spXG4te1xuLVx0cmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgdnhmc19nZXRibGspO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZDdkODQ3ZDc1YzNkNS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXG4mIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsXG5AQCAtMSwzNDcgJiM0MzswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrZGV2LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdmZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcJiMzNDt2eGZzLmhcJiMzNDtcbi0jaW5jbHVkZSBcJiMzNDt2eGZzX2V4dGVybi5oXCYjMzQ7XG4tI2luY2x1ZGUgXCYjMzQ7dnhmc19kaXIuaFwmIzM0O1xuLSNpbmNsdWRlIFwmIzM0O3Z4ZnNfaW5vZGUuaFwmIzM0O1xuLVxuLVxuLU1PRFVMRV9BVVRIT1IoXCYjMzQ7Q2hyaXN0b3BoIEhlbGx3aWcsIEtyenlzenRvZiBCbGFzemtvd3NraVwmIzM0Oyk7XG4tTU9EVUxFX0RFU0NSSVBUSU9OKFwmIzM0O1Zlcml0YXMgRmlsZXN5c3RlbSAoVnhGUykgZHJpdmVyXCYjMzQ7KTtcbi1NT0RVTEVfTElDRU5TRShcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuLVxuLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdnhmc19pbm9kZV9jYWNoZXA7XG4tXG4tLyoqXG4tICogdnhmc19wdXRfc3VwZXIgLSBmcmVlIHN1cGVyYmxvY2sgcmVzb3VyY2VzXG4tICogQHNicDpcdFZGUyBzdXBlcmJsb2NrLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3B1dF9zdXBlciBmcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgQHNicFxuLSAqICAgYWZ0ZXIgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkLlxuLSAqL1xuLVxuLXN0YXRpYyB2b2lkXG4tdnhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVxuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9mc2hpcCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX2lsaXN0KTtcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfc3RpbGlzdCk7XG4tXG4tXHRicmVsc2UoaW5mcC1cdTAwM2V2c2lfYnApO1xuLVx0a2ZyZWUoaW5mcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfc3RhdGZzIC0gZ2V0IGZpbGVzeXN0ZW0gaW5mb3JtYXRpb25cbi0gKiBAZGVudHJ5Olx0VkZTIGRlbnRyeSB0byBsb2NhdGUgc3VwZXJibG9ja1xuLSAqIEBidWZwOlx0b3V0cHV0IGJ1ZmZlclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX3N0YXRmcyBmaWxscyB0aGUgc3RhdGZzIGJ1ZmZlciBAYnVmcCB3aXRoIGluZm9ybWF0aW9uXG4tICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQGRlbnRyeS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvLlxuLSAqXG4tICogTG9ja2luZzpcbi0gKiAgIE5vIGxvY2tzIGhlbGQuXG4tICpcbi0gKiBOb3Rlczpcbi0gKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmcClcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHRcdCppbmZwID0gVlhGU19TQkkoZGVudHJ5LVx1MDAzZWRfc2IpO1xuLVx0c3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtXHUwMDNldnNpX3Jhdztcbi1cdHU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihkZW50cnktXHUwMDNlZF9zYi1cdTAwM2VzX2JkZXYtXHUwMDNlYmRfZGV2KTtcbi1cbi1cdGJ1ZnAtXHUwMDNlZl90eXBlID0gVlhGU19TVVBFUl9NQUdJQztcbi1cdGJ1ZnAtXHUwMDNlZl9ic2l6ZSA9IGRlbnRyeS1cdTAwM2VkX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0YnVmcC1cdTAwM2VmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cdTAwM2V2c19kc2l6ZSk7XG4tXHRidWZwLVx1MDAzZWZfYmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfZnJlZSk7XG4tXHRidWZwLVx1MDAzZWZfYmF2YWlsID0gMDtcbi1cdGJ1ZnAtXHUwMDNlZl9maWxlcyA9IDA7XG4tXHRidWZwLVx1MDAzZWZfZmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfaWZyZWUpO1xuLVx0YnVmcC1cdTAwM2VmX2ZzaWQgPSB1NjRfdG9fZnNpZChpZCk7XG4tXHRidWZwLVx1MDAzZWZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHN5bmNfZmlsZXN5c3RlbShmYy1cdTAwM2Vyb290LVx1MDAzZWRfc2IpO1xuLVx0ZmMtXHUwMDNlc2JfZmxhZ3MgfD0gU0JfUkRPTkxZO1xuLVx0cmV0dXJuIDA7XG4tfVxuLVxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnZ4ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aTtcbi1cbi1cdHZpID0gYWxsb2NfaW5vZGVfc2Ioc2IsIHZ4ZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbi1cdGlmICghdmkpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0aW5vZGVfaW5pdF9vbmNlKFx1MDAyNnZpLVx1MDAzZXZmc19pbm9kZSk7XG4tXHRyZXR1cm4gXHUwMDI2dmktXHUwMDNldmZzX2lub2RlO1xuLX1cbi1cbi1zdGF0aWMgdm9pZCB2eGZzX2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRrbWVtX2NhY2hlX2ZyZWUodnhmc19pbm9kZV9jYWNoZXAsIFZYRlNfSU5PKGlub2RlKSk7XG4tfVxuLVxuLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2eGZzX3N1cGVyX29wcyA9IHtcbi1cdC5hbGxvY19pbm9kZVx0XHQ9IHZ4ZnNfYWxsb2NfaW5vZGUsXG4tXHQuZnJlZV9pbm9kZVx0XHQ9IHZ4ZnNfZnJlZV9pbm9kZSxcbi1cdC5ldmljdF9pbm9kZVx0XHQ9IHZ4ZnNfZXZpY3RfaW5vZGUsXG4tXHQucHV0X3N1cGVyXHRcdD0gdnhmc19wdXRfc3VwZXIsXG4tXHQuc3RhdGZzXHRcdFx0PSB2eGZzX3N0YXRmcyxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc190cnlfc2JfbWFnaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYyxcbi1cdFx0dW5zaWduZWQgYmxrLCBfX2ZzMzIgbWFnaWMpXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkICpicDtcbi1cdHN0cnVjdCB2eGZzX3NiICpyc2JwO1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCA9IFZYRlNfU0JJKHNicCk7XG4tXHRpbnQgc2lsZW50ID0gZmMtXHUwMDNlc2JfZmxhZ3MgXHUwMDI2IFNCX1NJTEVOVDtcbi1cdGludCByYyA9IC1FTk9NRU07XG4tXG4tXHRicCA9IHNiX2JyZWFkKHNicCwgYmxrKTtcbi1cdGRvIHtcbi1cdFx0aWYgKCFicCB8fCAhYnVmZmVyX21hcHBlZChicCkpIHtcbi1cdFx0XHRpZiAoIXNpbGVudCkge1xuLVx0XHRcdFx0d2FybmYoZmMsXG4tXHRcdFx0XHQgICAgICBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2sgYXQgJXVcJiMzNDssXG4tXHRcdFx0XHQgICAgICBibGspO1xuLVx0XHRcdH1cbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVxuLVx0XHRyYyA9IC1FSU5WQUw7XG4tXHRcdHJzYnAgPSAoc3RydWN0IHZ4ZnNfc2IgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRcdGlmIChyc2JwLVx1MDAzZXZzX21hZ2ljICE9IG1hZ2ljKSB7XG4tXHRcdFx0aWYgKCFzaWxlbnQpXG4tXHRcdFx0XHRpbmZvZihmYyxcbi1cdFx0XHRcdCAgICAgIFwmIzM0O3Z4ZnM6IFdST05HIHN1cGVyYmxvY2sgbWFnaWMgJTA4eCBhdCAldVwmIzM0Oyxcbi1cdFx0XHRcdCAgICAgIHJzYnAtXHUwMDNldnNfbWFnaWMsIGJsayk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0cmMgPSAwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9yYXcgPSByc2JwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9icCA9IGJwO1xuLVx0fSB3aGlsZSAoMCk7XG4tXG4tXHRpZiAocmMpIHtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfcmF3ID0gTlVMTDtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfYnAgPSBOVUxMO1xuLVx0XHRicmVsc2UoYnApO1xuLVx0fVxuLVxuLVx0cmV0dXJuIHJjO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2ZpbGxfc3VwZXIgLSByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGluaXRpYWxpemUgZmlsZXN5c3RlbVxuLSAqIEBzYnA6XHRcdFZGUyBzdXBlcmJsb2NrICh0byBmaWxsKVxuLSAqIEBmYzpcdFx0XHRmaWxlc3l0ZW0gY29udGV4dFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGVcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cdTAwM2VzX2xvY2suXG4tICovXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqaW5mcDtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCpyc2JwO1xuLVx0dV9sb25nXHRcdFx0YnNpemU7XG4tXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XG4tXHRpbnQgcmV0ID0gLUVJTlZBTDtcbi1cdGludCBzaWxlbnQgPSBmYy1cdTAwM2VzYl9mbGFncyBcdTAwMjYgU0JfU0lMRU5UO1xuLVx0dTMyIGo7XG4tXG4tXHRzYnAtXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XG4tXG4tXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xuLVx0aWYgKCFpbmZwKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcJiMzNDspO1xuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdH1cbi1cbi1cdGJzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYnAsIEJMT0NLX1NJWkUpO1xuLVx0aWYgKCFic2l6ZSkge1xuLVx0XHR3YXJuZihmYywgXCYjMzQ7dnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdHNicC1cdTAwM2VzX29wID0gXHUwMDI2dnhmc19zdXBlcl9vcHM7XG4tXHRzYnAtXHUwMDNlc19mc19pbmZvID0gaW5mcDtcbi1cdHNicC1cdTAwM2VzX3RpbWVfbWluID0gMDtcbi1cdHNicC1cdTAwM2VzX3RpbWVfbWF4ID0gVTMyX01BWDtcbi1cbi1cdGlmICghdnhmc190cnlfc2JfbWFnaWMoc2JwLCBmYywgMSxcbi1cdFx0XHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XG4tXHRcdC8qIFVuaXh3YXJlLCB4ODYgKi9cbi1cdFx0aW5mcC1cdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19MRTtcbi1cdH0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsXG4tXHRcdFx0KF9fZm9yY2UgX19mczMyKWNwdV90b19iZTMyKFZYRlNfU1VQRVJfTUFHSUMpKSkge1xuLVx0XHQvKiBIUC1VWCwgcGFyaXNjICovXG4tXHRcdGluZnAtXHUwMDNlYnl0ZV9vcmRlciA9IFZYRlNfQk9fQkU7XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAoIXNpbGVudClcbi1cdFx0XHRpbmZvZihmYywgXCYjMzQ7dnhmczogY2FuJiMzOTt0IGZpbmQgc3VwZXJibG9jay5cJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdHJzYnAgPSBpbmZwLVx1MDAzZXZzaV9yYXc7XG4tXHRqID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c192ZXJzaW9uKTtcbi1cdGlmICgoaiBcdTAwM2MgMiB8fCBqIFx1MDAzZSA0KSBcdTAwMjZcdTAwMjYgIXNpbGVudCkge1xuLVx0XHRpbmZvZihmYywgXCYjMzQ7dnhmczogdW5zdXBwb3J0ZWQgVnhGUyB2ZXJzaW9uICglZClcJiMzNDssIGopO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCYjMzQ7dnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxuXCYjMzQ7LCBqKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O3Z4ZnM6IGJsb2Nrc2l6ZTogJWRcXG5cJiMzNDssXG4tXHRcdGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfYnNpemUpKTtcbi0jZW5kaWZcbi1cbi1cdHNicC1cdTAwM2VzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19tYWdpYyk7XG4tXG4tXHRpbmZwLVx1MDAzZXZzaV9vbHRleHQgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX29sdGV4dFswXSk7XG4tXHRpbmZwLVx1MDAzZXZzaV9vbHRzaXplID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19vbHRzaXplKTtcbi1cbi1cdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX2JzaXplKTtcbi1cdGlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYnAsIGopKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gc2V0IGZpbmFsIGJsb2NrIHNpemVcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7XG4tXHRcdHdhcm5mKGZjLCBcJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHRcJiMzNDspO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHtcbi1cdFx0d2FybmYoZmMsIFwmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGZzaGVhZFwmIzM0Oyk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0cm9vdCA9IHZ4ZnNfaWdldChzYnAsIFZYRlNfUk9PVF9JTk8pO1xuLVx0aWYgKElTX0VSUihyb290KSkge1xuLVx0XHRyZXQgPSBQVFJfRVJSKHJvb3QpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cdHNicC1cdTAwM2VzX3Jvb3QgPSBkX21ha2Vfcm9vdChyb290KTtcbi1cdGlmICghc2JwLVx1MDAzZXNfcm9vdCkge1xuLVx0XHR3YXJuZihmYywgXCYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCByb290IGRlbnRyeS5cJiMzNDspO1xuLVx0XHRnb3RvIG91dF9mcmVlX2lsaXN0O1xuLVx0fVxuLVxuLVx0cmV0dXJuIDA7XG4tXHRcbi1vdXRfZnJlZV9pbGlzdDpcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLW91dDpcbi1cdGJyZWxzZShpbmZwLVx1MDAzZXZzaV9icCk7XG4tXHRrZnJlZShpbmZwKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLS8qXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfZ2V0X3RyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHJldHVybiBnZXRfdHJlZV9iZGV2KGZjLCB2eGZzX2ZpbGxfc3VwZXIpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGZzX2NvbnRleHRfb3BlcmF0aW9ucyB2eGZzX2NvbnRleHRfb3BzID0ge1xuLVx0LmdldF90cmVlXHQ9IHZ4ZnNfZ2V0X3RyZWUsXG4tXHQucmVjb25maWd1cmVcdD0gdnhmc19yZWNvbmZpZ3VyZSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdGZjLVx1MDAzZW9wcyA9IFx1MDAyNnZ4ZnNfY29udGV4dF9vcHM7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZ4ZnNfZnNfdHlwZSA9IHtcbi1cdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuLVx0Lm5hbWVcdFx0PSBcJiMzNDt2eGZzXCYjMzQ7LFxuLVx0LmtpbGxfc2JcdD0ga2lsbF9ibG9ja19zdXBlcixcbi1cdC5mc19mbGFnc1x0PSBGU19SRVFVSVJFU19ERVYsXG4tXHQuaW5pdF9mc19jb250ZXh0ID0gdnhmc19pbml0X2ZzX2NvbnRleHQsXG4tfTtcbi1NT0RVTEVfQUxJQVNfRlMoXCYjMzQ7dnhmc1wmIzM0Oyk7IC8qIG1ha2VzIG1vdW50IC10IHZ4ZnMgYXV0b2xvYWQgdGhlIG1vZHVsZSAqL1xuLU1PRFVMRV9BTElBUyhcJiMzNDt2eGZzXCYjMzQ7KTtcbi1cbi1zdGF0aWMgaW50IF9faW5pdFxuLXZ4ZnNfaW5pdCh2b2lkKVxuLXtcbi1cdGludCBydjtcbi1cbi1cdHZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoXCYjMzQ7dnhmc19pbm9kZVwmIzM0Oyxcbi1cdFx0XHRzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsXG4tXHRcdFx0U0xBQl9SRUNMQUlNX0FDQ09VTlQsXG4tXHRcdFx0b2Zmc2V0b2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbywgdmlpX2ltbWVkLnZpX2ltbWVkKSxcbi1cdFx0XHRzaXplb2ZfZmllbGQoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyxcbi1cdFx0XHRcdHZpaV9pbW1lZC52aV9pbW1lZCksXG4tXHRcdFx0TlVMTCk7XG4tXHRpZiAoIXZ4ZnNfaW5vZGVfY2FjaGVwKVxuLVx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdHJ2ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbShcdTAwMjZ2eGZzX2ZzX3R5cGUpO1xuLVx0aWYgKHJ2IFx1MDAzYyAwKVxuLVx0XHRrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApO1xuLVx0cmV0dXJuIHJ2O1xuLX1cbi1cbi1zdGF0aWMgdm9pZCBfX2V4aXRcbi12eGZzX2NsZWFudXAodm9pZClcbi17XG4tXHR1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oXHUwMDI2dnhmc19mc190eXBlKTtcbi1cdC8qXG4tXHQgKiBNYWtlIHN1cmUgYWxsIGRlbGF5ZWQgcmN1IGZyZWUgaW5vZGVzIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZVxuLVx0ICogZGVzdHJveSBjYWNoZS5cbi1cdCAqL1xuLVx0cmN1X2JhcnJpZXIoKTtcbi1cdGttZW1fY2FjaGVfZGVzdHJveSh2eGZzX2lub2RlX2NhY2hlcCk7XG4tfVxuLVxuLW1vZHVsZV9pbml0KHZ4ZnNfaW5pdCk7XG4tbW9kdWxlX2V4aXQodnhmc19jbGVhbnVwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8zMCAxODo0MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOGRhZTUxNDhjMTA0NWZkMDBlNWFhOTEzMWY3ZDM1ODQ2NGMwYzhlNQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgSnVsIDMwIDE4OjQwOjA5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtMTA1NjUsMTIgJiM0MzsxMDU2NSw2IEBAIEw6CWxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnCiBTOglPcnBoYW4KIEY6CWRyaXZlcnMvdXNiL3BoeS9waHktZnNsLXVzYioKIAotRlJFRVZYRlMgRklMRVNZU1RFTQotTToJQ2hyaXN0b3BoIEhlbGx3aWcgJmx0O2hjaEBpbmZyYWRlYWQub3JnJmd0OwotUzoJTWFpbnRhaW5lZAotVzoJZnRwOi8vZnRwLm9wZW5saW51eC5vcmcvcHViL3Blb3BsZS9oY2gvdnhmcwotRjoJZnMvZnJlZXZ4ZnMvCi0KIEZSRUVaRVIKIE06CSYjMzQ7UmFmYWVsIEouIFd5c29ja2kmIzM0OyAmbHQ7cmFmYWVsQGtlcm5lbC5vcmcmZ3Q7CiBSOglQYXZlbCBNYWNoZWsgJmx0O3BhdmVsQGtlcm5lbC5vcmcmZ3Q7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBjZjZhZTY0Nzc2ZTYyLi42ZTdlNjNhZmFlMmIyIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL0tjb25maWcKQEAgLTMyMSw3ICYjNDM7MzIxLDYgQEAgc291cmNlICYjMzQ7ZnMvamZmczIvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy91Ymlmcy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL2NyYW1mcy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL3NxdWFzaGZzL0tjb25maWcmIzM0Owotc291cmNlICYjMzQ7ZnMvZnJlZXZ4ZnMvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy9taW5peC9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2ZzL29tZnMvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtmcy9ocGZzL0tjb25maWcmIzM0OwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA4OWE4YTlkMjA3ZDFjLi5hYzBkMWMwMDUyM2YwIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi9mcy9NYWtlZmlsZQpAQCAtODAsNyAmIzQzOzgwLDYgQEAgb2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpCSYjNDM7PSBpc29mcy8KIG9iai0kKENPTkZJR19IRlNQTFVTX0ZTKQkmIzQzOz0gaGZzcGx1cy8gIyBCZWZvcmUgaGZzIHRvIGZpbmQgd3JhcHBlZCBIRlMmIzQzOwogb2JqLSQoQ09ORklHX0hGU19GUykJCSYjNDM7PSBoZnMvCiBvYmotJChDT05GSUdfRUNSWVBUX0ZTKQkJJiM0Mzs9IGVjcnlwdGZzLwotb2JqLSQoQ09ORklHX1ZYRlNfRlMpCQkmIzQzOz0gZnJlZXZ4ZnMvCiBvYmotJChDT05GSUdfTkZTX0ZTKQkJJiM0Mzs9IG5mcy8KIG9iai0kKENPTkZJR19FWFBPUlRGUykJCSYjNDM7PSBleHBvcnRmcy8KIG9iai0kKENPTkZJR19ORlNEKQkJJiM0Mzs9IG5mc2QvCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyMTA3ZWJlYTZmNC4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMjcgJiM0MzswLDAgQEAKLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotY29uZmlnIFZYRlNfRlMKLQl0cmlzdGF0ZSAmIzM0O0ZyZWVWeEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKFZFUklUQVMgVnhGUyhUTSkgY29tcGF0aWJsZSkmIzM0OwotCWRlcGVuZHMgb24gQkxPQ0sKLQlzZWxlY3QgQlVGRkVSX0hFQUQKLQloZWxwCi0JICBGcmVlVnhGUyBpcyBhIGZpbGUgc3lzdGVtIGRyaXZlciB0aGF0IHN1cHBvcnQgdGhlIFZFUklUQVMgVnhGUyhUTSkKLQkgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtCi0JICBvZiBTQ08gVW5peFdhcmUgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGFuZCBvcHRpb25hbGx5IGF2YWlsYWJsZQotCSAgZm9yIFN1bnNvZnQgU29sYXJpcywgSFAtVVggYW5kIG1hbnkgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIEhvd2V2ZXIKLQkgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrCi0JICBkYXRhIGVuZGlhbm5lc3MgYW5kL29yIHN1cGVyYmxvY2sgb2Zmc2V0LiBUaGUgdnhmcyBtb2R1bGUgaGFzIGJlZW4KLQkgIHRlc3RlZCB3aXRoIFNDTyBVbml4V2FyZSBhbmQgSFAtVVggQi4xMC4yMCAocGEtcmlzYyAxLjEgYXJjaC4pCi0JICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zCi0JICAyLCAzIGFuZCA0LiBUZXN0cyB3ZXJlIHBlcmZvcm1lZCB3aXRoIEhQLVVYIFZ4RlMgdmVyc2lvbiAzLgotCi0JICBOT1RFOiB0aGUgZmlsZSBzeXN0ZW0gdHlwZSBhcyB1c2VkIGJ5IG1vdW50KDEpLCBtb3VudCgyKSBhbmQKLQkgIGZzdGFiKDUpIGlzICYjMzk7dnhmcyYjMzk7IGFzIGl0IGRlc2NyaWJlcyB0aGUgZmlsZSBzeXN0ZW0gZm9ybWF0LCBub3QKLQkgIHRoZSBhY3R1YWwgZHJpdmVyLgotCi0JICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXMKLQkgIGNyZWF0aW5nIEhQLVVYIGxvZ2ljYWwgdm9sdW1lcyBlYXN5IGZyb20gSFAtVVggZGlzayBibG9jayBkZXZpY2UgZmlsZQotCSAgb3IgcmVndWxhciBmaWxlIHdpdGggaW1hZ2Ugb2YgdGhlIGRpc2suIFNlZToKLQkgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzLwotCi0JICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGZyZWV2eGZzLiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWU1OTI5MTUyMWMuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw5ICYjNDM7MCwwIEBACi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLSMKLSMgVnhGUyBNYWtlZmlsZQotIwotCi1vYmotJChDT05GSUdfVlhGU19GUykgJiM0Mzs9IGZyZWV2eGZzLm8KLQotZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXAotCQkgdnhmc19sb29rdXAubyB2eGZzX29sdC5vIHZ4ZnNfc3Vici5vIHZ4ZnNfc3VwZXIubwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZkMTU2ZDY0MzRjLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDI1NyAmIzQzOzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0jaWZuZGVmIF9WWEZTX1NVUEVSX0hfCi0jZGVmaW5lIF9WWEZTX1NVUEVSX0hfCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayBzdHJ1Y3R1cmUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlCi0gKiBzdXBlcmJsb2NrcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLgotICovCi0jaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKLQotLyoKLSAqIFN1cGVyYmxvY2sgbWFnaWMgbnVtYmVyICh2eGZzX3N1cGVyLSZndDt2c19tYWdpYykuCi0gKi8KLSNkZWZpbmUgVlhGU19TVVBFUl9NQUdJQwkweGE1MDFGQ0Y1Ci0KLS8qCi0gKiBUaGUgcm9vdCBpbm9kZS4KLSAqLwotI2RlZmluZSBWWEZTX1JPT1RfSU5PCQkyCi0KLS8qCi0gKiBOdW0gb2YgZW50cmllcyBpbiBmcmVlIGV4dGVudCBhcnJheQotICovCi0jZGVmaW5lIFZYRlNfTkVGUkVFCQkzMgotCi1lbnVtIHZ4ZnNfYnl0ZV9vcmRlciB7Ci0JVlhGU19CT19MRSwKLQlWWEZTX0JPX0JFLAotfTsKLQotdHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2OwotdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyOwotdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19mczY0OwotCi0vKgotICogVnhGUyBzdXBlcmJsb2NrIChkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfc2IgewotCS8qCi0JICogUmVhZG9ubHkgZmllbGRzIGZvciB0aGUgdmVyc2lvbiAxIHN1cGVyYmxvY2suCi0JICoKLQkgKiBMb3RzIG9mIHRoaXMgZmllbGRzIGFyZSBubyBtb3JlIHVzZWQgYnkgdmVyc2lvbiAyCi0JICogYW5kIG5ldmVyIGZpbGVzeXN0ZW1zLgotCSAqLwotCV9fZnMzMgkJdnNfbWFnaWM7CQkvKiBNYWdpYyBudW1iZXIgKi8KLQlfX2ZzMzIJCXZzX3ZlcnNpb247CQkvKiBWeEZTIHZlcnNpb24gKi8KLQlfX2ZzMzIJCXZzX2N0aW1lOwkJLyogY3JlYXRlIHRpbWUgLSBzZWNzICovCi0JX19mczMyCQl2c19jdXRpbWU7CQkvKiBjcmVhdGUgdGltZSAtIHVzZWNzICovCi0JX19mczMyCQlfX3VudXNlZDE7CQkvKiB1bnVzZWQgKi8KLQlfX2ZzMzIJCV9fdW51c2VkMjsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfb2xkX2xvZ3N0YXJ0OwkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfb2xkX2xvZ2VuZDsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19ic2l6ZTsJCS8qIGJsb2NrIHNpemUgKi8KLQlfX2ZzMzIJCXZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzICovCi0JX19mczMyCQl2c19kc2l6ZTsJCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqLwotCV9fZnMzMgkJdnNfb2xkX25pbm9kZTsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfbmF1OwkJLyogb2Jzb2xldGUgKi8KLQlfX2ZzMzIJCV9fdW51c2VkMzsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfb2xkX2RlZmlleHRzaXplOwkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfb2xkX2lsYnNpemU7CQkvKiBvYnNvbGV0ZSAqLwotCV9fZnMzMgkJdnNfaW1tZWRsZW47CQkvKiBzaXplIG9mIGltbWVkaWF0ZSBkYXRhIGFyZWEgKi8KLQlfX2ZzMzIJCXZzX25kYWRkcjsJCS8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi8KLQlfX2ZzMzIJCXZzX2ZpcnN0YXU7CQkvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovCi0JX19mczMyCQl2c19lbWFwOwkJLyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX2ltYXA7CQkvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovCi0JX19mczMyCQl2c19pZXh0b3A7CQkvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqLwotCV9fZnMzMgkJdnNfaXN0YXJ0OwkJLyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX2JzdGFydDsJCS8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovCi0JX19mczMyCQl2c19mZW1hcDsJCS8qIGF1Zmlyc3QgJiM0MzsgZW1hcCAqLwotCV9fZnMzMgkJdnNfZmltYXA7CQkvKiBhdWZpcnN0ICYjNDM7IGltYXAgKi8KLQlfX2ZzMzIJCXZzX2ZpZXh0b3A7CQkvKiBhdWZpcnN0ICYjNDM7IGlleHRvcCAqLwotCV9fZnMzMgkJdnNfZmlzdGFydDsJCS8qIGF1Zmlyc3QgJiM0MzsgaXN0YXJ0ICovCi0JX19mczMyCQl2c19mYnN0YXJ0OwkJLyogYXVmaXJzdCAmIzQzOyBic3RhcnQgKi8KLQlfX2ZzMzIJCXZzX25pbmRpcjsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGluZGlyICovCi0JX19mczMyCQl2c19hdWxlbjsJCS8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1aW1sZW47CQkvKiBsZW5ndGggb2YgaW1hcCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1ZW1sZW47CQkvKiBsZW5ndGggb2YgZW1hcCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1aWxlbjsJCS8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1cGFkOwkJLyogbGVuZ3RoIG9mIHBhZCBpbiBibG9ja3MgKi8KLQlfX2ZzMzIJCXZzX2F1YmxvY2tzOwkJLyogZGF0YSBibG9ja3MgaW4gQVUgKi8KLQlfX2ZzMzIJCXZzX21heHRpZXI7CQkvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovCi0JX19mczMyCQl2c19pbm9wYjsJCS8qIG51bWJlciBvZiBpbm9kZXMgcGVyIGJsayAqLwotCV9fZnMzMgkJdnNfb2xkX2lub3BhdTsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfaW5vcGlsYjsJCS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19vbGRfbmRpcmlwYXU7CS8qIG9ic29sZXRlICovCi0JX19mczMyCQl2c19pYWRkcmxlbjsJCS8qIHNpemUgb2YgaW5kaXJlY3QgYWRkciBleHQuICovCi0JX19mczMyCQl2c19ic2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovCi0JX19mczMyCQl2c19pbm9zaGlmdDsJCS8qIGxvZyBiYXNlIDIgb2YgaW5vYnAgKi8KLQlfX2ZzMzIJCXZzX2JtYXNrOwkJLyogfiggYnNpemUgLSAxICkgKi8KLQlfX2ZzMzIJCXZzX2JvZmZtYXNrOwkJLyogYnNpemUgLSAxICovCi0JX19mczMyCQl2c19vbGRfaW5vbWFzazsJCS8qIG9sZF9pbm9waWxiIC0gMSAqLwotCV9fZnMzMgkJdnNfY2hlY2tzdW07CQkvKiBjaGVja3N1bSBvZiBWMSBkYXRhICovCi0JCi0JLyoKLQkgKiBWZXJzaW9uIDEsIHdyaXRhYmxlCi0JICovCi0JX19mczMyCQl2c19mcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCi0JX19mczMyCQl2c19pZnJlZTsJCS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLwotCV9fZnMzMgkJdnNfZWZyZWVbVlhGU19ORUZSRUVdOwkvKiBudW1iZXIgb2YgZnJlZSBleHRlbnRzIGJ5IHNpemUgKi8KLQlfX2ZzMzIJCXZzX2ZsYWdzOwkJLyogZmxhZ3MgPyE/ICovCi0JX191OAkJdnNfbW9kOwkJCS8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLwotCV9fdTgJCXZzX2NsZWFuOwkJLyogY2xlYW4gRlMgKi8KLQlfX2ZzMTYJCV9fdW51c2VkNDsJCS8qIHVudXNlZCAqLwotCV9fZnMzMgkJdnNfZmlyc3Rsb2dpZDsJCS8qIG1vdW50IHRpbWUgbG9nIElEICovCi0JX19mczMyCQl2c193dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovCi0JX19mczMyCQl2c193dXRpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHVzZWMgKi8KLQlfX3U4CQl2c19mbmFtZVs2XTsJCS8qIEZTIG5hbWUgKi8KLQlfX3U4CQl2c19mcGFja1s2XTsJCS8qIEZTIHBhY2sgbmFtZSAqLwotCV9fZnMzMgkJdnNfbG9ndmVyc2lvbjsJCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqLwotCV9fdTMyCQlfX3VudXNlZDU7CQkvKiB1bnVzZWQgKi8KLQkKLQkvKgotCSAqIFZlcnNpb24gMiwgUmVhZC1vbmx5Ci0JICovCi0JX19mczMyCQl2c19vbHRleHRbMl07CQkvKiBPTFQgZXh0ZW50IGFuZCByZXBsaWNhICovCi0JX19mczMyCQl2c19vbHRzaXplOwkJLyogT0xUIGV4dGVudCBzaXplICovCi0JX19mczMyCQl2c19pYXVpbWxlbjsJCS8qIHNpemUgb2YgaW5vZGUgbWFwICovCi0JX19mczMyCQl2c19pYXVzaXplOwkJLyogc2l6ZSBvZiBJQVUgaW4gYmxvY2tzICovCi0JX19mczMyCQl2c19kaW5vc2l6ZTsJCS8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi8KLQlfX2ZzMzIJCXZzX29sZF9kbmlhZGRyOwkJLyogaW5kaXIgbGV2ZWxzIHBlciBpbm9kZSAqLwotCV9fZnMzMgkJdnNfY2hlY2tzdW0yOwkJLyogY2hlY2tzdW0gb2YgVjIgUk8gKi8KLQotCS8qCi0JICogQWN0dWFsbHkgbXVjaCBtb3JlLi4uCi0JICovCi19OwotCi0KLS8qCi0gKiBJbiBjb3JlIHN1cGVyYmxvY2sgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZm9yIFZ4RlMuCi0gKi8KLXN0cnVjdCB2eGZzX3NiX2luZm8gewotCXN0cnVjdCB2eGZzX3NiCQkqdnNpX3JhdzsJLyogcmF3IChvbiBkaXNrKSBzdXBlcmJsb2NrICovCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSp2c2lfYnA7CS8qIGJ1ZmZlciBmb3IgcmF3IHN1cGVyYmxvY2sqLwotCXN0cnVjdCBpbm9kZQkJKnZzaV9mc2hpcDsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KLQlzdHJ1Y3QgaW5vZGUJCSp2c2lfaWxpc3Q7CS8qIGlub2RlIGxpc3QgaW5vZGUgKi8KLQlzdHJ1Y3QgaW5vZGUJCSp2c2lfc3RpbGlzdDsJLyogc3RydWN0dXJhbCBpbm9kZSBsaXN0IGlub2RlICovCi0JdV9sb25nCQkJdnNpX2lleHQ7CS8qIGluaXRpYWwgaW5vZGUgbGlzdCAqLwotCWlub190CQkJdnNpX2ZzaGlubzsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KLQlkYWRkcl90CQkJdnNpX29sdGV4dDsJLyogT0xUIGV4dGVudCAqLwotCWRhZGRyX3QJCQl2c2lfb2x0c2l6ZTsJLyogT0xUIHNpemUgKi8KLQllbnVtIHZ4ZnNfYnl0ZV9vcmRlcglieXRlX29yZGVyOwotfTsKLQotc3RhdGljIGlubGluZSB1MTYgZnMxNl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMTYgYSkKLXsKLQlpZiAoc2JpLSZndDtieXRlX29yZGVyID09IFZYRlNfQk9fQkUpCi0JCXJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7Ci0JZWxzZQotCQlyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgX19sZTE2KWEpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBmczMyX3RvX2NwdShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksIF9fZnMzMiBhKQotewotCWlmIChzYmktJmd0O2J5dGVfb3JkZXIgPT0gVlhGU19CT19CRSkKLQkJcmV0dXJuIGJlMzJfdG9fY3B1KChfX2ZvcmNlIF9fYmUzMilhKTsKLQllbHNlCi0JCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpYSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IGZzNjRfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczY0IGEpCi17Ci0JaWYgKHNiaS0mZ3Q7Ynl0ZV9vcmRlciA9PSBWWEZTX0JPX0JFKQotCQlyZXR1cm4gYmU2NF90b19jcHUoKF9fZm9yY2UgX19iZTY0KWEpOwotCWVsc2UKLQkJcmV0dXJuIGxlNjRfdG9fY3B1KChfX2ZvcmNlIF9fbGU2NClhKTsKLX0KLQotLyoKLSAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZAotICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0Ci0gKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuCi0gKi8KLWVudW0gdnhmc19tb2RlIHsKLQlWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCwJLyogc2V0dWlkICovCi0JVlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsCS8qIHNldGdpZCAqLwotCVZYRlNfSVNWVFggPSAweDAwMDAwMjAwLAkvKiBzdGlja3kgYml0ICovCi0JVlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsCS8qIHJlYWQgKi8KLQlWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsCS8qIHdyaXRlICovCi0JVlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsCS8qIGV4ZWMgKi8KLQotCVZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLAkvKiBOYW1lZCBwaXBlICovCi0JVlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KLQlWWEZTX0lGRElSID0gMHgwMDAwNDAwMCwJLyogRGlyZWN0b3J5ICovCi0JVlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsCS8qIFhlbml4IGRldmljZSA/PyAqLwotCVZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLAkvKiBCbG9jayBkZXZpY2UgKi8KLQlWWEZTX0lGUkVHID0gMHgwMDAwODAwMCwJLyogUmVndWxhciBmaWxlICovCi0JVlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsCS8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi8KLQlWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCwJLyogU3ltbGluayAqLwotCVZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLAkvKiBTb2NrZXQgKi8KLQotCS8qIFZ4RlMgaW50ZXJuYWwgKi8KLQlWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCwJLyogRmlsZXNldCBoZWFkZXIgKi8KLQlWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCwJLyogSW5vZGUgbGlzdCAqLwotCVZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLAkvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi8KLQlWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCwJLyogQ3VycmVudCB1c2FnZSB0YWJsZSAqLwotCVZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLAkvKiBBdHRyLiBpbm9kZSAqLwotCVZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLAkvKiBMaW5rIGNvdW50IHRhYmxlICovCi0JVlhGU19JRklBVCA9IDB4NzAwMDAwMDAsCS8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovCi0JVlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsCS8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqLwotCVZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLAkvKiBCU0QgcXVvdGEgZmlsZSAqLwotCVZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLAkvKiAmIzM0O1Bhc3MgdGhyb3VnaCYjMzQ7IGlub2RlICovCi0JVlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsCS8qIERldmljZSBsYWJlbCBmaWxlICovCi0JVlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsCS8qIE9MVCBmaWxlICovCi0JVlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsCS8qIExvZyBmaWxlICovCi0JVlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsCS8qIEV4dGVudCBtYXAgZmlsZSAqLwotCVZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLAkvKiBFeHRlbnQgQVUgZmlsZSAqLwotCVZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLAkvKiBFeHRlbnQgQVUgc3VtbWFyeSBmaWxlICovCi0JVlhGU19JRkRFViA9IDB4MTcwMDAwMDAsCS8qIERldmljZSBjb25maWcgZmlsZSAqLwotCi19OwotCi0jZGVmaW5lCVZYRlNfVFlQRV9NQVNLCQkweGZmZmZmMDAwCi0KLSNkZWZpbmUgVlhGU19JU19UWVBFKGlwLHR5cGUpCSgoKGlwKS0mZ3Q7dmlpX21vZGUgJmFtcDsgVlhGU19UWVBFX01BU0spID09ICh0eXBlKSkKLSNkZWZpbmUgVlhGU19JU0ZJRk8oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRklGTykKLSNkZWZpbmUgVlhGU19JU0NIUih4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ0hSKQotI2RlZmluZSBWWEZTX0lTRElSKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZESVIpCi0jZGVmaW5lIFZYRlNfSVNOQU0oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRk5BTSkKLSNkZWZpbmUgVlhGU19JU0JMSyh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQkxLKQotI2RlZmluZSBWWEZTX0lTTE5LKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZMTkspCi0jZGVmaW5lIFZYRlNfSVNSRUcoeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlJFRykKLSNkZWZpbmUgVlhGU19JU0NNUCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ01QKQotI2RlZmluZSBWWEZTX0lTU09DKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZTT0MpCi0KLSNkZWZpbmUgVlhGU19JU0ZTSCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKQotI2RlZmluZSBWWEZTX0lTSUxUKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpCi0KLS8qCi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLgotICovCi1lbnVtIHsKLQlWWEZTX09SR19OT05FCT0gMCwJLyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqLwotCVZYRlNfT1JHX0VYVDQJPSAxLAkvKiBFeHQ0ICovCi0JVlhGU19PUkdfSU1NRUQJPSAyLAkvKiBBbGwgZGF0YSBzdG9yZWQgaW4gaW5vZGUgKi8KLQlWWEZTX09SR19UWVBFRAk9IDMsCS8qIFR5cGVkIGV4dGVudHMgKi8KLX07Ci0KLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKQkoKGlwKS0mZ3Q7dmlpX29yZ3R5cGUgPT0gKG9yZykpCi0jZGVmaW5lIFZYRlNfSVNOT05FKGlwKQkJVlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSkKLSNkZWZpbmUgVlhGU19JU0VYVDQoaXApCQlWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KQotI2RlZmluZSBWWEZTX0lTSU1NRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX0lNTUVEKQotI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX1RZUEVEKQotCi0vKgotICogR2V0IGZpbGVzeXN0ZW0gcHJpdmF0ZSBkYXRhIGZyb20gVkZTIHN1cGVyYmxvY2suCi0gKi8KLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcCi0JKChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktJmd0O3NfZnNfaW5mbykKLQotI2VuZGlmIC8qIF9WWEZTX1NVUEVSX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2JtYXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgyMTZlYjFkOTBhLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMjcyICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc3lzdGVtIHRvIGRpc2sgYmxvY2sgbWFwcGluZy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvYnVmZmVyX2hlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLQotI2luY2x1ZGUgJiMzNDt2eGZzLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2lub2RlLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2V4dGVybi5oJiMzNDsKLQotCi0jaWZkZWYgRElBR05PU1RJQwotc3RhdGljIHZvaWQKLXZ4ZnNfdHlwZHVtcChzdHJ1Y3Qgdnhmc190eXBlZCAqdHlwKQotewotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7dHlwZT0lTHUgJiMzNDssIHR5cC0mZ3Q7dnRfaGRyICZndDsmZ3Q7IFZYRlNfVFlQRURfVFlQRVNISUZUKTsKLQlwcmludGsoJiMzNDtvZmZzZXQ9JUx4ICYjMzQ7LCB0eXAtJmd0O3Z0X2hkciAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0spOwotCXByaW50aygmIzM0O2Jsb2NrPSV4ICYjMzQ7LCB0eXAtJmd0O3Z0X2Jsb2NrKTsKLQlwcmludGsoJiMzNDtzaXplPSV4XG4mIzM0OywgdHlwLSZndDt2dF9zaXplKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzCi0gKiBAaXA6CQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGJuOgkJbG9naWNhbCBibG9jay4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aAotICogICBleHQ0LXN0eWxlIGV4dGVudHMgKHdoaWNoIGFyZSBtdWNoIGxpa2UgdGhlIHRyYWRpdGlvbmFsIFVOSVgKLSAqICAgaW5vZGUgb3JnYW5pc2F0aW9uKS4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KLSAqLwotc3RhdGljIGRhZGRyX3QKLXZ4ZnNfYm1hcF9leHQ0KHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgYm4pCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLSZndDtpX3NiOwotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmkgPSBWWEZTX1NCSShzYik7Ci0JdW5zaWduZWQgbG9uZyBic2l6ZSA9IHNiLSZndDtzX2Jsb2Nrc2l6ZTsKLQl1MzIgaW5kc2l6ZSA9IGZzMzJfdG9fY3B1KHNiaSwgdmlwLSZndDt2aWlfZXh0NC52ZTRfaW5kc2l6ZSk7Ci0JaW50IGk7Ci0KLQlpZiAoaW5kc2l6ZSAmZ3Q7IHNiLSZndDtzX2Jsb2Nrc2l6ZSkKLQkJZ290byBmYWlsX3NpemU7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgVlhGU19OREFERFI7IGkmIzQzOyYjNDM7KSB7Ci0JCXN0cnVjdCBkaXJlY3QgKmQgPSB2aXAtJmd0O3ZpaV9leHQ0LnZlNF9kaXJlY3QgJiM0MzsgaTsKLQkJaWYgKGJuICZndDs9IDAgJmFtcDsmYW1wOyBibiAmbHQ7IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7c2l6ZSkpCi0JCQlyZXR1cm4gKGJuICYjNDM7IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7ZXh0ZW50KSk7Ci0JCWJuIC09IGZzMzJfdG9fY3B1KHNiaSwgZC0mZ3Q7c2l6ZSk7Ci0JfQotCi0JaWYgKChibiAvIChpbmRzaXplICogaW5kc2l6ZSAqIGJzaXplIC8gNCkpID09IDApIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpidWY7Ci0JCWRhZGRyX3QJYm5vOwotCQlfX2ZzMzIgKmluZGlyOwotCi0JCWJ1ZiA9IHNiX2JyZWFkKHNiLAotCQkJZnMzMl90b19jcHUoc2JpLCB2aXAtJmd0O3ZpaV9leHQ0LnZlNF9pbmRpclswXSkpOwotCQlpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKQotCQkJZ290byBmYWlsX2J1ZjsKLQotCQlpbmRpciA9IChfX2ZzMzIgKilidWYtJmd0O2JfZGF0YTsKLQkJYm5vID0gZnMzMl90b19jcHUoc2JpLCBpbmRpclsoYm4gLyBpbmRzaXplKSAlIChpbmRzaXplICogYm4pXSkgJiM0MzsKLQkJCShibiAlIGluZHNpemUpOwotCi0JCWJyZWxzZShidWYpOwotCQlyZXR1cm4gYm5vOwotCX0gZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7bm8gbWF0Y2hpbmcgaW5kaXI/JiMzNDspOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfc2l6ZToKLQlwcmludGsoJiMzNDt2eGZzOiBpbmRpcmVjdCBleHRlbnQgdG9vIGJpZyFcbiYjMzQ7KTsKLWZhaWxfYnVmOgotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHZ4ZnNfYm1hcF9pbmRpciAtIHJlY3Vyc2lvbiBmb3Igdnhmc19ibWFwX3R5cGVkCi0gKiBAaXA6CQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGluZGlyOglpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0Ci0gKiBAc2l6ZToJc2l6ZSBvZiB0aGUgdHlwZWQgYXJlYSB0byBzZWFyY2gKLSAqIEBibG9jazoJcGFydGlhbGx5IHJlc3VsdCBmcm9tIGZ1cnRoZXIgc2VhcmNoZXMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwX2luZGlyIHJlYWRzIGEgJmFtcDtzdHJ1Y3Qgdnhmc190eXBlZCBhdCBAaW5kaXIKLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICoKLSAqIE5vdGU6Ci0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/Ci0gKi8KLXN0YXRpYyBkYWRkcl90Ci12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkJKnNiaSA9IFZYRlNfU0JJKGlwLSZndDtpX3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicCA9IE5VTEw7Ci0JZGFkZHJfdAkJCQlwYmxvY2sgPSAwOwotCWludAkJCQlpOwotCi0JZm9yIChpID0gMDsgaSAmbHQ7IHNpemUgKiBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0mZ3Q7aV9zYik7IGkmIzQzOyYjNDM7KSB7Ci0JCXN0cnVjdCB2eGZzX3R5cGVkCSp0eXA7Ci0JCWludDY0X3QJCQlvZmY7Ci0KLQkJYnAgPSBzYl9icmVhZChpcC0mZ3Q7aV9zYiwKLQkJCQlpbmRpciAmIzQzOyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLSZndDtpX3NiKSkpOwotCQlpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkKLQkJCXJldHVybiAwOwotCi0JCXR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC0mZ3Q7Yl9kYXRhKSAmIzQzOwotCQkJKGkgJSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0mZ3Q7aV9zYikpOwotCQlvZmYgPSBmczY0X3RvX2NwdShzYmksIHR5cC0mZ3Q7dnRfaGRyKSAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0s7Ci0KLQkJaWYgKGJsb2NrICZsdDsgb2ZmKSB7Ci0JCQlicmVsc2UoYnApOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2ggKCh1X2ludDMyX3QpKGZzNjRfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9oZHIpICZndDsmZ3Q7Ci0JCQkJVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7Ci0JCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDoKLQkJCXBibG9jayA9IHZ4ZnNfYm1hcF9pbmRpcihpcCwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpLAotCQkJCQlibG9jayAtIG9mZik7Ci0JCQlpZiAocGJsb2NrID09IC0yKQotCQkJCWJyZWFrOwotCQkJZ290byBvdXQ7Ci0JCWNhc2UgVlhGU19UWVBFRF9EQVRBOgotCQkJaWYgKChibG9jayAtIG9mZikgJmd0Oz0gZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpKQotCQkJCWJyZWFrOwotCQkJcGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSAmIzQzOyBibG9jayAtIG9mZjsKLQkJCWdvdG8gb3V0OwotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDoKLQkJY2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDogewotCQkJc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NAkqdHlwNCA9Ci0JCQkJKHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7Ci0KLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtcblxuVFlQRURfREVWNCBkZXRlY3RlZCFcbiYjMzQ7KTsKLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtibG9jazogJWxsdVx0c2l6ZTogJWxsZFx0ZGV2OiAlZFxuJiMzNDssCi0JCQkgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LSZndDt2ZDRfYmxvY2spLAotCQkJICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X3NpemUpLAotCQkJICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X2RldikpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgJiMzNDslczolZCB2dF9oZHIgJWxsdVxuJiMzNDssIF9fZnVuY19fLAotCQkJCV9fTElORV9fLCBmczY0X3RvX2NwdShzYmksIHR5cC0mZ3Q7dnRfaGRyKSk7Ci0JCQlCVUcoKTsKLQkJfQotCQlicmVsc2UoYnApOwotCX0KLQotZmFpbDoKLQlwYmxvY2sgPSAwOwotb3V0OgotCWJyZWxzZShicCk7Ci0JcmV0dXJuIChwYmxvY2spOwotfQotCi0vKioKLSAqIHZ4ZnNfYm1hcF90eXBlZCAtIGJtYXAgZm9yIHR5cGVkIGV4dGVudHMKLSAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCi0gKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFBlcmZvcm1zIHRoZSBibWFwIG9wZXJhdGlvbiBmb3IgdHlwZWQgZXh0ZW50cy4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KLSAqLwotc3RhdGljIGRhZGRyX3QKLXZ4ZnNfYm1hcF90eXBlZChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaykKLXsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oaXApOwotCXN0cnVjdCB2eGZzX3NiX2luZm8JCSpzYmkgPSBWWEZTX1NCSShpcC0mZ3Q7aV9zYik7Ci0JZGFkZHJfdAkJCQlwYmxvY2sgPSAwOwotCWludAkJCQlpOwotCi0JZm9yIChpID0gMDsgaSAmbHQ7IFZYRlNfTlRZUEVEOyBpJiM0MzsmIzQzOykgewotCQlzdHJ1Y3Qgdnhmc190eXBlZAkqdHlwID0gdmlwLSZndDt2aWlfb3JnLnR5cGVkICYjNDM7IGk7Ci0JCXU2NAkJCWhkciA9IGZzNjRfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9oZHIpOwotCQlpbnQ2NF90CQkJb2ZmID0gKGhkciAmYW1wOyBWWEZTX1RZUEVEX09GRlNFVE1BU0spOwotCi0jaWZkZWYgRElBR05PU1RJQwotCQl2eGZzX3R5cGR1bXAodHlwKTsKLSNlbmRpZgotCQlpZiAoaWJsb2NrICZsdDsgb2ZmKQotCQkJY29udGludWU7Ci0JCXN3aXRjaCAoKHUzMikoaGRyICZndDsmZ3Q7IFZYRlNfVFlQRURfVFlQRVNISUZUKSkgewotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6Ci0JCQlwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsCi0JCQkJCWZzMzJfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9ibG9jayksCi0JCQkJCWZzMzJfdG9fY3B1KHNiaSwgdHlwLSZndDt2dF9zaXplKSwKLQkJCQkJaWJsb2NrIC0gb2ZmKTsKLQkJCWlmIChwYmxvY2sgPT0gLTIpCi0JCQkJYnJlYWs7Ci0JCQlyZXR1cm4gKHBibG9jayk7Ci0JCWNhc2UgVlhGU19UWVBFRF9EQVRBOgotCQkJaWYgKChpYmxvY2sgLSBvZmYpICZsdDsgZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X3NpemUpKQotCQkJCXJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtJmd0O3Z0X2Jsb2NrKSAmIzQzOwotCQkJCQkJaWJsb2NrIC0gb2ZmKTsKLQkJCWJyZWFrOwotCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDoKLQkJY2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDogewotCQkJc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NAkqdHlwNCA9Ci0JCQkJKHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7Ci0KLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtcblxuVFlQRURfREVWNCBkZXRlY3RlZCFcbiYjMzQ7KTsKLQkJCXByaW50ayhLRVJOX0lORk8gJiMzNDtibG9jazogJWxsdVx0c2l6ZTogJWxsZFx0ZGV2OiAlZFxuJiMzNDssCi0JCQkgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LSZndDt2ZDRfYmxvY2spLAotCQkJICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X3NpemUpLAotCQkJICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC0mZ3Q7dmQ0X2RldikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCVdBUk5fT05fT05DRSgxKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdnhmc19ibWFwMSAtIHZ4ZnMtaW50ZXJuYWwgYm1hcCBvcGVyYXRpb24KLSAqIEBpcDoJCQlwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvcgotICogQGlibG9jazoJCWxvZ2ljYWwgYmxvY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nCi0gKiAgIGZvciB2eGZzLWludGVybmFsIHB1cnBvc2VzLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICovCi1kYWRkcl90Ci12eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgaWJsb2NrKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXAgPSBWWEZTX0lOTyhpcCk7Ci0KLQlpZiAoVlhGU19JU0VYVDQodmlwKSkKLQkJcmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spOwotCWlmIChWWEZTX0lTVFlQRUQodmlwKSkKLQkJcmV0dXJuIHZ4ZnNfYm1hcF90eXBlZChpcCwgaWJsb2NrKTsKLQlpZiAoVlhGU19JU05PTkUodmlwKSkKLQkJZ290byB1bnN1cHA7Ci0JaWYgKFZYRlNfSVNJTU1FRCh2aXApKQotCQlnb3RvIHVuc3VwcDsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgJiMzNDt2eGZzOiBpbm9kZSAlbGx1IGhhcyBubyB2YWxpZCBvcmd0eXBlICgleClcbiYjMzQ7LAotCQkJaXAtJmd0O2lfaW5vLCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLQlCVUcoKTsKLQotdW5zdXBwOgotCXByaW50ayhLRVJOX1dBUk5JTkcgJiMzNDt2eGZzOiBpbm9kZSAlbGx1IGhhcyBhbiB1bnN1cHBvcnRlZCBvcmd0eXBlICgleClcbiYjMzQ7LAotCQkJaXAtJmd0O2lfaW5vLCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw2OCAmIzQzOzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICovCi0jaWZuZGVmIF9WWEZTX0RJUl9IXwotI2RlZmluZSBfVlhGU19ESVJfSF8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBkaXJlY3Rvcnkgc3RydWN0dXJlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdnhmcyBkaXJlY3RvcnkgZm9ybWF0LgotICovCi0KLQotLyoKLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci4KLSAqCi0gKiBUaGlzIGVudHJ5IGlzIHRoZSBoZWFkIG9mIGV2ZXJ5IGZpbGVzeXN0ZW0gYmxvY2sgaW4gYSBkaXJlY3RvcnkuCi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlcwotICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLgotICoKLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGUKLSAqIExpbnV4IGRyaXZlciBmb3Igbm93LgotICovCi1zdHJ1Y3Qgdnhmc19kaXJibGsgewotCV9fZnMxNgkJZF9mcmVlOwkJLyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqLwotCV9fZnMxNgkJZF9uaGFzaDsJLyogbm8gb2YgaGFzaCBjaGFpbnMgKi8KLQlfX2ZzMTYJCWRfaGFzaFtdOwkvKiBoYXNoIGNoYWluICovCi19OwotCi0vKgotICogVlhGU19OQU1FTEVOIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZF9uYW1lIGZpZWxkCi0gKglvZiBhbiBWeEZTIGRpcmVjdG9yeSBlbnRyeS4KLSAqLwotI2RlZmluZSBWWEZTX05BTUVMRU4JMjU2Ci0KLS8qCi0gKiBWeEZTIGRpcmVjdG9yeSBlbnRyeS4KLSAqLwotc3RydWN0IHZ4ZnNfZGlyZWN0IHsKLQlfX2ZzMzIJCWRfaW5vOwkJCS8qIGlub2RlIG51bWJlciAqLwotCV9fZnMxNgkJZF9yZWNsZW47CQkvKiByZWNvcmQgbGVuZ3RoICovCi0JX19mczE2CQlkX25hbWVsZW47CQkvKiBkX25hbWUgbGVuZ3RoICovCi0JX19mczE2CQlkX2hhc2huZXh0OwkJLyogbmV4dCBoYXNoIGVudHJ5ICovCi0JY2hhcgkJZF9uYW1lW1ZYRlNfTkFNRUxFTl07CS8qIG5hbWUgKi8KLX07Ci0KLS8qCi0gKiBWWEZTX0RJUlBBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cnkgYm91bmRhcmllcywgaXMgX211c3RfIGJlCi0gKglhIG11bHRpcGxlIG9mIGZvdXIuCi0gKiBWWEZTX05BTUVNSU4gaXMgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeSB3aXRoIGEgTlVMTCBkX25hbWUuCi0gKiBWWEZTX0RJUlJPVU5EIGlzIGFuIGludGVybmFsIG1hY3JvcyB0aGF0IHJvdW5kcyBhIGxlbmd0aCB0byBhIHZhbHVlCi0gKgl1c2FibGUgZm9yIGRpcmVjdG9yeSBzaXplcy4KLSAqIFZYRlNfRElSTEVOIGNhbGN1bGF0ZXMgdGhlIGRpcmVjdG9yeSBlbnRyeSBzaXplIGZvciBhbiBlbnRyeSB3aXRoCi0gKglhIGRfbmFtZSB3aXRoIHNpemUgbGVuLgotICovCi0jZGVmaW5lIFZYRlNfRElSUEFECQk0Ci0jZGVmaW5lIFZYRlNfTkFNRU1JTgkJb2Zmc2V0b2Yoc3RydWN0IHZ4ZnNfZGlyZWN0LCBkX25hbWUpCi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKQkoKFZYRlNfRElSUEFEICYjNDM7IChsZW4pIC0gMSkgJmFtcDsgfihWWEZTX0RJUlBBRCAtMSkpCi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbikJKFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICYjNDM7IChsZW4pKSkKLQotLyoKLSAqIFZYRlNfRElSQkxLT1YgaXMgdGhlIG92ZXJoZWFkIG9mIGEgc3BlY2lmaWMgZGlyYmxvY2suCi0gKi8KLSNkZWZpbmUgVlhGU19ESVJCTEtPVihzYmksIGRicCkJXAotCSgoc2l6ZW9mKHNob3J0KSAqIGZzMTZfdG9fY3B1KHNiaSwgZGJwLSZndDtkX25oYXNoKSkgJiM0MzsgNCkKLQotI2VuZGlmIC8qIF9WWEZTX0RJUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjE4MGM1ZTIwOGQuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaAomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDQ5ICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLSNpZm5kZWYgX1ZYRlNfRVhURVJOX0hfCi0jZGVmaW5lIF9WWEZTX0VYVEVSTl9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGV4dGVybmFsIHByb3RvdHlwZXMuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yIGFsbCB2eGZzIGZ1bmN0aW9ucyB1c2VkCi0gKiBvdXRzaWRlIHRoZWlyIHJlc3BlY3RpdmUgc291cmNlIGZpbGVzLgotICovCi0KLQotc3RydWN0IGttZW1fY2FjaGU7Ci1zdHJ1Y3Qgc3VwZXJfYmxvY2s7Ci1zdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvOwotc3RydWN0IGlub2RlOwotCi0KLS8qIHZ4ZnNfYm1hcC5jICovCi1leHRlcm4gZGFkZHJfdAkJCXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICosIGxvbmcpOwotCi0vKiB2eGZzX2ZzaGVhZC5jICovCi1leHRlcm4gaW50CQkJdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0KLS8qIHZ4ZnNfaW5vZGUuYyAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzOwotZXh0ZXJuIHZvaWQJCQl2eGZzX2R1bXBpKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKiwgaW5vX3QpOwotZXh0ZXJuIHN0cnVjdCBpbm9kZQkJKnZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nLCBpbm9fdCk7Ci1leHRlcm4gc3RydWN0IGlub2RlCQkqdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKLWV4dGVybiBzdHJ1Y3QgaW5vZGUJCSp2eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKLWV4dGVybiB2b2lkCQkJdnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci0KLS8qIHZ4ZnNfbG9va3VwLmMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucwl2eGZzX2Rpcl9pbm9kZV9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwl2eGZzX2Rpcl9vcGVyYXRpb25zOwotCi0vKiB2eGZzX29sdC5jICovCi1leHRlcm4gaW50CQkJdnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTsKLQotLyogdnhmc19zdWJyLmMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wczsKLWV4dGVybiBzdHJ1Y3QgcGFnZSAqCQl2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7Ci1leHRlcm4gdm9pZAkJCXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKik7Ci1leHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICoJdnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLQotI2VuZGlmIC8qIF9WWEZTX0VYVEVSTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWI4YmRmN2E2Y2EuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDE2NiAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2ZzaGVhZC5oJiMzNDsKLQotCi0jaWZkZWYgRElBR05PU1RJQwotc3RhdGljIHZvaWQKLXZ4ZnNfZHVtcGZzaChzdHJ1Y3Qgdnhmc19mc2ggKmZocCkKLXsKLQlwcmludGsoJiMzNDtcblxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcbiYjMzQ7KTsKLQlwcmludGsoJiMzNDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4mIzM0Oyk7Ci0JcHJpbnRrKCYjMzQ7dmVyc2lvbjogJXVcbiYjMzQ7LCBmaHAtJmd0O2ZzaF92ZXJzaW9uKTsKLQlwcmludGsoJiMzNDtmc2luZGV4OiAldVxuJiMzNDssIGZocC0mZ3Q7ZnNoX2ZzaW5kZXgpOwotCXByaW50aygmIzM0O2lhdWlubzogJXVcdG5pbm9kZXM6JXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfaWF1aW5vLCBmaHAtJmd0O2ZzaF9uaW5vZGVzKTsKLQlwcmludGsoJiMzNDttYXhpbm9kZTogJXVcdGxjdGlubzogJXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfbWF4aW5vZGUsIGZocC0mZ3Q7ZnNoX2xjdGlubyk7Ci0JcHJpbnRrKCYjMzQ7bmF1OiAldVxuJiMzNDssIGZocC0mZ3Q7ZnNoX25hdSk7Ci0JcHJpbnRrKCYjMzQ7aWxpc3Rpbm9bMF06ICV1XHRpbGlzdGlub1sxXTogJXVcbiYjMzQ7LAotCQkJZmhwLSZndDtmc2hfaWxpc3Rpbm9bMF0sIGZocC0mZ3Q7ZnNoX2lsaXN0aW5vWzFdKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeQotICogQGlwOgkJdGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZQotICogQHdoaWNoOgkwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlcgotICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICovCi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICoKLXZ4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaCkKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKLQotCWJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpOwotCWlmIChicCkgewotCQlzdHJ1Y3Qgdnhmc19mc2gJCSpmaHA7Ci0KLQkJaWYgKCEoZmhwID0ga21hbGxvY19vYmooKmZocCkpKQotCQkJZ290byBvdXQ7Ci0JCW1lbWNweShmaHAsIGJwLSZndDtiX2RhdGEsIHNpemVvZigqZmhwKSk7Ci0KLQkJcHV0X2JoKGJwKTsKLQkJcmV0dXJuIChmaHApOwotCX0KLW91dDoKLQlicmVsc2UoYnApOwotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHZ4ZnNfcmVhZF9mc2hlYWQgLSByZWFkIHRoZSBmaWxlc2V0IGhlYWRlcnMKLSAqIEBzYnA6CXN1cGVyYmxvY2sgdG8gd2hpY2ggdGhlIGZpbGVzZXQgYmVsb25ncwotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX3JlYWRfZnNoZWFkIHdpbGwgZmlsbCB0aGUgaW5vZGUgYW5kIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbiBAc2IuCi0gKgotICogUmV0dXJuczoKLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZSAoLUVJTlZBTCkuCi0gKi8KLWludAotdnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCkKLXsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCQkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0Jc3RydWN0IHZ4ZnNfZnNoCQkJKnBmcCwgKnNmcDsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwOwotCi0JaW5mcC0mZ3Q7dnNpX2ZzaGlwID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0mZ3Q7dnNpX2lleHQsIGluZnAtJmd0O3ZzaV9mc2hpbm8pOwotCWlmICghaW5mcC0mZ3Q7dnNpX2ZzaGlwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGZzaCBpbm9kZVxuJiMzNDspOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2aXAgPSBWWEZTX0lOTyhpbmZwLSZndDt2c2lfZnNoaXApOwotCWlmICghVlhGU19JU0ZTSCh2aXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IGZzaCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuJiMzNDssCi0JCQkJdmlwLSZndDt2aWlfbW9kZSAmYW1wOyBWWEZTX1RZUEVfTUFTSyk7IAotCQlnb3RvIG91dF9pcHV0X2ZzaGlwOwotCX0KLQotI2lmZGVmIERJQUdOT1NUSUMKLQlwcmludGsoJiMzNDt2eGZzOiBmc2ggaW5vZGUgZHVtcDpcbiYjMzQ7KTsKLQl2eGZzX2R1bXBpKHZpcCwgaW5mcC0mZ3Q7dnNpX2ZzaGlubyk7Ci0jZW5kaWYKLQotCXNmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtJmd0O3ZzaV9mc2hpcCwgMCk7Ci0JaWYgKCFzZnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxuJiMzNDspOwotCQlnb3RvIG91dF9pcHV0X2ZzaGlwOwotCX0gCi0KLSNpZmRlZiBESUFHTk9TVElDCi0Jdnhmc19kdW1wZnNoKHNmcCk7Ci0jZW5kaWYKLQotCXBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtJmd0O3ZzaV9mc2hpcCwgMSk7Ci0JaWYgKCFwZnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxuJiMzNDspOwotCQlnb3RvIG91dF9mcmVlX3NmcDsKLQl9Ci0KLSNpZmRlZiBESUFHTk9TVElDCi0Jdnhmc19kdW1wZnNoKHBmcCk7Ci0jZW5kaWYKLQotCWluZnAtJmd0O3ZzaV9zdGlsaXN0ID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0mZ3Q7dnNpX2lleHQsCi0JCQlmczMyX3RvX2NwdShpbmZwLCBzZnAtJmd0O2ZzaF9pbGlzdGlub1swXSkpOwotCWlmICghaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGxpc3QgaW5vZGVcbiYjMzQ7KTsKLQkJZ290byBvdXRfZnJlZV9wZnA7Ci0JfQotCWlmICghVlhGU19JU0lMVChWWEZTX0lOTyhpbmZwLSZndDt2c2lfc3RpbGlzdCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAmIzM0O3Z4ZnM6IHN0cnVjdHVyYWwgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcbiYjMzQ7LAotCQkJCVZYRlNfSU5PKGluZnAtJmd0O3ZzaV9zdGlsaXN0KS0mZ3Q7dmlpX21vZGUgJmFtcDsgVlhGU19UWVBFX01BU0spOyAKLQkJZ290byBvdXRfaXB1dF9zdGlsaXN0OwotCX0KLQotCWluZnAtJmd0O3ZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLSZndDtmc2hfaWxpc3Rpbm9bMF0pKTsKLQlpZiAoIWluZnAtJmd0O3ZzaV9pbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgJiMzNDt2eGZzOiB1bmFibGUgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcbiYjMzQ7KTsKLQkJZ290byBvdXRfaXB1dF9zdGlsaXN0OwotCX0KLQlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0mZ3Q7dnNpX2lsaXN0KSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICYjMzQ7dnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcbiYjMzQ7LAotCQkJCVZYRlNfSU5PKGluZnAtJmd0O3ZzaV9pbGlzdCktJmd0O3ZpaV9tb2RlICZhbXA7IFZYRlNfVFlQRV9NQVNLKTsKLQkJZ290byBvdXRfaXB1dF9pbGlzdDsKLQl9Ci0KLQlrZnJlZShwZnApOwotCWtmcmVlKHNmcCk7Ci0JcmV0dXJuIDA7Ci0KLSBvdXRfaXB1dF9pbGlzdDoKLSAJaXB1dChpbmZwLSZndDt2c2lfaWxpc3QpOwotIG91dF9pcHV0X3N0aWxpc3Q6Ci0gCWlwdXQoaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpOwotIG91dF9mcmVlX3BmcDoKLQlrZnJlZShwZnApOwotIG91dF9mcmVlX3NmcDoKLSAJa2ZyZWUoc2ZwKTsKLSBvdXRfaXB1dF9mc2hpcDoKLQlpcHV0KGluZnAtJmd0O3ZzaV9mc2hpcCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkMjE0NzU5OWM0OS4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsNDMgJiM0MzswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotI2lmbmRlZiBfVlhGU19GU0hFQURfSF8KLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBoeXNpY2FsIHN0cnVjdHVyZSBvZiB0aGUgVnhGUwotICogZmlsZXNldCBoZWFkZXIuCi0gKi8KLQotCi0vKgotICogRmlsZXNldCBoZWFkZXIgCi0gKi8KLXN0cnVjdCB2eGZzX2ZzaCB7Ci0JX19mczMyCQlmc2hfdmVyc2lvbjsJCS8qIGZpbGVzZXQgaGVhZGVyIHZlcnNpb24gKi8KLQlfX2ZzMzIJCWZzaF9mc2luZGV4OwkJLyogZmlsZXNldCBpbmRleCAqLwotCV9fZnMzMgkJZnNoX3RpbWU7CQkvKiBtb2RpZmljYXRpb24gdGltZSAtIHNlYyAqLwotCV9fZnMzMgkJZnNoX3V0aW1lOwkJLyogbW9kaWZpY2F0aW9uIHRpbWUgLSB1c2VjICovCi0JX19mczMyCQlmc2hfZXh0b3A7CQkvKiBleHRvcCBmbGFncyAqLwotCV9fZnMzMgkJZnNoX25pbm9kZXM7CQkvKiBhbGxvY2F0ZWQgaW5vZGVzICovCi0JX19mczMyCQlmc2hfbmF1OwkJLyogbnVtYmVyIG9mIElBVXMgKi8KLQlfX2ZzMzIJCWZzaF9vbGRfaWxlc2l6ZTsJLyogb2xkIHNpemUgb2YgaWxpc3QgKi8KLQlfX2ZzMzIJCWZzaF9kZmxhZ3M7CQkvKiBmbGFncyAqLwotCV9fZnMzMgkJZnNoX3F1b3RhOwkJLyogcXVvdGEgbGltaXQgKi8KLQlfX2ZzMzIJCWZzaF9tYXhpbm9kZTsJCS8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovCi0JX19mczMyCQlmc2hfaWF1aW5vOwkJLyogSUFVIGlub2RlICovCi0JX19mczMyCQlmc2hfaWxpc3Rpbm9bMl07CS8qIGlsaXN0IGlub2RlcyAqLwotCV9fZnMzMgkJZnNoX2xjdGlubzsJCS8qIGxpbmsgY291bnQgdGFibGUgaW5vZGUgKi8KLQotCS8qCi0JICogU2xpZ2h0bHkgbW9yZSBmaWVsZHMgZm9sbG93LCBidXQgdGhleQotCSAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZAotCSAqICBiKSBkaWZmZXIgYSBsb3QgaW4gZGlmZmVyZW50IHZ4ZnMgdmVyc2lvbnMvcG9ydHMKLQkgKi8KLX07Ci0KLSNlbmRpZiAvKiBfVlhGU19GU0hFQURfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1MWZjZDM0NzU3Mi4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSw1MyAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwcG9ydCBmb3IgJiMzOTtpbW1lZCYjMzk7IGlub2Rlcy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2lub2RlLmgmIzM0OwotCi0vKioKLSAqIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyAtIHJlYWQgcGFydCBvZiBhbiBpbW1lZCBpbm9kZSBpbnRvIHBhZ2VjYWNoZQotICogQGZwOgkJZmlsZSBjb250ZXh0ICh1bnVzZWQpCi0gKiBAZm9saW86CWZvbGlvIHRvIGZpbGwgaW4uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlCi0gKiAgIGZpbGUgdGhhdCBob3N0cyBAZm9saW8gaW50byB0aGUgcGFnZWNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKgotICogTG9ja2luZyBzdGF0dXM6Ci0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19pbW1lZF9yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGZvbGlvICpmb2xpbykKLXsKLQlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAgPSBWWEZTX0lOTyhmb2xpby0mZ3Q7bWFwcGluZy0mZ3Q7aG9zdCk7Ci0Jdm9pZCAqc3JjID0gdmlwLSZndDt2aWlfaW1tZWQudmlfaW1tZWQgJiM0MzsgZm9saW9fcG9zKGZvbGlvKTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgZm9saW9fbnJfcGFnZXMoZm9saW8pOyBpJiM0MzsmIzQzOykgewotCQltZW1jcHlfdG9fcGFnZShmb2xpb19wYWdlKGZvbGlvLCBpKSwgMCwgc3JjLCBQQUdFX1NJWkUpOwotCQlzcmMgJiM0Mzs9IFBBR0VfU0laRTsKLQl9Ci0KLQlmb2xpb19tYXJrX3VwdG9kYXRlKGZvbGlvKTsKLQlmb2xpb191bmxvY2soZm9saW8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KLSAqLwotY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7Ci0JLnJlYWRfZm9saW8gPQl2eGZzX2ltbWVkX3JlYWRfZm9saW8sCi19OwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWZjOTRiOTgyMDlmLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDMxNCAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9uYW1laS5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnMuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLSNpZmRlZiBESUFHTk9TVElDCi0vKgotICogRHVtcCBpbm9kZSBjb250ZW50cyAocGFydGlhbGx5KS4KLSAqLwotdm9pZAotdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubykKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O1xuXG4mIzM0Oyk7Ci0JaWYgKGlubykKLQkJcHJpbnRrKEtFUk5fREVCVUcgJiMzNDtkdW1waW5nIHZ4ZnMgaW5vZGUgJWxkXG4mIzM0OywgaW5vKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7ZHVtcGluZyB1bmtub3duIHZ4ZnMgaW5vZGVcbiYjMzQ7KTsKLQotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4mIzM0Oyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDttb2RlIGlzICV4XG4mIzM0OywgdmlwLSZndDt2aWlfbW9kZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDtubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcbiYjMzQ7LAotCQkJdmlwLSZndDt2aWlfbmxpbmssIHZpcC0mZ3Q7dmlpX3VpZCwgdmlwLSZndDt2aWlfZ2lkKTsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O3NpemU6JUx4LCBibG9ja3M6JXVcbiYjMzQ7LAotCQkJdmlwLSZndDt2aWlfc2l6ZSwgdmlwLSZndDt2aWlfYmxvY2tzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAmIzM0O29yZ3R5cGU6JXVcbiYjMzQ7LCB2aXAtJmd0O3ZpaV9vcmd0eXBlKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHZ4ZnNfdHJhbnNtb2QgLSBtb2RlIGZvciBhIFZ4RlMgaW5vZGUKLSAqIEB2aXA6CVZ4RlMgaW5vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW4KLSAqICBWeEZTIGlub2RlIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW1vZGVfdAotdnhmc190cmFuc21vZChzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXApCi17Ci0JdW1vZGVfdAkJCXJldCA9IHZpcC0mZ3Q7dmlpX21vZGUgJmFtcDsgflZYRlNfVFlQRV9NQVNLOwotCi0JaWYgKFZYRlNfSVNGSUZPKHZpcCkpCi0JCXJldCB8PSBTX0lGSUZPOwotCWlmIChWWEZTX0lTQ0hSKHZpcCkpCi0JCXJldCB8PSBTX0lGQ0hSOwotCWlmIChWWEZTX0lTRElSKHZpcCkpCi0JCXJldCB8PSBTX0lGRElSOwotCWlmIChWWEZTX0lTQkxLKHZpcCkpCi0JCXJldCB8PSBTX0lGQkxLOwotCWlmIChWWEZTX0lTTE5LKHZpcCkpCi0JCXJldCB8PSBTX0lGTE5LOwotCWlmIChWWEZTX0lTUkVHKHZpcCkpCi0JCXJldCB8PSBTX0lGUkVHOwotCWlmIChWWEZTX0lTU09DKHZpcCkpCi0JCXJldCB8PSBTX0lGU09DSzsKLQotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpcDJ2aXBfY3B5KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwKLQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBzdHJ1Y3Qgdnhmc19kaW5vZGUgKmRpcCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmFtcDt2aXAtJmd0O3Zmc19pbm9kZTsKLQotCXZpcC0mZ3Q7dmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX21vZGUpOwotCXZpcC0mZ3Q7dmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV9ubGluayk7Ci0JdmlwLSZndDt2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV91aWQpOwotCXZpcC0mZ3Q7dmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfZ2lkKTsKLQl2aXAtJmd0O3ZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtJmd0O3ZkaV9zaXplKTsKLQl2aXAtJmd0O3ZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYXRpbWUpOwotCXZpcC0mZ3Q7dmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYXV0aW1lKTsKLQl2aXAtJmd0O3ZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfbXRpbWUpOwotCXZpcC0mZ3Q7dmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfbXV0aW1lKTsKLQl2aXAtJmd0O3ZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfY3RpbWUpOwotCXZpcC0mZ3Q7dmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfY3V0aW1lKTsKLQl2aXAtJmd0O3ZpaV9vcmd0eXBlID0gZGlwLSZndDt2ZGlfb3JndHlwZTsKLQotCXZpcC0mZ3Q7dmlpX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLSZndDt2ZGlfYmxvY2tzKTsKLQl2aXAtJmd0O3ZpaV9nZW4gPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX2dlbik7Ci0KLQlpZiAoVlhGU19JU0RJUih2aXApKQotCQl2aXAtJmd0O3ZpaV9kb3Rkb3QgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX2RvdGRvdCk7Ci0JZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSAmYW1wOyZhbXA7ICFWWEZTX0lTTE5LKHZpcCkpCi0JCXZpcC0mZ3Q7dmlpX3JkZXYgPSBmczMyX3RvX2NwdShzYmksIGRpcC0mZ3Q7dmRpX3JkZXYpOwotCi0JLyogZG9uJiMzOTt0IGVuZGlhbiBzd2FwIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYnkgb3JndHlwZSAqLwotCW1lbWNweSgmYW1wO3ZpcC0mZ3Q7dmlpX29yZywgJmFtcDtkaXAtJmd0O3ZkaV9vcmcsIHNpemVvZih2aXAtJmd0O3ZpaV9vcmcpKTsKLQotCWlub2RlLSZndDtpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7Ci0JaV91aWRfd3JpdGUoaW5vZGUsICh1aWRfdCl2aXAtJmd0O3ZpaV91aWQpOwotCWlfZ2lkX3dyaXRlKGlub2RlLCAoZ2lkX3QpdmlwLSZndDt2aWlfZ2lkKTsKLQotCXNldF9ubGluayhpbm9kZSwgdmlwLSZndDt2aWlfbmxpbmspOwotCWlub2RlLSZndDtpX3NpemUgPSB2aXAtJmd0O3ZpaV9zaXplOwotCi0JaW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9hdGltZSwgMCk7Ci0JaW5vZGVfc2V0X2N0aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9jdGltZSwgMCk7Ci0JaW5vZGVfc2V0X210aW1lKGlub2RlLCB2aXAtJmd0O3ZpaV9tdGltZSwgMCk7Ci0KLQlpbm9kZS0mZ3Q7aV9ibG9ja3MgPSB2aXAtJmd0O3ZpaV9ibG9ja3M7Ci0JaW5vZGUtJmd0O2lfZ2VuZXJhdGlvbiA9IHZpcC0mZ3Q7dmlpX2dlbjsKLX0KLQotLyoqCi0gKiB2eGZzX2Jsa2lnZXQgLSBmaW5kIGlub2RlIGJhc2VkIG9uIGV4dGVudCAjCi0gKiBAc2JwOglzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpbgotICogQGV4dGVudDoJbnVtYmVyIG9mIHRoZSBleHRlbnQgdG8gc2VhcmNoCi0gKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gc2VhcmNoCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgdnhmc19ibGtpZ2V0IHNlYXJjaGVzIGlub2RlIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5Ci0gKiAgQHNicCBpbiB0aGUgZXh0ZW50IEBleHRlbnQuCi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgotICoKLSAqIE5PVEU6Ci0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZQotICogIGJ1ZmZlcmNhY2hlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGUKLSAqICByZWFkX3N1cGVyKCkgbWV0aG9kLCBvdGhlcndpc2UgdGhlIGRhdGEgbWF5IGJlIGluY29oZXJlbnQuCi0gKi8KLXN0cnVjdCBpbm9kZSAqCi12eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHVfbG9uZyBleHRlbnQsIGlub190IGlubykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKLQlzdHJ1Y3QgaW5vZGUJCQkqaW5vZGU7Ci0JdV9sb25nCQkJCWJsb2NrLCBvZmZzZXQ7Ci0KLQlpbm9kZSA9IG5ld19pbm9kZShzYnApOwotCWlmICghaW5vZGUpCi0JCXJldHVybiBOVUxMOwotCWlub2RlLSZndDtpX2lubyA9IGdldF9uZXh0X2lubygpOwotCi0JYmxvY2sgPSBleHRlbnQgJiM0MzsgKChpbm8gKiBWWEZTX0lTSVpFKSAvIHNicC0mZ3Q7c19ibG9ja3NpemUpOwotCW9mZnNldCA9ICgoaW5vICUgKHNicC0mZ3Q7c19ibG9ja3NpemUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFKTsKLQlicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spOwotCi0JaWYgKGJwICZhbXA7JmFtcDsgYnVmZmVyX21hcHBlZChicCkpIHsKLQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwID0gVlhGU19JTk8oaW5vZGUpOwotCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKLQotCQlkaXAgPSAoc3RydWN0IHZ4ZnNfZGlub2RlICopKGJwLSZndDtiX2RhdGEgJiM0Mzsgb2Zmc2V0KTsKLQkJZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApOwotCQl2aXAtJmd0O3Zmc19pbm9kZS5pX21hcHBpbmctJmd0O2Ffb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0jaWZkZWYgRElBR05PU1RJQwotCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKLSNlbmRpZgotCQlicmVsc2UoYnApOwotCQlyZXR1cm4gaW5vZGU7Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAmIzM0O3Z4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxuJiMzNDssIGJsb2NrKTsKLQlicmVsc2UoYnApOwotCWlwdXQoaW5vZGUpOwotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIF9fdnhmc19pZ2V0IC0gZ2VuZXJpYyBmaW5kIGlub2RlIGZhY2lsaXR5Ci0gKiBAaWxpc3RwOgkJaW5vZGUgbGlzdAotICogQHZpcDoJCVZ4RlMgaW5vZGUgdG8gZmlsbCBpbgotICogQGlubzoJCWlub2RlIG51bWJlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogIFNlYXJjaCB0aGUgZm9yIGlub2RlIG51bWJlciBAaW5vIGluIHRoZSBmaWxlc3lzdGVtCi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuCi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhbiBlcnJvciBjb2RlLgotICovCi1zdGF0aWMgaW50Ci1fX3Z4ZnNfaWdldChzdHJ1Y3QgaW5vZGUgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pCi17Ci0Jc3RydWN0IHBhZ2UJCQkqcHA7Ci0JdV9sb25nCQkJCW9mZnNldDsKLQotCW9mZnNldCA9IChpbm8gJSAoUEFHRV9TSVpFIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRTsKLQlwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLSZndDtpX21hcHBpbmcsIGlubyAqIFZYRlNfSVNJWkUgLyBQQUdFX1NJWkUpOwotCi0JaWYgKCFJU19FUlIocHApKSB7Ci0JCXN0cnVjdCB2eGZzX2Rpbm9kZQkqZGlwOwotCQljYWRkcl90CQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShrYWRkciAmIzQzOyBvZmZzZXQpOwotCQlkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtJmd0O2lfc2IpLCB2aXAsIGRpcCk7Ci0JCXZpcC0mZ3Q7dmZzX2lub2RlLmlfbWFwcGluZy0mZ3Q7YV9vcHMgPSAmYW1wO3Z4ZnNfYW9wczsKLSNpZmRlZiBESUFHTk9TVElDCi0JCXZ4ZnNfZHVtcGkodmlwLCBpbm8pOwotI2VuZGlmCi0JCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICYjMzQ7dnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcbiYjMzQ7LAotCQlwcCwgKHVuc2lnbmVkIGxvbmcpaW5vKTsKLQlyZXR1cm4gUFRSX0VSUihwcCk7Ci19Ci0KLS8qKgotICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QKLSAqIEBzYnA6CVZGUyBzdXBlcmJsb2NrCi0gKiBAaW5vOglpbm9kZSAjCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nCi0gKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC4KLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgotICovCi1zdHJ1Y3QgaW5vZGUgKgotdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubykKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCWludCBlcnJvcjsKLQotCWlub2RlID0gbmV3X2lub2RlKHNicCk7Ci0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5vZGUtJmd0O2lfaW5vID0gZ2V0X25leHRfaW5vKCk7Ci0KLQllcnJvciA9IF9fdnhmc19pZ2V0KFZYRlNfU0JJKHNicCktJmd0O3ZzaV9zdGlsaXN0LCBWWEZTX0lOTyhpbm9kZSksIGlubyk7Ci0JaWYgKGVycm9yKSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gaW5vZGU7Ci19Ci0KLS8qKgotICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlCi0gKiBAc2JwOgl0aGUgc3VwZXJibG9jayB0byBnZXQgdGhlIGlub2RlIGZvcgotICogQGlubzoJdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gZ2V0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgdnhmc19yZWFkX2lub2RlIGNyZWF0ZXMgYW4gaW5vZGUsIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaW5vIGFuZCBmaWxscwotICogIGluIGFsbCByZWxldmFudCBmaWVsZHMgaW4gdGhlIG5ldyBpbm9kZS4KLSAqLwotc3RydWN0IGlub2RlICoKLXZ4ZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXA7Ci0JY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkqYW9wczsKLQlzdHJ1Y3QgaW5vZGUgKmlwOwotCWludCBlcnJvcjsKLQotCWlwID0gaWdldF9sb2NrZWQoc2JwLCBpbm8pOwotCWlmICghaXApCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgJmFtcDsgSV9ORVcpKQotCQlyZXR1cm4gaXA7Ci0KLQl2aXAgPSBWWEZTX0lOTyhpcCk7Ci0JZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLSZndDt2c2lfaWxpc3QsIHZpcCwgaW5vKTsKLQlpZiAoZXJyb3IpIHsKLQkJaWdldF9mYWlsZWQoaXApOwotCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JfQotCi0JaWYgKFZYRlNfSVNJTU1FRCh2aXApKQotCQlhb3BzID0gJmFtcDt2eGZzX2ltbWVkX2FvcHM7Ci0JZWxzZQotCQlhb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0KLQlpZiAoU19JU1JFRyhpcC0mZ3Q7aV9tb2RlKSkgewotCQlpcC0mZ3Q7aV9mb3AgPSAmYW1wO2dlbmVyaWNfcm9fZm9wczsKLQkJaXAtJmd0O2lfbWFwcGluZy0mZ3Q7YV9vcHMgPSBhb3BzOwotCX0gZWxzZSBpZiAoU19JU0RJUihpcC0mZ3Q7aV9tb2RlKSkgewotCQlpcC0mZ3Q7aV9vcCA9ICZhbXA7dnhmc19kaXJfaW5vZGVfb3BzOwotCQlpcC0mZ3Q7aV9mb3AgPSAmYW1wO3Z4ZnNfZGlyX29wZXJhdGlvbnM7Ci0JCWlwLSZndDtpX21hcHBpbmctJmd0O2Ffb3BzID0gYW9wczsKLQl9IGVsc2UgaWYgKFNfSVNMTksoaXAtJmd0O2lfbW9kZSkpIHsKLQkJaWYgKCFWWEZTX0lTSU1NRUQodmlwKSkgewotCQkJaXAtJmd0O2lfb3AgPSAmYW1wO3BhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQkJaW5vZGVfbm9oaWdobWVtKGlwKTsKLQkJCWlwLSZndDtpX21hcHBpbmctJmd0O2Ffb3BzID0gJmFtcDt2eGZzX2FvcHM7Ci0JCX0gZWxzZSB7Ci0JCQlpcC0mZ3Q7aV9vcCA9ICZhbXA7c2ltcGxlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJCWlwLSZndDtpX2xpbmsgPSB2aXAtJmd0O3ZpaV9pbW1lZC52aV9pbW1lZDsKLQkJCW5kX3Rlcm1pbmF0ZV9saW5rKGlwLSZndDtpX2xpbmssIGlwLSZndDtpX3NpemUsCi0JCQkJCSAgc2l6ZW9mKHZpcC0mZ3Q7dmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpOwotCQl9Ci0JfSBlbHNlCi0JCWluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtJmd0O2lfbW9kZSwgb2xkX2RlY29kZV9kZXYodmlwLSZndDt2aWlfcmRldikpOwotCi0JdW5sb2NrX25ld19pbm9kZShpcCk7Ci0JcmV0dXJuIGlwOwotfQotCi0vKioKLSAqIHZ4ZnNfZXZpY3RfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeQotICogQGlwOgkJaW5vZGUgdG8gZGlzY2FyZC4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICB2eGZzX2V2aWN0X2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZQotICogIGlub2RlIGFyZWEuCi0gKi8KLXZvaWQKLXZ4ZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppcCkKLXsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19maW5hbCgmYW1wO2lwLSZndDtpX2RhdGEpOwotCWNsZWFyX2lub2RlKGlwKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZTEzOGQyYjMzOC4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmgKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwxNjkgJiM0MzswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotI2lmbmRlZiBfVlhGU19JTk9ERV9IXwotI2RlZmluZSBfVlhGU19JTk9ERV9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmUKLSAqIGlub2RlcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLgotICovCi0KLQotI2RlZmluZSBWWEZTX0lTSVpFCQkweDEwMAkJLyogSW5vZGUgc2l6ZSAqLwotCi0jZGVmaW5lIFZYRlNfTkRBRERSCQkxMAkJLyogTnVtYmVyIG9mIGRpcmVjdCBhZGRycyBpbiBpbm9kZSAqLwotI2RlZmluZSBWWEZTX05JQUREUgkJMgkJLyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovCi0jZGVmaW5lIFZYRlNfTklNTUVECQk5NgkJLyogU2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBpbiBpbm9kZSAqLwotI2RlZmluZSBWWEZTX05UWVBFRAkJNgkJLyogTnVtIG9mIHR5cGVkIGV4dGVudHMgKi8KLQotI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0sJKDB4MDBGRkZGRkZGRkZGRkZGRlVMTCkKLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFTUFTSwkoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKQotI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVTSElGVAk1NgotCi0jZGVmaW5lIFZYRlNfVFlQRURfUEVSX0JMT0NLKHNicCkgXAotCSgoc2JwKS0mZ3Q7c19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKQotCi0vKgotICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLgotICovCi1lbnVtIHsKLQlWWEZTX1RZUEVEX0lORElSRUNUCQk9IDEsCi0JVlhGU19UWVBFRF9EQVRBCQkJPSAyLAotCVZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNAk9IDMsCi0JVlhGU19UWVBFRF9EQVRBX0RFVjQJCT0gNCwKLX07Ci0KLS8qCi0gKiBEYXRhIHN0b3JlZCBpbW1lZGlhdGVseSBpbiB0aGUgaW5vZGUuCi0gKi8KLXN0cnVjdCB2eGZzX2ltbWVkIHsKLQlfX3U4CQkJdmlfaW1tZWRbVlhGU19OSU1NRURdOwotfTsKLQotc3RydWN0IHZ4ZnNfZXh0NCB7Ci0JX19mczMyCQkJdmU0X3NwYXJlOwkJLyogPz8gKi8KLQlfX2ZzMzIJCQl2ZTRfaW5kc2l6ZTsJCS8qIEluZGlyZWN0IGV4dGVudCBzaXplICovCi0JX19mczMyCQkJdmU0X2luZGlyW1ZYRlNfTklBRERSXTsJLyogSW5kaXJlY3QgZXh0ZW50cyAqLwotCXN0cnVjdCBkaXJlY3QgewkJCQkJLyogRGlyZWN0IGV4dGVudHMgKi8KLQkJX19mczMyCQlleHRlbnQ7CQkJLyogRXh0ZW50IG51bWJlciAqLwotCQlfX2ZzMzIJCXNpemU7CQkJLyogU2l6ZSBvZiBleHRlbnQgKi8KLQl9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdOwotfTsKLQotc3RydWN0IHZ4ZnNfdHlwZWQgewotCV9fZnM2NAkJdnRfaGRyOwkJLyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi8KLQlfX2ZzMzIJCXZ0X2Jsb2NrOwkvKiBFeHRlbnQgYmxvY2sgKi8KLQlfX2ZzMzIJCXZ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCi19OwotCi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHsKLQlfX2ZzNjQJCXZkNF9oZHI7CS8qIEhlYWRlciwgMHhUVE9PT09PT09PT09PT09POyBUPXR5cGUsTz1vZmZzICovCi0JX19mczY0CQl2ZDRfYmxvY2s7CS8qIEV4dGVudCBibG9jayAqLwotCV9fZnM2NAkJdmQ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCi0JX19mczMyCQl2ZDRfZGV2OwkvKiBEZXZpY2UgSUQgKi8KLQlfX3U4CQlfX3BhZDE7Ci19OwotCi0vKgotICogVGhlIGlub2RlIGFzIGNvbnRhaW5lZCBvbiB0aGUgcGh5c2ljYWwgZGV2aWNlLgotICovCi1zdHJ1Y3Qgdnhmc19kaW5vZGUgewotCV9fZnMzMgkJdmRpX21vZGU7Ci0JX19mczMyCQl2ZGlfbmxpbms7CS8qIExpbmsgY291bnQgKi8KLQlfX2ZzMzIJCXZkaV91aWQ7CS8qIFVJRCAqLwotCV9fZnMzMgkJdmRpX2dpZDsJLyogR0lEICovCi0JX19mczY0CQl2ZGlfc2l6ZTsJLyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqLwotCV9fZnMzMgkJdmRpX2F0aW1lOwkvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi8KLQlfX2ZzMzIJCXZkaV9hdXRpbWU7CS8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHVzZWMgKi8KLQlfX2ZzMzIJCXZkaV9tdGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqLwotCV9fZnMzMgkJdmRpX211dGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi8KLQlfX2ZzMzIJCXZkaV9jdGltZTsJLyogQ3JlYXRlIHRpbWUgLSBzZWMgKi8KLQlfX2ZzMzIJCXZkaV9jdXRpbWU7CS8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqLwotCV9fdTgJCXZkaV9hZmxhZ3M7CS8qIEFsbG9jYXRpb24gZmxhZ3MgKi8KLQlfX3U4CQl2ZGlfb3JndHlwZTsJLyogT3JnYW5pc2F0aW9uIHR5cGUgKi8KLQlfX2ZzMTYJCXZkaV9lb3BmbGFnczsKLQlfX2ZzMzIJCXZkaV9lb3BkYXRhOwotCXVuaW9uIHsKLQkJX19mczMyCQkJcmRldjsKLQkJX19mczMyCQkJZG90ZG90OwotCQlzdHJ1Y3QgewotCQkJX191MzIJCXJlc2VydmVkOwotCQkJX19mczMyCQlmaXhleHRzaXplOwotCQl9IGlfcmVndWxhcjsKLQkJc3RydWN0IHsKLQkJCV9fZnMzMgkJbWF0Y2hpbm87Ci0JCQlfX2ZzMzIJCWZzZXRpbmRleDsKLQkJfSBpX3Z4c3BlYzsKLQkJX191NjQJCQlhbGlnbjsKLQl9IHZkaV9mdGFyZWE7Ci0JX19mczMyCQl2ZGlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KLQlfX2ZzMzIJCXZkaV9nZW47CS8qIElub2RlIGdlbmVyYXRpb24gKi8KLQlfX2ZzNjQJCXZkaV92ZXJzaW9uOwkvKiBWZXJzaW9uICovCi0JdW5pb24gewotCQlzdHJ1Y3Qgdnhmc19pbW1lZAlpbW1lZDsKLQkJc3RydWN0IHZ4ZnNfZXh0NAlleHQ0OwotCQlzdHJ1Y3Qgdnhmc190eXBlZAl0eXBlZFtWWEZTX05UWVBFRF07Ci0JfSB2ZGlfb3JnOwotCV9fZnMzMgkJdmRpX2lhdHRyaW5vOwotfTsKLQotI2RlZmluZSB2ZGlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKLSNkZWZpbmUgdmRpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAotI2RlZmluZSB2ZGlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQotI2RlZmluZSB2ZGlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KLSNkZWZpbmUgdmRpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKLQotI2RlZmluZSB2ZGlfaW1tZWQJdmRpX29yZy5pbW1lZAotI2RlZmluZSB2ZGlfZXh0NAl2ZGlfb3JnLmV4dDQKLSNkZWZpbmUgdmRpX3R5cGVkCXZkaV9vcmcudHlwZWQKLQotCi0vKgotICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS4KLSAqLwotc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyB7Ci0Jc3RydWN0IGlub2RlCXZmc19pbm9kZTsKLQotCV9fdTMyCQl2aWlfbW9kZTsKLQlfX3UzMgkJdmlpX25saW5rOwkvKiBMaW5rIGNvdW50ICovCi0JX191MzIJCXZpaV91aWQ7CS8qIFVJRCAqLwotCV9fdTMyCQl2aWlfZ2lkOwkvKiBHSUQgKi8KLQlfX3U2NAkJdmlpX3NpemU7CS8qIElub2RlIHNpemUgaW4gYnl0ZXMgKi8KLQlfX3UzMgkJdmlpX2F0aW1lOwkvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi8KLQlfX3UzMgkJdmlpX2F1dGltZTsJLyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqLwotCV9fdTMyCQl2aWlfbXRpbWU7CS8qIExhc3QgbW9kaWZ5IHRpbWUgLSBzZWMgKi8KLQlfX3UzMgkJdmlpX211dGltZTsJLyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi8KLQlfX3UzMgkJdmlpX2N0aW1lOwkvKiBDcmVhdGUgdGltZSAtIHNlYyAqLwotCV9fdTMyCQl2aWlfY3V0aW1lOwkvKiBDcmVhdGUgdGltZSAtIHVzZWMgKi8KLQlfX3U4CQl2aWlfb3JndHlwZTsJLyogT3JnYW5pc2F0aW9uIHR5cGUgKi8KLQl1bmlvbiB7Ci0JCV9fdTMyCQkJcmRldjsKLQkJX191MzIJCQlkb3Rkb3Q7Ci0JfSB2aWlfZnRhcmVhOwotCV9fdTMyCQl2aWlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KLQlfX3UzMgkJdmlpX2dlbjsJLyogSW5vZGUgZ2VuZXJhdGlvbiAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHZ4ZnNfaW1tZWQJaW1tZWQ7Ci0JCXN0cnVjdCB2eGZzX2V4dDQJZXh0NDsKLQkJc3RydWN0IHZ4ZnNfdHlwZWQJdHlwZWRbVlhGU19OVFlQRURdOwotCX0gdmlpX29yZzsKLX07Ci0KLSNkZWZpbmUgdmlpX3JkZXYJdmlpX2Z0YXJlYS5yZGV2Ci0jZGVmaW5lIHZpaV9kb3Rkb3QJdmlpX2Z0YXJlYS5kb3Rkb3QKLQotI2RlZmluZSB2aWlfaW1tZWQJdmlpX29yZy5pbW1lZAotI2RlZmluZSB2aWlfZXh0NAl2aWlfb3JnLmV4dDQKLSNkZWZpbmUgdmlpX3R5cGVkCXZpaV9vcmcudHlwZWQKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICpWWEZTX0lOTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Ci19Ci0KLSNlbmRpZiAvKiBfVlhGU19JTk9ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGUwOGRlOTc2ZWEuLjAwMDAwMDAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwomIzQzOyYjNDM7JiM0MzsgL2Rldi9udWxsCkBAIC0xLDI3MyAmIzQzOzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgotICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraQotICovCi0KLS8qCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gbG9va3VwIGFuZCBvdGhlciBkaXJlY3RvcnkgcmVsYXRlZCBjb2RlLgotICovCi0jaW5jbHVkZSAmbHQ7bGludXgvZnMuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9maWxlbG9jay5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3RpbWUuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tbS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2hpZ2htZW0uaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9wYWdlbWFwLmgmZ3Q7Ci0KLSNpbmNsdWRlICYjMzQ7dnhmcy5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19kaXIuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0vKgotICogTnVtYmVyIG9mIFZ4RlMgYmxvY2tzIHBlciBwYWdlLgotICovCi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS0mZ3Q7c19ibG9ja3NpemUpKQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoJdnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQJCXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7Ci0KLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHZ4ZnNfZGlyX2lub2RlX29wcyA9IHsKLQkubG9va3VwID0JCXZ4ZnNfbG9va3VwLAotfTsKLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0gewotCS5sbHNlZWsgPQkJZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9CQkJZ2VuZXJpY19yZWFkX2RpciwKLQkuaXRlcmF0ZV9zaGFyZWQgPQl2eGZzX3JlYWRkaXIsCi0JLnNldGxlYXNlID0JCWdlbmVyaWNfc2V0bGVhc2UsCi19OwotCi0KLS8qKgotICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeQotICogQGlwOgkJZGlyZWN0b3J5IGlub2RlCi0gKiBAZHA6CQlkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdAotICogQHBwcDoJZ2V0cyBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuIHZhbHVlIHNpdHMgaW4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19maW5kX2VudHJ5IGZpbmRzIGEgJmFtcDtzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5Ci0gKiAgIGNhY2hlIGVudHJ5IEBkcC4gIEBwcHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuCi0gKiAgIHZhbHVlIHJlc2lkZXMgaW4uCi0gKgotICogUmV0dXJuczoKLSAqICAgVGhlIHdhbnRlZCBkaXJlY3Qgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KLSAqLwotc3RhdGljIHN0cnVjdCB2eGZzX2RpcmVjdCAqCi12eGZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGRlbnRyeSAqZHAsIHN0cnVjdCBwYWdlICoqcHBwKQotewotCXVfbG9uZyBic2l6ZSA9IGlwLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQljb25zdCBjaGFyICpuYW1lID0gZHAtJmd0O2RfbmFtZS5uYW1lOwotCWludCBuYW1lbGVuID0gZHAtJmd0O2RfbmFtZS5sZW47Ci0JbG9mZl90IGxpbWl0ID0gVlhGU19ESVJST1VORChpcC0mZ3Q7aV9zaXplKTsKLQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlX2V4aXQgPSBOVUxMOwotCWxvZmZfdCBwb3MgPSAwOwotCXN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLSZndDtpX3NiKTsKLQotCXdoaWxlIChwb3MgJmx0OyBsaW1pdCkgewotCQlzdHJ1Y3QgcGFnZSAqcHA7Ci0JCWNoYXIgKmthZGRyOwotCQlpbnQgcGdfb2ZzID0gcG9zICZhbXA7IH5QQUdFX01BU0s7Ci0KLQkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLSZndDtpX21hcHBpbmcsIHBvcyAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKLQkJaWYgKElTX0VSUihwcCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJd2hpbGUgKHBnX29mcyAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IHBvcyAmbHQ7IGxpbWl0KSB7Ci0JCQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlOwotCi0JCQlpZiAoKHBvcyAmYW1wOyAoYnNpemUgLSAxKSkgJmx0OyA0KSB7Ci0JCQkJc3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPQotCQkJCQkoc3RydWN0IHZ4ZnNfZGlyYmxrICopCi0JCQkJCSAoa2FkZHIgJiM0MzsgKHBvcyAmYW1wOyB+UEFHRV9NQVNLKSk7Ci0JCQkJaW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7Ci0KLQkJCQlwb3MgJiM0Mzs9IG92ZXJoZWFkOwotCQkJCXBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7Ci0JCQl9Ci0JCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTsKLQotCQkJaWYgKCFkZS0mZ3Q7ZF9yZWNsZW4pIHsKLQkJCQlwb3MgJiM0Mzs9IGJzaXplIC0gMTsKLQkJCQlwb3MgJmFtcDs9IH4oYnNpemUgLSAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGdfb2ZzICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX3JlY2xlbik7Ci0JCQlwb3MgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtJmd0O2RfcmVjbGVuKTsKLQkJCWlmICghZGUtJmd0O2RfaW5vKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX25hbWVsZW4pKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFtZW1jbXAobmFtZSwgZGUtJmd0O2RfbmFtZSwgbmFtZWxlbikpIHsKLQkJCQkqcHBwID0gcHA7Ci0JCQkJZGVfZXhpdCA9IGRlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZGVfZXhpdCkKLQkJCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZGVfZXhpdDsKLX0KLQotLyoqCi0gKiB2eGZzX2lub2RlX2J5X25hbWUgLSBmaW5kIGlub2RlIG51bWJlciBmb3IgZGVudHJ5Ci0gKiBAZGlwOglkaXJlY3RvcnkgdG8gc2VhcmNoIGluCi0gKiBAZHA6CQlkZW50cnkgd2Ugc2VhcmNoIGZvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2lub2RlX2J5X25hbWUgZmluZHMgb3V0IHRoZSBpbm9kZSBudW1iZXIgb2YKLSAqICAgdGhlIHBhdGggY29tcG9uZW50IGRlc2NyaWJlZCBieSBAZHAgaW4gQGRpcC4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgd2FudGVkIGlub2RlIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uCi0gKi8KLXN0YXRpYyBpbm9fdAotdnhmc19pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCkKLXsKLQlzdHJ1Y3Qgdnhmc19kaXJlY3QJCSpkZTsKLQlzdHJ1Y3QgcGFnZQkJCSpwcDsKLQlpbm9fdAkJCQlpbm8gPSAwOwotCi0JZGUgPSB2eGZzX2ZpbmRfZW50cnkoZGlwLCBkcCwgJmFtcDtwcCk7Ci0JaWYgKGRlKSB7Ci0JCWlubyA9IGZzMzJfdG9fY3B1KFZYRlNfU0JJKGRpcC0mZ3Q7aV9zYiksIGRlLSZndDtkX2lubyk7Ci0JCWt1bm1hcChwcCk7Ci0JCXB1dF9wYWdlKHBwKTsKLQl9Ci0JCi0JcmV0dXJuIChpbm8pOwotfQotCi0vKioKLSAqIHZ4ZnNfbG9va3VwIC0gbG9va3VwIHBhdGhuYW1lIGNvbXBvbmVudAotICogQGRpcDoJZGlyIGluIHdoaWNoIHdlIGxvb2t1cAotICogQGRwOgkJZGVudHJ5IHdlIGxvb2t1cAotICogQGZsYWdzOglsb29rdXAgZmxhZ3MKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkCi0gKiAgIGJ5IEBkcCBpbiBAZGlwLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIEEgTlVMTC1wb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWQKLSAqICAgaW4gdGhlIHJldHVybiBwb2ludGVyLgotICovCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqCi12eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHAsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaW5vZGUJCSppcCA9IE5VTEw7Ci0JaW5vX3QJCQlpbm87Ci0JCQkgCi0JaWYgKGRwLSZndDtkX25hbWUubGVuICZndDsgVlhGU19OQU1FTEVOKQotCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKLQkJCQkgCi0JaW5vID0gdnhmc19pbm9kZV9ieV9uYW1lKGRpcCwgZHApOwotCWlmIChpbm8pCi0JCWlwID0gdnhmc19pZ2V0KGRpcC0mZ3Q7aV9zYiwgaW5vKTsKLQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaXAsIGRwKTsKLX0KLQotLyoqCi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5Ci0gKiBAZnA6CQl0aGUgZGlyZWN0b3J5IHRvIHJlYWQKLSAqIEBjdHg6CWRpcl9jb250ZXh0IGZvciBmaWxsZGlyL3JlYWRkaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19yZWFkZGlyIGZpbGxzIEByZXRwIHdpdGggZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBAZnAKLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8uCi0gKi8KLXN0YXRpYyBpbnQKLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpbm9kZQkJKmlwID0gZmlsZV9pbm9kZShmcCk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrCSpzYnAgPSBpcC0mZ3Q7aV9zYjsKLQl1X2xvbmcJCQlic2l6ZSA9IHNicC0mZ3Q7c19ibG9ja3NpemU7Ci0JbG9mZl90CQkJcG9zLCBsaW1pdDsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSpzYmkgPSBWWEZTX1NCSShzYnApOwotCi0JaWYgKGN0eC0mZ3Q7cG9zID09IDApIHsKLQkJaWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpCi0JCQlnb3RvIG91dDsKLQkJY3R4LSZndDtwb3MmIzQzOyYjNDM7OwotCX0KLQlpZiAoY3R4LSZndDtwb3MgPT0gMSkgewotCQlpZiAoIWRpcl9lbWl0KGN0eCwgJiMzNDsuLiYjMzQ7LCAyLCBWWEZTX0lOTyhpcCktJmd0O3ZpaV9kb3Rkb3QsIERUX0RJUikpCi0JCQlnb3RvIG91dDsKLQkJY3R4LSZndDtwb3MmIzQzOyYjNDM7OwotCX0KLQotCWxpbWl0ID0gVlhGU19ESVJST1VORChpcC0mZ3Q7aV9zaXplKTsKLQlpZiAoY3R4LSZndDtwb3MgJmd0OyBsaW1pdCkKLQkJZ290byBvdXQ7Ci0KLQlwb3MgPSBjdHgtJmd0O3BvcyAmYW1wOyB+M0w7Ci0KLQl3aGlsZSAocG9zICZsdDsgbGltaXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBwOwotCQljaGFyICprYWRkcjsKLQkJaW50IHBnX29mcyA9IHBvcyAmYW1wOyB+UEFHRV9NQVNLOwotCQlpbnQgcmMgPSAwOwotCi0JCXBwID0gdnhmc19nZXRfcGFnZShpcC0mZ3Q7aV9tYXBwaW5nLCBwb3MgJmd0OyZndDsgUEFHRV9TSElGVCk7Ci0JCWlmIChJU19FUlIocHApKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7Ci0KLQkJd2hpbGUgKHBnX29mcyAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IHBvcyAmbHQ7IGxpbWl0KSB7Ci0JCQlzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlOwotCi0JCQlpZiAoKHBvcyAmYW1wOyAoYnNpemUgLSAxKSkgJmx0OyA0KSB7Ci0JCQkJc3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPQotCQkJCQkoc3RydWN0IHZ4ZnNfZGlyYmxrICopCi0JCQkJCSAoa2FkZHIgJiM0MzsgKHBvcyAmYW1wOyB+UEFHRV9NQVNLKSk7Ci0JCQkJaW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7Ci0KLQkJCQlwb3MgJiM0Mzs9IG92ZXJoZWFkOwotCQkJCXBnX29mcyAmIzQzOz0gb3ZlcmhlYWQ7Ci0JCQl9Ci0JCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoa2FkZHIgJiM0MzsgcGdfb2ZzKTsKLQotCQkJaWYgKCFkZS0mZ3Q7ZF9yZWNsZW4pIHsKLQkJCQlwb3MgJiM0Mzs9IGJzaXplIC0gMTsKLQkJCQlwb3MgJmFtcDs9IH4oYnNpemUgLSAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGdfb2ZzICYjNDM7PSBmczE2X3RvX2NwdShzYmksIGRlLSZndDtkX3JlY2xlbik7Ci0JCQlwb3MgJiM0Mzs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtJmd0O2RfcmVjbGVuKTsKLQkJCWlmICghZGUtJmd0O2RfaW5vKQotCQkJCWNvbnRpbnVlOwotCi0JCQlyYyA9IGRpcl9lbWl0KGN0eCwgZGUtJmd0O2RfbmFtZSwKLQkJCQkJZnMxNl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9uYW1lbGVuKSwKLQkJCQkJZnMzMl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9pbm8pLAotCQkJCQlEVF9VTktOT1dOKTsKLQkJCWlmICghcmMpIHsKLQkJCQkvKiB0aGUgZGlyIGVudHJ5IHdhcyBub3QgcmVhZCwgZml4IHBvcy4gKi8KLQkJCQlwb3MgLT0gZnMxNl90b19jcHUoc2JpLCBkZS0mZ3Q7ZF9yZWNsZW4pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXZ4ZnNfcHV0X3BhZ2UocHApOwotCQlpZiAoIXJjKQotCQkJYnJlYWs7Ci0JfQotCi0JY3R4LSZndDtwb3MgPSBwb3MgfCAyOwotCi1vdXQ6Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMzUxODdjMjg5Ni4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTA1ICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyogCi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gb2JqZWN0IGxvY2F0aW9uIHRhYmxlIHN1cHBvcnQuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0KLSNpbmNsdWRlICYjMzQ7dnhmcy5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19vbHQuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdnhmc19nZXRfZnNoZWFkKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqZnNocCwgc3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCkKLXsKLQlCVUdfT04oaW5mcC0mZ3Q7dnNpX2ZzaGlubyk7Ci0JaW5mcC0mZ3Q7dnNpX2ZzaGlubyA9IGZzMzJfdG9fY3B1KGluZnAsIGZzaHAtJmd0O29sdF9mc2lub1swXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdnhmc19nZXRfaWxpc3Qoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCkKLXsKLQlCVUdfT04oaW5mcC0mZ3Q7dnNpX2lleHQpOwotCWluZnAtJmd0O3ZzaV9pZXh0ID0gZnMzMl90b19jcHUoaW5mcCwgaWxpc3RwLSZndDtvbHRfaWV4dFswXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdV9sb25nCi12eGZzX29ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgZGFkZHJfdCBibG9jaywgdV9sb25nIGJzaXplKQotewotCUJVR19PTihzYnAtJmd0O3NfYmxvY2tzaXplICUgYnNpemUpOwotCXJldHVybiAoYmxvY2sgKiAoc2JwLSZndDtzX2Jsb2Nrc2l6ZSAvIGJzaXplKSk7Ci19Ci0KLQotLyoqCi0gKiB2eGZzX3JlYWRfb2x0IC0gcmVhZCBvbHQKLSAqIEBzYnA6CXN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW0KLSAqIEBic2l6ZToJYmxvY2tzaXplIG9mIHRoZSBmaWxlc3lzdGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfcmVhZF9vbHQgcmVhZHMgdGhlIG9sdCBvZiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicAotICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuCi0gKgotICogUmV0dXJuczoKLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50Ci12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpicDsKLQlzdHJ1Y3Qgdnhmc19vbHQJCSpvcDsKLQljaGFyCQkJKm9hZGRyLCAqZWFkZHI7Ci0KLQlicCA9IHNiX2JyZWFkKHNicCwgdnhmc19vYmxvY2soc2JwLCBpbmZwLSZndDt2c2lfb2x0ZXh0LCBic2l6ZSkpOwotCWlmICghYnAgfHwgIWJwLSZndDtiX2RhdGEpCi0JCWdvdG8gZmFpbDsKLQotCW9wID0gKHN0cnVjdCB2eGZzX29sdCAqKWJwLSZndDtiX2RhdGE7Ci0JaWYgKGZzMzJfdG9fY3B1KGluZnAsIG9wLSZndDtvbHRfbWFnaWMpICE9IFZYRlNfT0xUX01BR0lDKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAmIzM0O3Z4ZnM6IGl2YWxpZCBvbHQgbWFnaWMgbnVtYmVyXG4mIzM0Oyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKgotCSAqIEl0IGlzIGluIHRoZW9yeSBwb3NzaWJsZSB0aGF0IHZzaV9vbHRzaXplIGlzICZndDsgMS4KLQkgKiBJJiMzOTt2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSYjMzk7bSBsYXp5Li4gIC0taGNoCi0JICovCi0JaWYgKGluZnAtJmd0O3ZzaV9vbHRzaXplICZndDsgMSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgJiMzNDt2eGZzOiBvbHRzaXplICZndDsgMSBkZXRlY3RlZC5cbiYjMzQ7KTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICYjMzQ7dnhmczogcGxlYXNlIG5vdGlmeSBoY2hAaW5mcmFkZWFkLm9yZ1xuJiMzNDspOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jb2FkZHIgPSBicC0mZ3Q7Yl9kYXRhICYjNDM7IGZzMzJfdG9fY3B1KGluZnAsIG9wLSZndDtvbHRfc2l6ZSk7Ci0JZWFkZHIgPSBicC0mZ3Q7Yl9kYXRhICYjNDM7IChpbmZwLSZndDt2c2lfb2x0c2l6ZSAqIHNicC0mZ3Q7c19ibG9ja3NpemUpOwotCi0Jd2hpbGUgKG9hZGRyICZsdDsgZWFkZHIpIHsKLQkJc3RydWN0IHZ4ZnNfb2x0Y29tbW9uCSpvY3AgPQotCQkJKHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyOwotCQkKLQkJc3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtJmd0O29sdF90eXBlKSkgewotCQljYXNlIFZYRlNfT0xUX0ZTSEVBRDoKLQkJCXZ4ZnNfZ2V0X2ZzaGVhZCgoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICopb2FkZHIsIGluZnApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVlhGU19PTFRfSUxJU1Q6Ci0JCQl2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCW9hZGRyICYjNDM7PSBmczMyX3RvX2NwdShpbmZwLCBvY3AtJmd0O29sdF9zaXplKTsKLQl9Ci0KLQlicmVsc2UoYnApOwotCXJldHVybiAoaW5mcC0mZ3Q7dnNpX2ZzaGlubyAmYW1wOyZhbXA7IGluZnAtJmd0O3ZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMOwotCi1mYWlsOgotCWJyZWxzZShicCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZmJhMDhkNjE3Zi4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5oCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTIwICYjNDM7MCwwIEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLSNpZm5kZWYgX1ZYRlNfT0xUX0hfCi0jZGVmaW5lIF9WWEZTX09MVF9IXwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciB0aGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIHVzZWQKLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci4KLSAqLwotCi0KLS8qCi0gKiBPTFQgbWFnaWMgbnVtYmVyICh2eGZzX29sdC0mZ3Q7b2x0X21hZ2ljKS4KLSAqLwotI2RlZmluZSBWWEZTX09MVF9NQUdJQwkJMHhhNTA0RkNGNQotCi0vKgotICogVnhGUyBPTFQgZW50cnkgdHlwZXMuCi0gKi8KLWVudW0gewotCVZYRlNfT0xUX0ZSRUUJPSAxLAotCVZYRlNfT0xUX0ZTSEVBRAk9IDIsCi0JVlhGU19PTFRfQ1VUCT0gMywKLQlWWEZTX09MVF9JTElTVAk9IDQsCi0JVlhGU19PTFRfREVWCT0gNSwKLQlWWEZTX09MVF9TQgk9IDYKLX07Ci0KLS8qCi0gKiBWeEZTIE9MVCBoZWFkZXIuCi0gKgotICogVGhlIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBoZWFkZXIgaXMgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotICogT0xUIGV4dGVudC4gIEl0IGlzIHVzZWQgdG8gZmluZyBjZXJ0YWluIGZpbGVzeXN0ZW0td2lkZSBtZXRhZGF0YSwgZS5nLgotICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0IHsKLQlfX2ZzMzIJCW9sdF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQlfX2ZzMzIJCW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgZW50cnkJCSovCi0JX19mczMyCQlvbHRfY2hlY2tzdW07CS8qIGNoZWNrc3VtIG9mIGV4dGVudAkJKi8KLQlfX3UzMgkJX191bnVzZWQxOwkvKiA/Pz8JCQkJKi8KLQlfX2ZzMzIJCW9sdF9tdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHNlYykJKi8KLQlfX2ZzMzIJCW9sdF9tdXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBtb2QuICh1c2VjKQkqLwotCV9fZnMzMgkJb2x0X3RvdGZyZWU7CS8qIGZyZWUgc3BhY2UgaW4gT0xUIGV4dGVudAkqLwotCV9fZnMzMgkJb2x0X2V4dGVudHNbMl07CS8qIGFkZHIgb2YgdGhpcyBleHRlbnQsIHJlcGxpY2EJKi8KLQlfX2ZzMzIJCW9sdF9lc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGV4dGVudAkJKi8KLQlfX2ZzMzIJCW9sdF9uZXh0WzJdOyAgICAvKiBhZGRyIG9mIG5leHQgZXh0ZW50LCByZXBsaWNhCSovCi0JX19mczMyCQlvbHRfbnNpemU7CS8qIHNpemUgb2YgbmV4dCBleHRlbnQJCSovCi0JX191MzIJCV9fdW51c2VkMjsJLyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5CSovCi19OwotCi0vKgotICogVnhGUyBjb21tb24gT0xUIGVudHJ5IChvbiBkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0Y29tbW9uIHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi19OwotCi0vKgotICogVnhGUyBmcmVlIE9MVCBlbnRyeSAob24gZGlzaykuCi0gKi8KLXN0cnVjdCB2eGZzX29sdGZyZWUgewotCV9fZnMzMgkJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZnNpemU7CS8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZAkqLwotfTsKLQotLyoKLSAqIFZ4RlMgaW5pdGlhbC1pbm9kZSBsaXN0IChvbiBkaXNrKS4KLSAqLwotc3RydWN0IHZ4ZnNfb2x0aWxpc3QgewotCV9fZnMzMglvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KLQlfX2ZzMzIJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfaWV4dFsyXTsJLyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhCSovCi19OwotCi0vKgotICogQ3VycmVudCBVc2FnZSBUYWJsZSAKLSAqLwotc3RydWN0IHZ4ZnNfb2x0Y3V0IHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfY3V0aW5vOwkvKiBpbm9kZSBvZiBjdXJyZW50IHVzYWdlIHRhYmxlCSovCi0JX191OAkJX19wYWQ7CQkvKiB1bnVzZWQsIDggYnl0ZSBhbGlnbgkJKi8KLX07Ci0KLS8qCi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIAotICovCi1zdHJ1Y3Qgdnhmc19vbHRzYiB7Ci0JX19mczMyCQlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KLQlfX2ZzMzIJCW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NiaW5vOwkvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGUJKi8KLQlfX3UzMgkJX191bnVzZWQxOwkvKiA/Pz8JCQkJKi8KLQlfX2ZzMzIJCW9sdF9sb2dpbm9bMl07CS8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2EJKi8KLQlfX2ZzMzIJCW9sdF9vbHRpbm9bMl07CS8qIGlub2RlIG9mIE9MVCwgcmVwbGljYQkqLwotfTsKLQotLyoKLSAqIElub2RlIGNvbnRhaW5pbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb24gJiM0MzsgaXQmIzM5O3MgcmVwbGljYSAKLSAqLwotc3RydWN0IHZ4ZnNfb2x0ZGV2IHsKLQlfX2ZzMzIJCW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZGV2aW5vWzJdOwkvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzCSovCi19OwotCi0vKgotICogRmlsZXNldCBoZWFkZXIgCi0gKi8KLXN0cnVjdCB2eGZzX29sdGZzaGVhZCB7Ci0JX19mczMyCQlvbHRfdHlwZTsJLyogdHlwZSBudW1iZXIJCQkqLwotCV9fZnMzMgkJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCi0JX19mczMyCQlvbHRfZnNpbm9bMl07ICAgLyogaW5vZGVzIG9mIGZpbGVzZXQgaGVhZGVyCSovCi19OwotCi0jZW5kaWYgLyogX1ZYRlNfT0xUX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM5ODc3ZWE2ZTgwLi4wMDAwMDAwMDAwMDAwCi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCiYjNDM7JiM0MzsmIzQzOyAvZGV2L251bGwKQEAgLTEsMTUyICYjNDM7MCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCi0gKi8KLQotLyoKLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuCi0gKi8KLSNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2J1ZmZlcl9oZWFkLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotCi0jaW5jbHVkZSAmIzM0O3Z4ZnNfZXh0ZXJuLmgmIzM0OwotCi0KLXN0YXRpYyBpbnQJCXZ4ZnNfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZm9saW8gKik7Ci1zdGF0aWMgc2VjdG9yX3QJCXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7Ci0KLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0gewotCS5yZWFkX2ZvbGlvID0JCXZ4ZnNfcmVhZF9mb2xpbywKLQkuYm1hcCA9CQkJdnhmc19ibWFwLAotfTsKLQotaW5saW5lIHZvaWQKLXZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBwKQotewotCWt1bm1hcChwcCk7Ci0JcHV0X3BhZ2UocHApOwotfQotCi0vKioKLSAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS4KLSAqIEBtYXBwaW5nOgltYXBwaW5nIHRvIHJlYWQgZnJvbQotICogQG46CQlwYWdlIG51bWJlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuCi0gKgotICogUmV0dXJuczoKLSAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCi0gKi8KLXN0cnVjdCBwYWdlICoKLXZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKQotewotCXN0cnVjdCBwYWdlICoJCQlwcDsKLQotCXBwID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7Ci0KLQlpZiAoIUlTX0VSUihwcCkpIHsKLQkJa21hcChwcCk7Ci0JCS8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovCi0JCQkvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovCi0JfQotCQotCXJldHVybiAocHApOwotfQotCi0vKioKLSAqIHZ4ZnNfYnJlYWQgLSByZWFkIGJ1ZmZlciBmb3IgYSBnaXZlIGlub2RlLGJsb2NrIHR1cGxlCi0gKiBAaXA6CQlpbm9kZQotICogQGJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFRoZSB2eGZzX2JyZWFkIGZ1bmN0aW9uIHJlYWRzIGJsb2NrIG5vIEBibG9jayAgb2YKLSAqICAgQGlwIGludG8gdGhlIGJ1ZmZlcmNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFRoZSByZXN1bHRpbmcgJmFtcDtzdHJ1Y3QgYnVmZmVyX2hlYWQuCi0gKi8KLXN0cnVjdCBidWZmZXJfaGVhZCAqCi12eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOwotCWRhZGRyX3QJCQlwYmxvY2s7Ci0KLQlwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7Ci0JYnAgPSBzYl9icmVhZChpcC0mZ3Q7aV9zYiwgcGJsb2NrKTsKLQotCXJldHVybiAoYnApOwotfQotCi0vKioKLSAqIHZ4ZnNfZ2V0YmxrIC0gbG9jYXRlIGJ1ZmZlciBmb3IgZ2l2ZW4gaW5vZGUsYmxvY2sgdHVwbGUKLSAqIEBpcDoJCWlub2RlCi0gKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrCi0gKiBAYnA6CQlidWZmZXIgc2tlbGV0b24KLSAqIEBjcmVhdGU6CSVUUlVFIGlmIGJsb2NrcyBtYXkgYmUgbmV3bHkgYWxsb2NhdGVkLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGUgdnhmc19nZXRibGsgZnVuY3Rpb24gZmlsbHMgQGJwIHdpdGggdGhlIHJpZ2h0IHBoeXNpY2FsCi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uCi0gKiAgIGl0LgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXYgZXJyb3IgY29kZSAoLUVJTykuCi0gKi8KLXN0YXRpYyBpbnQKLXZ4ZnNfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqaXAsIHNlY3Rvcl90IGlibG9jaywKLQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSkKLXsKLQlkYWRkcl90CQkJcGJsb2NrOwotCi0JcGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTsKLQlpZiAocGJsb2NrICE9IDApIHsKLQkJbWFwX2JoKGJwLCBpcC0mZ3Q7aV9zYiwgcGJsb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qKgotICogdnhmc19yZWFkX2ZvbGlvIC0gcmVhZCBvbmUgcGFnZSBzeW5jaHJvbm91c2x5IGludG8gdGhlIHBhZ2VjYWNoZQotICogQGZpbGU6CWZpbGUgY29udGV4dCAodW51c2VkKQotICogQGZvbGlvOglmb2xpbyB0byBmaWxsIGluLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGUKLSAqICAgcGFnZWNhY2hlLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKgotICogTG9ja2luZyBzdGF0dXM6Ci0gKiAgIEBmb2xpbyBpcyBsb2NrZWQgYW5kIHdpbGwgYmUgdW5sb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQotewotCXJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTsKLX0KLSAKLS8qKgotICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKLSAqIEBtYXBwaW5nOglsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlCi0gKiBAYmxvY2s6CWxvZ2ljYWwgYmxvY2sgKHJlbGF0aXZlIHRvIEBtYXBwaW5nKS4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVnhmc19ibWFwIGZpbmQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIHBoc2ljYWwgYmxvY2sgdG8gdGhlCi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci4KLSAqCi0gKiBSZXR1cm5zOgotICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgotICoKLSAqIExvY2tpbmcgc3RhdHVzOgotICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC4KLSAqLwotc3RhdGljIHNlY3Rvcl90Ci12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQotewotCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkODQ3ZDc1YzNkNS4uMDAwMDAwMDAwMDAwMAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKJiM0MzsmIzQzOyYjNDM7IC9kZXYvbnVsbApAQCAtMSwzNDcgJiM0MzswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2kKLSAqLwotCi0vKgotICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgcmVsYXRlZCByb3V0aW5lcy4KLSAqLwotI2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKLQotI2luY2x1ZGUgJmx0O2xpbnV4L2Jsa2Rldi5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvYnVmZmVyX2hlYWQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3RhdC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3Zmcy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2ZzX2NvbnRleHQuaCZndDsKLQotI2luY2x1ZGUgJiMzNDt2eGZzLmgmIzM0OwotI2luY2x1ZGUgJiMzNDt2eGZzX2V4dGVybi5oJiMzNDsKLSNpbmNsdWRlICYjMzQ7dnhmc19kaXIuaCYjMzQ7Ci0jaW5jbHVkZSAmIzM0O3Z4ZnNfaW5vZGUuaCYjMzQ7Ci0KLQotTU9EVUxFX0FVVEhPUigmIzM0O0NocmlzdG9waCBIZWxsd2lnLCBLcnp5c3p0b2YgQmxhc3prb3dza2kmIzM0Oyk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oJiMzNDtWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlciYjMzQ7KTsKLU1PRFVMRV9MSUNFTlNFKCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwotCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwOwotCi0vKioKLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlcwotICogQHNicDoJVkZTIHN1cGVyYmxvY2suCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIHZ4ZnNfcHV0X3N1cGVyIGZyZWVzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBAc2JwCi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KLSAqLwotCi1zdGF0aWMgdm9pZAotdnhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcCA9IFZYRlNfU0JJKHNicCk7Ci0KLQlpcHV0KGluZnAtJmd0O3ZzaV9mc2hpcCk7Ci0JaXB1dChpbmZwLSZndDt2c2lfaWxpc3QpOwotCWlwdXQoaW5mcC0mZ3Q7dnNpX3N0aWxpc3QpOwotCi0JYnJlbHNlKGluZnAtJmd0O3ZzaV9icCk7Ci0Ja2ZyZWUoaW5mcCk7Ci19Ci0KLS8qKgotICogdnhmc19zdGF0ZnMgLSBnZXQgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbgotICogQGRlbnRyeToJVkZTIGRlbnRyeSB0byBsb2NhdGUgc3VwZXJibG9jawotICogQGJ1ZnA6CW91dHB1dCBidWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvbgotICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQGRlbnRyeS4KLSAqCi0gKiBSZXR1cm5zOgotICogICBaZXJvLgotICoKLSAqIExvY2tpbmc6Ci0gKiAgIE5vIGxvY2tzIGhlbGQuCi0gKgotICogTm90ZXM6Ci0gKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi4KLSAqLwotc3RhdGljIGludAotdnhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmcCkKLXsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCQkqaW5mcCA9IFZYRlNfU0JJKGRlbnRyeS0mZ3Q7ZF9zYik7Ci0Jc3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtJmd0O3ZzaV9yYXc7Ci0JdTY0IGlkID0gaHVnZV9lbmNvZGVfZGV2KGRlbnRyeS0mZ3Q7ZF9zYi0mZ3Q7c19iZGV2LSZndDtiZF9kZXYpOwotCi0JYnVmcC0mZ3Q7Zl90eXBlID0gVlhGU19TVVBFUl9NQUdJQzsKLQlidWZwLSZndDtmX2JzaXplID0gZGVudHJ5LSZndDtkX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQlidWZwLSZndDtmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi0mZ3Q7dnNfZHNpemUpOwotCWJ1ZnAtJmd0O2ZfYmZyZWUgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItJmd0O3ZzX2ZyZWUpOwotCWJ1ZnAtJmd0O2ZfYmF2YWlsID0gMDsKLQlidWZwLSZndDtmX2ZpbGVzID0gMDsKLQlidWZwLSZndDtmX2ZmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLSZndDt2c19pZnJlZSk7Ci0JYnVmcC0mZ3Q7Zl9mc2lkID0gdTY0X3RvX2ZzaWQoaWQpOwotCWJ1ZnAtJmd0O2ZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKQotewotCXN5bmNfZmlsZXN5c3RlbShmYy0mZ3Q7cm9vdC0mZ3Q7ZF9zYik7Ci0JZmMtJmd0O3NiX2ZsYWdzIHw9IFNCX1JET05MWTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpbm9kZSAqdnhmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpOwotCi0JdmkgPSBhbGxvY19pbm9kZV9zYihzYiwgdnhmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmICghdmkpCi0JCXJldHVybiBOVUxMOwotCWlub2RlX2luaXRfb25jZSgmYW1wO3ZpLSZndDt2ZnNfaW5vZGUpOwotCXJldHVybiAmYW1wO3ZpLSZndDt2ZnNfaW5vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ4ZnNfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWttZW1fY2FjaGVfZnJlZSh2eGZzX2lub2RlX2NhY2hlcCwgVlhGU19JTk8oaW5vZGUpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHZ4ZnNfc3VwZXJfb3BzID0gewotCS5hbGxvY19pbm9kZQkJPSB2eGZzX2FsbG9jX2lub2RlLAotCS5mcmVlX2lub2RlCQk9IHZ4ZnNfZnJlZV9pbm9kZSwKLQkuZXZpY3RfaW5vZGUJCT0gdnhmc19ldmljdF9pbm9kZSwKLQkucHV0X3N1cGVyCQk9IHZ4ZnNfcHV0X3N1cGVyLAotCS5zdGF0ZnMJCQk9IHZ4ZnNfc3RhdGZzLAotfTsKLQotc3RhdGljIGludCB2eGZzX3RyeV9zYl9tYWdpYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IGZzX2NvbnRleHQgKmZjLAotCQl1bnNpZ25lZCBibGssIF9fZnMzMiBtYWdpYykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJwOwotCXN0cnVjdCB2eGZzX3NiICpyc2JwOwotCXN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnAgPSBWWEZTX1NCSShzYnApOwotCWludCBzaWxlbnQgPSBmYy0mZ3Q7c2JfZmxhZ3MgJmFtcDsgU0JfU0lMRU5UOwotCWludCByYyA9IC1FTk9NRU07Ci0KLQlicCA9IHNiX2JyZWFkKHNicCwgYmxrKTsKLQlkbyB7Ci0JCWlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKSB7Ci0JCQlpZiAoIXNpbGVudCkgewotCQkJCXdhcm5mKGZjLAotCQkJCSAgICAgICYjMzQ7dnhmczogdW5hYmxlIHRvIHJlYWQgZGlzayBzdXBlcmJsb2NrIGF0ICV1JiMzNDssCi0JCQkJICAgICAgYmxrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmMgPSAtRUlOVkFMOwotCQlyc2JwID0gKHN0cnVjdCB2eGZzX3NiICopYnAtJmd0O2JfZGF0YTsKLQkJaWYgKHJzYnAtJmd0O3ZzX21hZ2ljICE9IG1hZ2ljKSB7Ci0JCQlpZiAoIXNpbGVudCkKLQkJCQlpbmZvZihmYywKLQkJCQkgICAgICAmIzM0O3Z4ZnM6IFdST05HIHN1cGVyYmxvY2sgbWFnaWMgJTA4eCBhdCAldSYjMzQ7LAotCQkJCSAgICAgIHJzYnAtJmd0O3ZzX21hZ2ljLCBibGspOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IDA7Ci0JCWluZnAtJmd0O3ZzaV9yYXcgPSByc2JwOwotCQlpbmZwLSZndDt2c2lfYnAgPSBicDsKLQl9IHdoaWxlICgwKTsKLQotCWlmIChyYykgewotCQlpbmZwLSZndDt2c2lfcmF3ID0gTlVMTDsKLQkJaW5mcC0mZ3Q7dnNpX2JwID0gTlVMTDsKLQkJYnJlbHNlKGJwKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKgotICogdnhmc19maWxsX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0aWFsaXplIGZpbGVzeXN0ZW0KLSAqIEBzYnA6CQlWRlMgc3VwZXJibG9jayAodG8gZmlsbCkKLSAqIEBmYzoJCQlmaWxlc3l0ZW0gY29udGV4dAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGUKLSAqICAgc3VwZXJibG9jayBpbnRvIG1lbW9yeSBhbmQgZG8gc29tZSBiYXNpYyBzZXR1cC4KLSAqCi0gKiBSZXR1cm5zOgotICogICBUaGUgc3VwZXJibG9jayBvbiBzdWNjZXNzLCBlbHNlICVOVUxMLgotICoKLSAqIExvY2tpbmc6Ci0gKiAgIFdlIGFyZSB1bmRlciBAc2JwLSZndDtzX2xvY2suCi0gKi8KLXN0YXRpYyBpbnQgdnhmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCi17Ci0Jc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcDsKLQlzdHJ1Y3Qgdnhmc19zYgkJKnJzYnA7Ci0JdV9sb25nCQkJYnNpemU7Ci0Jc3RydWN0IGlub2RlICpyb290OwotCWludCByZXQgPSAtRUlOVkFMOwotCWludCBzaWxlbnQgPSBmYy0mZ3Q7c2JfZmxhZ3MgJmFtcDsgU0JfU0lMRU5UOwotCXUzMiBqOwotCi0Jc2JwLSZndDtzX2ZsYWdzIHw9IFNCX1JET05MWTsKLQotCWluZnAgPSBremFsbG9jX29iaigqaW5mcCk7Ci0JaWYgKCFpbmZwKSB7Ci0JCXdhcm5mKGZjLCAmIzM0O3Z4ZnM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbmNvcmUgc3VwZXJibG9jayYjMzQ7KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYnNpemUgPSBzYl9taW5fYmxvY2tzaXplKHNicCwgQkxPQ0tfU0laRSk7Ci0JaWYgKCFic2l6ZSkgewotCQl3YXJuZihmYywgJiMzNDt2eGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSYjMzQ7KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc2JwLSZndDtzX29wID0gJmFtcDt2eGZzX3N1cGVyX29wczsKLQlzYnAtJmd0O3NfZnNfaW5mbyA9IGluZnA7Ci0Jc2JwLSZndDtzX3RpbWVfbWluID0gMDsKLQlzYnAtJmd0O3NfdGltZV9tYXggPSBVMzJfTUFYOwotCi0JaWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLAotCQkJKF9fZm9yY2UgX19mczMyKWNwdV90b19sZTMyKFZYRlNfU1VQRVJfTUFHSUMpKSkgewotCQkvKiBVbml4d2FyZSwgeDg2ICovCi0JCWluZnAtJmd0O2J5dGVfb3JkZXIgPSBWWEZTX0JPX0xFOwotCX0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsCi0JCQkoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2JlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7Ci0JCS8qIEhQLVVYLCBwYXJpc2MgKi8KLQkJaW5mcC0mZ3Q7Ynl0ZV9vcmRlciA9IFZYRlNfQk9fQkU7Ci0JfSBlbHNlIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlpbmZvZihmYywgJiMzNDt2eGZzOiBjYW4mIzM5O3QgZmluZCBzdXBlcmJsb2NrLiYjMzQ7KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcnNicCA9IGluZnAtJmd0O3ZzaV9yYXc7Ci0JaiA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtJmd0O3ZzX3ZlcnNpb24pOwotCWlmICgoaiAmbHQ7IDIgfHwgaiAmZ3Q7IDQpICZhbXA7JmFtcDsgIXNpbGVudCkgewotCQlpbmZvZihmYywgJiMzNDt2eGZzOiB1bnN1cHBvcnRlZCBWeEZTIHZlcnNpb24gKCVkKSYjMzQ7LCBqKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0jaWZkZWYgRElBR05PU1RJQwotCXByaW50ayhLRVJOX0RFQlVHICYjMzQ7dnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4mIzM0Oywgaik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgJiMzNDt2eGZzOiBibG9ja3NpemU6ICVkXG4mIzM0OywKLQkJZnMzMl90b19jcHUoaW5mcCwgcnNicC0mZ3Q7dnNfYnNpemUpKTsKLSNlbmRpZgotCi0Jc2JwLSZndDtzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC0mZ3Q7dnNfbWFnaWMpOwotCi0JaW5mcC0mZ3Q7dnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtJmd0O3ZzX29sdGV4dFswXSk7Ci0JaW5mcC0mZ3Q7dnNpX29sdHNpemUgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLSZndDt2c19vbHRzaXplKTsKLQotCWogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLSZndDt2c19ic2l6ZSk7Ci0JaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgaikpIHsKLQkJd2FybmYoZmMsICYjMzQ7dnhmczogdW5hYmxlIHRvIHNldCBmaW5hbCBibG9jayBzaXplJiMzNDspOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodnhmc19yZWFkX29sdChzYnAsIGJzaXplKSkgewotCQl3YXJuZihmYywgJiMzNDt2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHQmIzM0Oyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHsKLQkJd2FybmYoZmMsICYjMzQ7dnhmczogdW5hYmxlIHRvIHJlYWQgZnNoZWFkJiMzNDspOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyb290ID0gdnhmc19pZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7Ci0JaWYgKElTX0VSUihyb290KSkgewotCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2JwLSZndDtzX3Jvb3QgPSBkX21ha2Vfcm9vdChyb290KTsKLQlpZiAoIXNicC0mZ3Q7c19yb290KSB7Ci0JCXdhcm5mKGZjLCAmIzM0O3Z4ZnM6IHVuYWJsZSB0byBnZXQgcm9vdCBkZW50cnkuJiMzNDspOwotCQlnb3RvIG91dF9mcmVlX2lsaXN0OwotCX0KLQotCXJldHVybiAwOwotCQotb3V0X2ZyZWVfaWxpc3Q6Ci0JaXB1dChpbmZwLSZndDt2c2lfZnNoaXApOwotCWlwdXQoaW5mcC0mZ3Q7dnNpX2lsaXN0KTsKLQlpcHV0KGluZnAtJmd0O3ZzaV9zdGlsaXN0KTsKLW91dDoKLQlicmVsc2UoaW5mcC0mZ3Q7dnNpX2JwKTsKLQlrZnJlZShpbmZwKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi4KLSAqLwotc3RhdGljIGludCB2eGZzX2dldF90cmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYykKLXsKLQlyZXR1cm4gZ2V0X3RyZWVfYmRldihmYywgdnhmc19maWxsX3N1cGVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmc19jb250ZXh0X29wZXJhdGlvbnMgdnhmc19jb250ZXh0X29wcyA9IHsKLQkuZ2V0X3RyZWUJPSB2eGZzX2dldF90cmVlLAotCS5yZWNvbmZpZ3VyZQk9IHZ4ZnNfcmVjb25maWd1cmUsCi19OwotCi1zdGF0aWMgaW50IHZ4ZnNfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKLXsKLQlmYy0mZ3Q7b3BzID0gJmFtcDt2eGZzX2NvbnRleHRfb3BzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICYjMzQ7dnhmcyYjMzQ7LAotCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKLQkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCi0JLmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LAotfTsKLU1PRFVMRV9BTElBU19GUygmIzM0O3Z4ZnMmIzM0Oyk7IC8qIG1ha2VzIG1vdW50IC10IHZ4ZnMgYXV0b2xvYWQgdGhlIG1vZHVsZSAqLwotTU9EVUxFX0FMSUFTKCYjMzQ7dnhmcyYjMzQ7KTsKLQotc3RhdGljIGludCBfX2luaXQKLXZ4ZnNfaW5pdCh2b2lkKQotewotCWludCBydjsKLQotCXZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoJiMzNDt2eGZzX2lub2RlJiMzNDssCi0JCQlzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsCi0JCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKLQkJCW9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksCi0JCQlzaXplb2ZfZmllbGQoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbywKLQkJCQl2aWlfaW1tZWQudmlfaW1tZWQpLAotCQkJTlVMTCk7Ci0JaWYgKCF2eGZzX2lub2RlX2NhY2hlcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcnYgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZhbXA7dnhmc19mc190eXBlKTsKLQlpZiAocnYgJmx0OyAwKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApOwotCXJldHVybiBydjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci12eGZzX2NsZWFudXAodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFtcDt2eGZzX2ZzX3R5cGUpOwotCS8qCi0JICogTWFrZSBzdXJlIGFsbCBkZWxheWVkIHJjdSBmcmVlIGlub2RlcyBhcmUgZmx1c2hlZCBiZWZvcmUgd2UKLQkgKiBkZXN0cm95IGNhY2hlLgotCSAqLwotCXJjdV9iYXJyaWVyKCk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTsKLX0KLQotbW9kdWxlX2luaXQodnhmc19pbml0KTsKLW1vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzMwIDE4OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNzQ0CgkJCQkJCQlvdXRwdXQ6IDU4CgkJCQkJCQl0aG91Z2h0czogNjQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHRoYXQgZXNzZW50aWFsbHkgbnVrZXMgdGhlIGBmcmVldnhmc2AgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIEl0JiMzOTtzIGEgY29tcGxldGUgcmVtb3ZhbDsgdGhlIGVudGlyZSBgZnMvZnJlZXZ4ZnMvYCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgYXJlIGdvbmUuIE5hdHVyYWxseSwgdGhlIGFzc29jaWF0ZWQgZW50cmllcyBpbiBgZnMvS2NvbmZpZ2AsIGBmcy9NYWtlZmlsZWAsIGFuZCBgTUFJTlRBSU5FUlNgIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIHdlbGwuCgpUaGUgaW1tZWRpYXRlIHRob3VnaHQgaXM6IFNpbmNlIHdlJiMzOTtyZSAqcmVtb3ZpbmcqIGNvZGUsIHRoZXJlJiMzOTtzIG5vdGhpbmcgKm5ldyogdG8gZnV6ei4gTm8gbmV3IGF0dGFjayBzdXJmYWNlIGludHJvZHVjZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLgoKQnV0LCBhcyBhbHdheXMsIEkgbmVlZCB0byBiZSB0aG9yb3VnaC4gTGV0JiMzOTtzIHNlZS4uLiB0aGUgcHJvbXB0IHJlbWluZHMgbWUgdGhhdCBjZXJ0YWluIHR5cGVzIG9mIGNoYW5nZXMgZG9uJiMzOTt0IHdhcnJhbnQgZnV6emluZy4gVGhpbmdzIGxpa2UgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLCBLY29uZmlnIHR3ZWFrcywgb3IgY29tbWVudCBjaGFuZ2VzIGFyZSBleGNsdWRlZC4gQWxzbyBkZWNvcmF0aXZlIGxvZ2dpbmcsIHVucmVhY2hhYmxlIGNvZGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCBzcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJbiB0aGlzIGNhc2UsIGl0JiMzOTtzIGEgKnJlbW92YWwqIG9mIHRoZSBjb2RlLgoKQWxyaWdodCwgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIFRoZSBkaWZmIHNob3dzLi4uIHllYWgsIGl0JiMzOTtzIGEgd2hvbGVzYWxlIGRlbGV0aW9uLiBUaGUgTUFJTlRBSU5FUlMsIEtjb25maWcsIE1ha2VmaWxlIGFuZCBhbGwgdGhlIGZpbGVzIGluc2lkZSB0aGUgZGlyZWN0b3J5LCBhbGwgZGVsZXRlZDogYHZ4ZnMuaGAsIGB2eGZzX2JtYXAuY2AsIGB2eGZzX2Rpci5oYCwgYHZ4ZnNfZXh0ZXJuLmhgLCBhbmQgb24gYW5kIG9uLi4uYWxsIGRlbGV0ZWQuCgpTbywgdGhlcmUmIzM5O3Mgbm8gbmV3IGNvZGUgaW50cm9kdWNlZCwganVzdCBjb2RlIHJlbW92ZWQuIE5vIG5lZWQgdG8gZnV6eiBhbnl0aGluZyBoZXJlLgoKT2theSwganVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIHRha2Ugb25lIGxhc3QgbG9vayB0aHJvdWdoIHRoZSBkaWZmIHRvIG1ha2Ugc3VyZSBub3RoaW5nIGVsc2Ugc2xpcHBlZCBpbi4gTm8sIHRoYXQmIzM5O3MgaXQuIEl0JiMzOTtzIHB1cmVseSBhIGRlbGV0aW9uIG9mIHRoZSBgZnJlZXZ4ZnNgIGZpbGVzeXN0ZW0uCgpUaGVyZWZvcmUsIG15IGZpbmFsIGFzc2Vzc21lbnQgaXMgYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMzAgMTg6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIGZyZWV2eGZzIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBUaGVyZSBpcyBubyBuZXcgb3IgbW9kaWZpZWQgY29kZSB0byBmdXp6LCBvbmx5IGRlbGV0ZWQgY29kZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTMwVDE4OjQwOjEwLjMxMjEzODY0OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkwNzM1MjgwNTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgZnJlZXZ4ZnMgZmlsZXN5c3RlbSBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlIGlzIG5vIG5ldyBvciBtb2RpZmllZCBjb2RlIHRvIGZ1enosIG9ubHkgZGVsZXRlZCBjb2RlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMzBUMTg6NDA6MTAuMzEyMTQ0ODE5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozOTk5ODg0NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA4ZGFlNTE0OGMxMDQ1ZmQwMGU1YWE5MTMxZjdkMzU4NDY0YzBjOGU1XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVsIDMwIDE4OjQwOjA5IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTA1NjUsMTIgKzEwNTY1LDYgQEAgTDpcXHRsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZ1xcbiBTOlxcdE9ycGhhblxcbiBGOlxcdGRyaXZlcnMvdXNiL3BoeS9waHktZnNsLXVzYipcXG4gXFxuLUZSRUVWWEZTIEZJTEVTWVNURU1cXG4tTTpcXHRDaHJpc3RvcGggSGVsbHdpZyBcXHUwMDNjaGNoQGluZnJhZGVhZC5vcmdcXHUwMDNlXFxuLVM6XFx0TWFpbnRhaW5lZFxcbi1XOlxcdGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL3Z4ZnNcXG4tRjpcXHRmcy9mcmVldnhmcy9cXG4tXFxuIEZSRUVaRVJcXG4gTTpcXHRcXFwiUmFmYWVsIEouIFd5c29ja2lcXFwiIFxcdTAwM2NyYWZhZWxAa2VybmVsLm9yZ1xcdTAwM2VcXG4gUjpcXHRQYXZlbCBNYWNoZWsgXFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcXHUwMDNlXFxuZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnXFxuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcXG4tLS0gYS9mcy9LY29uZmlnXFxuKysrIGIvZnMvS2NvbmZpZ1xcbkBAIC0zMjEsNyArMzIxLDYgQEAgc291cmNlIFxcXCJmcy9qZmZzMi9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL3ViaWZzL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvY3JhbWZzL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvc3F1YXNoZnMvS2NvbmZpZ1xcXCJcXG4tc291cmNlIFxcXCJmcy9mcmVldnhmcy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL21pbml4L0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZnMvb21mcy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImZzL2hwZnMvS2NvbmZpZ1xcXCJcXG5kaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZVxcbmluZGV4IDg5YThhOWQyMDdkMWMuLmFjMGQxYzAwNTIzZjAgMTAwNjQ0XFxuLS0tIGEvZnMvTWFrZWZpbGVcXG4rKysgYi9mcy9NYWtlZmlsZVxcbkBAIC04MCw3ICs4MCw2IEBAIG9iai0kKENPTkZJR19JU085NjYwX0ZTKVxcdCs9IGlzb2ZzL1xcbiBvYmotJChDT05GSUdfSEZTUExVU19GUylcXHQrPSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUytcXG4gb2JqLSQoQ09ORklHX0hGU19GUylcXHRcXHQrPSBoZnMvXFxuIG9iai0kKENPTkZJR19FQ1JZUFRfRlMpXFx0XFx0Kz0gZWNyeXB0ZnMvXFxuLW9iai0kKENPTkZJR19WWEZTX0ZTKVxcdFxcdCs9IGZyZWV2eGZzL1xcbiBvYmotJChDT05GSUdfTkZTX0ZTKVxcdFxcdCs9IG5mcy9cXG4gb2JqLSQoQ09ORklHX0VYUE9SVEZTKVxcdFxcdCs9IGV4cG9ydGZzL1xcbiBvYmotJChDT05GSUdfTkZTRClcXHRcXHQrPSBuZnNkL1xcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDkxMjEwN2ViZWE2ZjQuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI3ICswLDAgQEBcXG4tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLWNvbmZpZyBWWEZTX0ZTXFxuLVxcdHRyaXN0YXRlIFxcXCJGcmVlVnhGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChWRVJJVEFTIFZ4RlMoVE0pIGNvbXBhdGlibGUpXFxcIlxcbi1cXHRkZXBlbmRzIG9uIEJMT0NLXFxuLVxcdHNlbGVjdCBCVUZGRVJfSEVBRFxcbi1cXHRoZWxwXFxuLVxcdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXFxuLVxcdCAgZmlsZSBzeXN0ZW0gZm9ybWF0LiAgVkVSSVRBUyBWeEZTKFRNKSBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW1cXG4tXFx0ICBvZiBTQ08gVW5peFdhcmUgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGFuZCBvcHRpb25hbGx5IGF2YWlsYWJsZVxcbi1cXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXFxuLVxcdCAgdGhlc2UgcGFydGljdWxhciBPUyBpbXBsZW1lbnRhdGlvbnMgb2YgdnhmcyBtYXkgZGlmZmVyIGluIG9uLWRpc2tcXG4tXFx0ICBkYXRhIGVuZGlhbm5lc3MgYW5kL29yIHN1cGVyYmxvY2sgb2Zmc2V0LiBUaGUgdnhmcyBtb2R1bGUgaGFzIGJlZW5cXG4tXFx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxcbi1cXHQgIEN1cnJlbnRseSBvbmx5IHJlYWRvbmx5IGFjY2VzcyBpcyBzdXBwb3J0ZWQgYW5kIFZ4RlggdmVyc2lvbnNcXG4tXFx0ICAyLCAzIGFuZCA0LiBUZXN0cyB3ZXJlIHBlcmZvcm1lZCB3aXRoIEhQLVVYIFZ4RlMgdmVyc2lvbiAzLlxcbi1cXG4tXFx0ICBOT1RFOiB0aGUgZmlsZSBzeXN0ZW0gdHlwZSBhcyB1c2VkIGJ5IG1vdW50KDEpLCBtb3VudCgyKSBhbmRcXG4tXFx0ICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdFxcbi1cXHQgIHRoZSBhY3R1YWwgZHJpdmVyLlxcbi1cXG4tXFx0ICBUaGVyZSBpcyBhIHVzZXJzcGFjZSB1dGlsaXR5IGZvciBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgd2hpY2ggbWFrZXNcXG4tXFx0ICBjcmVhdGluZyBIUC1VWCBsb2dpY2FsIHZvbHVtZXMgZWFzeSBmcm9tIEhQLVVYIGRpc2sgYmxvY2sgZGV2aWNlIGZpbGVcXG4tXFx0ICBvciByZWd1bGFyIGZpbGUgd2l0aCBpbWFnZSBvZiB0aGUgZGlzay4gU2VlOlxcbi1cXHQgICAgICAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eC12eGZzL1xcbi1cXG4tXFx0ICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxcbi1cXHQgIGNhbGxlZCBmcmVldnhmcy4gIElmIHVuc3VyZSwgc2F5IE4uXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlIGIvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBlNmVlNTkyOTE1MjFjLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvTWFrZWZpbGVcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsOSArMCwwIEBAXFxuLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0jXFxuLSMgVnhGUyBNYWtlZmlsZVxcbi0jXFxuLVxcbi1vYmotJChDT05GSUdfVlhGU19GUykgKz0gZnJlZXZ4ZnMub1xcbi1cXG4tZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXFxcXFxcbi1cXHRcXHQgdnhmc19sb29rdXAubyB2eGZzX29sdC5vIHZ4ZnNfc3Vici5vIHZ4ZnNfc3VwZXIub1xcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBiZmZkMTU2ZDY0MzRjLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmcy5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDI1NyArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLSNpZm5kZWYgX1ZYRlNfU1VQRVJfSF9cXG4tI2RlZmluZSBfVlhGU19TVVBFUl9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgc3RydWN0dXJlLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmVcXG4tICogc3VwZXJibG9ja3Mgb2YgdGhlIFZlcml0YXMgRmlsZXN5c3RlbS5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbi1cXG4tLypcXG4tICogU3VwZXJibG9jayBtYWdpYyBudW1iZXIgKHZ4ZnNfc3VwZXItXFx1MDAzZXZzX21hZ2ljKS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19TVVBFUl9NQUdJQ1xcdDB4YTUwMUZDRjVcXG4tXFxuLS8qXFxuLSAqIFRoZSByb290IGlub2RlLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX1JPT1RfSU5PXFx0XFx0Mlxcbi1cXG4tLypcXG4tICogTnVtIG9mIGVudHJpZXMgaW4gZnJlZSBleHRlbnQgYXJyYXlcXG4tICovXFxuLSNkZWZpbmUgVlhGU19ORUZSRUVcXHRcXHQzMlxcbi1cXG4tZW51bSB2eGZzX2J5dGVfb3JkZXIge1xcbi1cXHRWWEZTX0JPX0xFLFxcbi1cXHRWWEZTX0JPX0JFLFxcbi19O1xcbi1cXG4tdHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2O1xcbi10eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2ZzMzI7XFxuLXR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fZnM2NDtcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19zYiB7XFxuLVxcdC8qXFxuLVxcdCAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLlxcbi1cXHQgKlxcbi1cXHQgKiBMb3RzIG9mIHRoaXMgZmllbGRzIGFyZSBubyBtb3JlIHVzZWQgYnkgdmVyc2lvbiAyXFxuLVxcdCAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy5cXG4tXFx0ICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX21hZ2ljO1xcdFxcdC8qIE1hZ2ljIG51bWJlciAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c192ZXJzaW9uO1xcdFxcdC8qIFZ4RlMgdmVyc2lvbiAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19jdGltZTtcXHRcXHQvKiBjcmVhdGUgdGltZSAtIHNlY3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfY3V0aW1lO1xcdFxcdC8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi9cXG4tXFx0X19mczMyXFx0XFx0X191bnVzZWQxO1xcdFxcdC8qIHVudXNlZCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRfX3VudXNlZDI7XFx0XFx0LyogdW51c2VkICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9sb2dzdGFydDtcXHQvKiBvYnNvbGV0ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfbG9nZW5kO1xcdFxcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzaXplO1xcdFxcdC8qIGJsb2NrIHNpemUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfc2l6ZTtcXHRcXHQvKiBudW1iZXIgb2YgYmxvY2tzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2RzaXplO1xcdFxcdC8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfbmlub2RlO1xcdFxcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9uYXU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0X191bnVzZWQzO1xcdFxcdC8qIHVudXNlZCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfZGVmaWV4dHNpemU7XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX2lsYnNpemU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaW1tZWRsZW47XFx0XFx0Lyogc2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBhcmVhICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX25kYWRkcjtcXHRcXHQvKiBudW1iZXIgb2YgZGlyZWN0IGV4dGVudGVzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2ZpcnN0YXU7XFx0XFx0LyogYWRkcmVzcyBvZiBmaXJzdCBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19lbWFwO1xcdFxcdC8qIG9mZnNldCBvZiBleHRlbnQgbWFwIGluIEFVICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2ltYXA7XFx0XFx0Lyogb2Zmc2V0IG9mIGlub2RlIG1hcCBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19pZXh0b3A7XFx0XFx0Lyogb2Zmc2V0IG9mIEV4dE9wLiBtYXAgaW4gQVUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaXN0YXJ0O1xcdFxcdC8qIG9mZnNldCBvZiBpbm9kZSBsaXN0IGluIEFVICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzdGFydDtcXHRcXHQvKiBvZmZzZXQgb2YgZmRibG9jayBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mZW1hcDtcXHRcXHQvKiBhdWZpcnN0ICsgZW1hcCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19maW1hcDtcXHRcXHQvKiBhdWZpcnN0ICsgaW1hcCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19maWV4dG9wO1xcdFxcdC8qIGF1Zmlyc3QgKyBpZXh0b3AgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZmlzdGFydDtcXHRcXHQvKiBhdWZpcnN0ICsgaXN0YXJ0ICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2Zic3RhcnQ7XFx0XFx0LyogYXVmaXJzdCArIGJzdGFydCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19uaW5kaXI7XFx0XFx0LyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYXVsZW47XFx0XFx0LyogbGVuZ3RoIG9mIEFVIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWltbGVuO1xcdFxcdC8qIGxlbmd0aCBvZiBpbWFwIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWVtbGVuO1xcdFxcdC8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWlsZW47XFx0XFx0LyogbGVuZ3RoIG9mIGlsaXN0IGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdXBhZDtcXHRcXHQvKiBsZW5ndGggb2YgcGFkIGluIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19hdWJsb2NrcztcXHRcXHQvKiBkYXRhIGJsb2NrcyBpbiBBVSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19tYXh0aWVyO1xcdFxcdC8qIGxvZyBiYXNlIDIgb2YgYXVibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaW5vcGI7XFx0XFx0LyogbnVtYmVyIG9mIGlub2RlcyBwZXIgYmxrICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9pbm9wYXU7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX2lub3BpbGI7XFx0XFx0Lyogb2Jzb2xldGUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2xkX25kaXJpcGF1O1xcdC8qIG9ic29sZXRlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2lhZGRybGVuO1xcdFxcdC8qIHNpemUgb2YgaW5kaXJlY3QgYWRkciBleHQuICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2JzaGlmdDtcXHRcXHQvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2lub3NoaWZ0O1xcdFxcdC8qIGxvZyBiYXNlIDIgb2YgaW5vYnAgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYm1hc2s7XFx0XFx0LyogfiggYnNpemUgLSAxICkgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfYm9mZm1hc2s7XFx0XFx0LyogYnNpemUgLSAxICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX29sZF9pbm9tYXNrO1xcdFxcdC8qIG9sZF9pbm9waWxiIC0gMSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19jaGVja3N1bTtcXHRcXHQvKiBjaGVja3N1bSBvZiBWMSBkYXRhICovXFxuLVxcdFxcbi1cXHQvKlxcbi1cXHQgKiBWZXJzaW9uIDEsIHdyaXRhYmxlXFxuLVxcdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mcmVlO1xcdFxcdC8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19pZnJlZTtcXHRcXHQvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZWZyZWVbVlhGU19ORUZSRUVdO1xcdC8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19mbGFncztcXHRcXHQvKiBmbGFncyA/IT8gKi9cXG4tXFx0X191OFxcdFxcdHZzX21vZDtcXHRcXHRcXHQvKiBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi9cXG4tXFx0X191OFxcdFxcdHZzX2NsZWFuO1xcdFxcdC8qIGNsZWFuIEZTICovXFxuLVxcdF9fZnMxNlxcdFxcdF9fdW51c2VkNDtcXHRcXHQvKiB1bnVzZWQgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZmlyc3Rsb2dpZDtcXHRcXHQvKiBtb3VudCB0aW1lIGxvZyBJRCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c193dGltZTtcXHRcXHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHNlYyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c193dXRpbWU7XFx0XFx0LyogbGFzdCB0aW1lIHdyaXR0ZW4gLSB1c2VjICovXFxuLVxcdF9fdThcXHRcXHR2c19mbmFtZVs2XTtcXHRcXHQvKiBGUyBuYW1lICovXFxuLVxcdF9fdThcXHRcXHR2c19mcGFja1s2XTtcXHRcXHQvKiBGUyBwYWNrIG5hbWUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfbG9ndmVyc2lvbjtcXHRcXHQvKiBsb2cgZm9ybWF0IHZlcnNpb24gKi9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDU7XFx0XFx0LyogdW51c2VkICovXFxuLVxcdFxcbi1cXHQvKlxcbi1cXHQgKiBWZXJzaW9uIDIsIFJlYWQtb25seVxcbi1cXHQgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2x0ZXh0WzJdO1xcdFxcdC8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfb2x0c2l6ZTtcXHRcXHQvKiBPTFQgZXh0ZW50IHNpemUgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaWF1aW1sZW47XFx0XFx0Lyogc2l6ZSBvZiBpbm9kZSBtYXAgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfaWF1c2l6ZTtcXHRcXHQvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dnNfZGlub3NpemU7XFx0XFx0Lyogc2l6ZSBvZiBpbm9kZSBpbiBieXRlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2c19vbGRfZG5pYWRkcjtcXHRcXHQvKiBpbmRpciBsZXZlbHMgcGVyIGlub2RlICovXFxuLVxcdF9fZnMzMlxcdFxcdHZzX2NoZWNrc3VtMjtcXHRcXHQvKiBjaGVja3N1bSBvZiBWMiBSTyAqL1xcbi1cXG4tXFx0LypcXG4tXFx0ICogQWN0dWFsbHkgbXVjaCBtb3JlLi4uXFxuLVxcdCAqL1xcbi19O1xcbi1cXG4tXFxuLS8qXFxuLSAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy5cXG4tICovXFxuLXN0cnVjdCB2eGZzX3NiX2luZm8ge1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYlxcdFxcdCp2c2lfcmF3O1xcdC8qIHJhdyAob24gZGlzaykgc3VwZXJibG9jayAqL1xcbi1cXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcXHQqdnNpX2JwO1xcdC8qIGJ1ZmZlciBmb3IgcmF3IHN1cGVyYmxvY2sqL1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHQqdnNpX2ZzaGlwO1xcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXFxuLVxcdHN0cnVjdCBpbm9kZVxcdFxcdCp2c2lfaWxpc3Q7XFx0LyogaW5vZGUgbGlzdCBpbm9kZSAqL1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHQqdnNpX3N0aWxpc3Q7XFx0Lyogc3RydWN0dXJhbCBpbm9kZSBsaXN0IGlub2RlICovXFxuLVxcdHVfbG9uZ1xcdFxcdFxcdHZzaV9pZXh0O1xcdC8qIGluaXRpYWwgaW5vZGUgbGlzdCAqL1xcbi1cXHRpbm9fdFxcdFxcdFxcdHZzaV9mc2hpbm87XFx0LyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi9cXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdHZzaV9vbHRleHQ7XFx0LyogT0xUIGV4dGVudCAqL1xcbi1cXHRkYWRkcl90XFx0XFx0XFx0dnNpX29sdHNpemU7XFx0LyogT0xUIHNpemUgKi9cXG4tXFx0ZW51bSB2eGZzX2J5dGVfb3JkZXJcXHRieXRlX29yZGVyO1xcbi19O1xcbi1cXG4tc3RhdGljIGlubGluZSB1MTYgZnMxNl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMTYgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNilhKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1MzIgZnMzMl90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzMzIgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMilhKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1NjQgZnM2NF90b19jcHUoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpLCBfX2ZzNjQgYSlcXG4te1xcbi1cXHRpZiAoc2JpLVxcdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXFxuLVxcdFxcdHJldHVybiBiZTY0X3RvX2NwdSgoX19mb3JjZSBfX2JlNjQpYSk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cmV0dXJuIGxlNjRfdG9fY3B1KChfX2ZvcmNlIF9fbGU2NClhKTtcXG4tfVxcbi1cXG4tLypcXG4tICogRmlsZSBtb2Rlcy4gIEZpbGUgdHlwZXMgYWJvdmUgMHhmMDAwIGFyZSB2eGZzIGludGVybmFsIG9ubHksIHRoZXkgc2hvdWxkXFxuLSAqIG5vdCBiZSBwYXNzZWQgYmFjayB0byBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBzeXN0ZW0uICB2eGZzIGZpbGUgdHlwZXMgbXVzdFxcbi0gKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuXFxuLSAqL1xcbi1lbnVtIHZ4ZnNfbW9kZSB7XFxuLVxcdFZYRlNfSVNVSUQgPSAweDAwMDAwODAwLFxcdC8qIHNldHVpZCAqL1xcbi1cXHRWWEZTX0lTR0lEID0gMHgwMDAwMDQwMCxcXHQvKiBzZXRnaWQgKi9cXG4tXFx0VlhGU19JU1ZUWCA9IDB4MDAwMDAyMDAsXFx0Lyogc3RpY2t5IGJpdCAqL1xcbi1cXHRWWEZTX0lSRUFEID0gMHgwMDAwMDEwMCxcXHQvKiByZWFkICovXFxuLVxcdFZYRlNfSVdSSVRFID0gMHgwMDAwMDA4MCxcXHQvKiB3cml0ZSAqL1xcbi1cXHRWWEZTX0lFWEVDID0gMHgwMDAwMDA0MCxcXHQvKiBleGVjICovXFxuLVxcbi1cXHRWWEZTX0lGSUZPID0gMHgwMDAwMTAwMCxcXHQvKiBOYW1lZCBwaXBlICovXFxuLVxcdFZYRlNfSUZDSFIgPSAweDAwMDAyMDAwLFxcdC8qIENoYXJhY3RlciBkZXZpY2UgKi9cXG4tXFx0VlhGU19JRkRJUiA9IDB4MDAwMDQwMDAsXFx0LyogRGlyZWN0b3J5ICovXFxuLVxcdFZYRlNfSUZOQU0gPSAweDAwMDA1MDAwLFxcdC8qIFhlbml4IGRldmljZSA/PyAqL1xcbi1cXHRWWEZTX0lGQkxLID0gMHgwMDAwNjAwMCxcXHQvKiBCbG9jayBkZXZpY2UgKi9cXG4tXFx0VlhGU19JRlJFRyA9IDB4MDAwMDgwMDAsXFx0LyogUmVndWxhciBmaWxlICovXFxuLVxcdFZYRlNfSUZDTVAgPSAweDAwMDA5MDAwLFxcdC8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi9cXG4tXFx0VlhGU19JRkxOSyA9IDB4MDAwMGEwMDAsXFx0LyogU3ltbGluayAqL1xcbi1cXHRWWEZTX0lGU09DID0gMHgwMDAwYzAwMCxcXHQvKiBTb2NrZXQgKi9cXG4tXFxuLVxcdC8qIFZ4RlMgaW50ZXJuYWwgKi9cXG4tXFx0VlhGU19JRkZTSCA9IDB4MTAwMDAwMDAsXFx0LyogRmlsZXNldCBoZWFkZXIgKi9cXG4tXFx0VlhGU19JRklMVCA9IDB4MjAwMDAwMDAsXFx0LyogSW5vZGUgbGlzdCAqL1xcbi1cXHRWWEZTX0lGSUFVID0gMHgzMDAwMDAwMCxcXHQvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi9cXG4tXFx0VlhGU19JRkNVVCA9IDB4NDAwMDAwMDAsXFx0LyogQ3VycmVudCB1c2FnZSB0YWJsZSAqL1xcbi1cXHRWWEZTX0lGQVRUID0gMHg1MDAwMDAwMCxcXHQvKiBBdHRyLiBpbm9kZSAqL1xcbi1cXHRWWEZTX0lGTENUID0gMHg2MDAwMDAwMCxcXHQvKiBMaW5rIGNvdW50IHRhYmxlICovXFxuLVxcdFZYRlNfSUZJQVQgPSAweDcwMDAwMDAwLFxcdC8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovXFxuLVxcdFZYRlNfSUZFTVIgPSAweDgwMDAwMDAwLFxcdC8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqL1xcbi1cXHRWWEZTX0lGUVVPID0gMHg5MDAwMDAwMCxcXHQvKiBCU0QgcXVvdGEgZmlsZSAqL1xcbi1cXHRWWEZTX0lGUFRJID0gMHhhMDAwMDAwMCxcXHQvKiBcXFwiUGFzcyB0aHJvdWdoXFxcIiBpbm9kZSAqL1xcbi1cXHRWWEZTX0lGTEFCID0gMHgxMTAwMDAwMCxcXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xcbi1cXHRWWEZTX0lGT0xUID0gMHgxMjAwMDAwMCxcXHQvKiBPTFQgZmlsZSAqL1xcbi1cXHRWWEZTX0lGTE9HID0gMHgxMzAwMDAwMCxcXHQvKiBMb2cgZmlsZSAqL1xcbi1cXHRWWEZTX0lGRU1QID0gMHgxNDAwMDAwMCxcXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cXG4tXFx0VlhGU19JRkVBVSA9IDB4MTUwMDAwMDAsXFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cXG4tXFx0VlhGU19JRkFVUyA9IDB4MTYwMDAwMDAsXFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xcbi1cXHRWWEZTX0lGREVWID0gMHgxNzAwMDAwMCxcXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cXG4tXFxuLX07XFxuLVxcbi0jZGVmaW5lXFx0VlhGU19UWVBFX01BU0tcXHRcXHQweGZmZmZmMDAwXFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVxcdCgoKGlwKS1cXHUwMDNldmlpX21vZGUgXFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxcbi0jZGVmaW5lIFZYRlNfSVNGSUZPKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxcbi0jZGVmaW5lIFZYRlNfSVNDSFIoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXFxuLSNkZWZpbmUgVlhGU19JU0RJUih4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcXG4tI2RlZmluZSBWWEZTX0lTTkFNKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxcbi0jZGVmaW5lIFZYRlNfSVNCTEsoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXFxuLSNkZWZpbmUgVlhGU19JU0xOSyh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcXG4tI2RlZmluZSBWWEZTX0lTUkVHKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxcbi0jZGVmaW5lIFZYRlNfSVNDTVAoeClcXHRcXHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXFxuLSNkZWZpbmUgVlhGU19JU1NPQyh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcXG4tXFxuLSNkZWZpbmUgVlhGU19JU0ZTSCh4KVxcdFxcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkZTSClcXG4tI2RlZmluZSBWWEZTX0lTSUxUKHgpXFx0XFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUxUKVxcbi1cXG4tLypcXG4tICogSW5tb2RlIG9yZ2FuaXNhdGlvbiB0eXBlcy5cXG4tICovXFxuLWVudW0ge1xcbi1cXHRWWEZTX09SR19OT05FXFx0PSAwLFxcdC8qIElub2RlIGhhcyAqbm8qIGZvcm1hdCA/IT8gKi9cXG4tXFx0VlhGU19PUkdfRVhUNFxcdD0gMSxcXHQvKiBFeHQ0ICovXFxuLVxcdFZYRlNfT1JHX0lNTUVEXFx0PSAyLFxcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xcbi1cXHRWWEZTX09SR19UWVBFRFxcdD0gMyxcXHQvKiBUeXBlZCBleHRlbnRzICovXFxuLX07XFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNfT1JHKGlwLG9yZylcXHQoKGlwKS1cXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXFxuLSNkZWZpbmUgVlhGU19JU05PTkUoaXApXFx0XFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcXG4tI2RlZmluZSBWWEZTX0lTRVhUNChpcClcXHRcXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxcbi0jZGVmaW5lIFZYRlNfSVNJTU1FRChpcClcXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19JTU1FRClcXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfVFlQRUQpXFxuLVxcbi0vKlxcbi0gKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgc3VwZXJibG9jay5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxcXFxuLVxcdCgoc3RydWN0IHZ4ZnNfc2JfaW5mbyAqKShzYnApLVxcdTAwM2VzX2ZzX2luZm8pXFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfU1VQRVJfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMgYi9mcy9mcmVldnhmcy92eGZzX2JtYXAuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDFiODIxNmViMWQ5MGEuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2JtYXAuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwyNzIgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc3lzdGVtIHRvIGRpc2sgYmxvY2sgbWFwcGluZy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfaW5vZGUuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLVxcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tc3RhdGljIHZvaWRcXG4tdnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApXFxuLXtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInR5cGU9JUx1IFxcXCIsIHR5cC1cXHUwMDNldnRfaGRyIFxcdTAwM2VcXHUwMDNlIFZYRlNfVFlQRURfVFlQRVNISUZUKTtcXG4tXFx0cHJpbnRrKFxcXCJvZmZzZXQ9JUx4IFxcXCIsIHR5cC1cXHUwMDNldnRfaGRyIFxcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcXG4tXFx0cHJpbnRrKFxcXCJibG9jaz0leCBcXFwiLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKTtcXG4tXFx0cHJpbnRrKFxcXCJzaXplPSV4XFxcXG5cXFwiLCB0eXAtXFx1MDAzZXZ0X3NpemUpO1xcbi19XFxuLSNlbmRpZlxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXFxuLSAqIEBpcDpcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAYm46XFx0XFx0bG9naWNhbCBibG9jay5cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxcbi0gKiAgIGV4dDQtc3R5bGUgZXh0ZW50cyAod2hpY2ggYXJlIG11Y2ggbGlrZSB0aGUgdHJhZGl0aW9uYWwgVU5JWFxcbi0gKiAgIGlub2RlIG9yZ2FuaXNhdGlvbikuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgZGFkZHJfdFxcbi12eGZzX2JtYXBfZXh0NChzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGJuKVxcbi17XFxuLVxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpcC1cXHUwMDNlaV9zYjtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oaXApO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmkgPSBWWEZTX1NCSShzYik7XFxuLVxcdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cXHUwMDNlc19ibG9ja3NpemU7XFxuLVxcdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXFx1MDAzZXZpaV9leHQ0LnZlNF9pbmRzaXplKTtcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHRpZiAoaW5kc2l6ZSBcXHUwMDNlIHNiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSlcXG4tXFx0XFx0Z290byBmYWlsX3NpemU7XFxuLVxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVlhGU19OREFERFI7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3QgZGlyZWN0ICpkID0gdmlwLVxcdTAwM2V2aWlfZXh0NC52ZTRfZGlyZWN0ICsgaTtcXG4tXFx0XFx0aWYgKGJuIFxcdTAwM2U9IDAgXFx1MDAyNlxcdTAwMjYgYm4gXFx1MDAzYyBmczMyX3RvX2NwdShzYmksIGQtXFx1MDAzZXNpemUpKVxcbi1cXHRcXHRcXHRyZXR1cm4gKGJuICsgZnMzMl90b19jcHUoc2JpLCBkLVxcdTAwM2VleHRlbnQpKTtcXG4tXFx0XFx0Ym4gLT0gZnMzMl90b19jcHUoc2JpLCBkLVxcdTAwM2VzaXplKTtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKChibiAvIChpbmRzaXplICogaW5kc2l6ZSAqIGJzaXplIC8gNCkpID09IDApIHtcXG4tXFx0XFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpidWY7XFxuLVxcdFxcdGRhZGRyX3RcXHRibm87XFxuLVxcdFxcdF9fZnMzMiAqaW5kaXI7XFxuLVxcbi1cXHRcXHRidWYgPSBzYl9icmVhZChzYixcXG4tXFx0XFx0XFx0ZnMzMl90b19jcHUoc2JpLCB2aXAtXFx1MDAzZXZpaV9leHQ0LnZlNF9pbmRpclswXSkpO1xcbi1cXHRcXHRpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKVxcbi1cXHRcXHRcXHRnb3RvIGZhaWxfYnVmO1xcbi1cXG4tXFx0XFx0aW5kaXIgPSAoX19mczMyICopYnVmLVxcdTAwM2ViX2RhdGE7XFxuLVxcdFxcdGJubyA9IGZzMzJfdG9fY3B1KHNiaSwgaW5kaXJbKGJuIC8gaW5kc2l6ZSkgJSAoaW5kc2l6ZSAqIGJuKV0pICtcXG4tXFx0XFx0XFx0KGJuICUgaW5kc2l6ZSk7XFxuLVxcbi1cXHRcXHRicmVsc2UoYnVmKTtcXG4tXFx0XFx0cmV0dXJuIGJubztcXG4tXFx0fSBlbHNlXFxuLVxcdFxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcIm5vIG1hdGNoaW5nIGluZGlyP1xcXCIpO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLVxcbi1mYWlsX3NpemU6XFxuLVxcdHByaW50ayhcXFwidnhmczogaW5kaXJlY3QgZXh0ZW50IHRvbyBiaWchXFxcXG5cXFwiKTtcXG4tZmFpbF9idWY6XFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19ibWFwX2luZGlyIC0gcmVjdXJzaW9uIGZvciB2eGZzX2JtYXBfdHlwZWRcXG4tICogQGlwOlxcdFxcdHBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yXFxuLSAqIEBpbmRpcjpcXHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XFxuLSAqIEBzaXplOlxcdHNpemUgb2YgdGhlIHR5cGVkIGFyZWEgdG8gc2VhcmNoXFxuLSAqIEBibG9jazpcXHRwYXJ0aWFsbHkgcmVzdWx0IGZyb20gZnVydGhlciBzZWFyY2hlc1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2JtYXBfaW5kaXIgcmVhZHMgYSBcXHUwMDI2c3RydWN0IHZ4ZnNfdHlwZWQgYXQgQGluZGlyXFxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKlxcbi0gKiBOb3RlOlxcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XFxuLSAqL1xcbi1zdGF0aWMgZGFkZHJfdFxcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCpzYmkgPSBWWEZTX1NCSShpcC1cXHUwMDNlaV9zYik7XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdFxcdCpicCA9IE5VTEw7XFxuLVxcdGRhZGRyX3RcXHRcXHRcXHRcXHRwYmxvY2sgPSAwO1xcbi1cXHRpbnRcXHRcXHRcXHRcXHRpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemUgKiBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC1cXHUwMDNlaV9zYik7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdCp0eXA7XFxuLVxcdFxcdGludDY0X3RcXHRcXHRcXHRvZmY7XFxuLVxcbi1cXHRcXHRicCA9IHNiX2JyZWFkKGlwLVxcdTAwM2VpX3NiLFxcbi1cXHRcXHRcXHRcXHRpbmRpciArIChpIC8gVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXFx1MDAzZWlfc2IpKSk7XFxuLVxcdFxcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdFxcdHR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC1cXHUwMDNlYl9kYXRhKSArXFxuLVxcdFxcdFxcdChpICUgVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXFx1MDAzZWlfc2IpKTtcXG4tXFx0XFx0b2ZmID0gZnM2NF90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2hkcikgXFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0s7XFxuLVxcbi1cXHRcXHRpZiAoYmxvY2sgXFx1MDAzYyBvZmYpIHtcXG4tXFx0XFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHN3aXRjaCAoKHVfaW50MzJfdCkoZnM2NF90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2hkcikgXFx1MDAzZVxcdTAwM2VcXG4tXFx0XFx0XFx0XFx0VlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcXG4tXFx0XFx0XFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfYmxvY2spLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSksXFxuLVxcdFxcdFxcdFxcdFxcdGJsb2NrIC0gb2ZmKTtcXG4tXFx0XFx0XFx0aWYgKHBibG9jayA9PSAtMilcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjYXNlIFZYRlNfVFlQRURfREFUQTpcXG4tXFx0XFx0XFx0aWYgKChibG9jayAtIG9mZikgXFx1MDAzZT0gZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X3NpemUpKVxcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0cGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKSArIGJsb2NrIC0gb2ZmO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcXG4tXFx0XFx0XFx0c3RydWN0IHZ4ZnNfdHlwZWRfZGV2NFxcdCp0eXA0ID1cXG4tXFx0XFx0XFx0XFx0KHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7XFxuLVxcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9JTkZPIFxcXCJcXFxcblxcXFxuVFlQRURfREVWNCBkZXRlY3RlZCFcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9JTkZPIFxcXCJibG9jazogJWxsdVxcXFx0c2l6ZTogJWxsZFxcXFx0ZGV2OiAlZFxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cXHUwMDNldmQ0X2Jsb2NrKSxcXG4tXFx0XFx0XFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cXHUwMDNldmQ0X3NpemUpLFxcbi1cXHRcXHRcXHQgICAgICAgZnMzMl90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfZGV2KSk7XFxuLVxcdFxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRkZWZhdWx0Olxcbi1cXHRcXHRcXHRwcmludGsoS0VSTl9FUlIgXFxcIiVzOiVkIHZ0X2hkciAlbGx1XFxcXG5cXFwiLCBfX2Z1bmNfXyxcXG4tXFx0XFx0XFx0XFx0X19MSU5FX18sIGZzNjRfdG9fY3B1KHNiaSwgdHlwLVxcdTAwM2V2dF9oZHIpKTtcXG4tXFx0XFx0XFx0QlVHKCk7XFxuLVxcdFxcdH1cXG4tXFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0fVxcbi1cXG4tZmFpbDpcXG4tXFx0cGJsb2NrID0gMDtcXG4tb3V0Olxcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRyZXR1cm4gKHBibG9jayk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2JtYXBfdHlwZWQgLSBibWFwIGZvciB0eXBlZCBleHRlbnRzXFxuLSAqIEBpcDpcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAaWJsb2NrOlxcdGxvZ2ljYWwgYmxvY2tcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgUGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciB0eXBlZCBleHRlbnRzLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKi9cXG4tc3RhdGljIGRhZGRyX3RcXG4tdnhmc19ibWFwX3R5cGVkKHN0cnVjdCBpbm9kZSAqaXAsIGxvbmcgaWJsb2NrKVxcbi17XFxuLVxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cXHRcXHQqdmlwID0gVlhGU19JTk8oaXApO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0XFx0KnNiaSA9IFZYRlNfU0JJKGlwLVxcdTAwM2VpX3NiKTtcXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdFxcdHBibG9jayA9IDA7XFxuLVxcdGludFxcdFxcdFxcdFxcdGk7XFxuLVxcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVlhGU19OVFlQRUQ7IGkrKykge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdCp0eXAgPSB2aXAtXFx1MDAzZXZpaV9vcmcudHlwZWQgKyBpO1xcbi1cXHRcXHR1NjRcXHRcXHRcXHRoZHIgPSBmczY0X3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfaGRyKTtcXG4tXFx0XFx0aW50NjRfdFxcdFxcdFxcdG9mZiA9IChoZHIgXFx1MDAyNiBWWEZTX1RZUEVEX09GRlNFVE1BU0spO1xcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0XFx0dnhmc190eXBkdW1wKHR5cCk7XFxuLSNlbmRpZlxcbi1cXHRcXHRpZiAoaWJsb2NrIFxcdTAwM2Mgb2ZmKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0c3dpdGNoICgodTMyKShoZHIgXFx1MDAzZVxcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpKSB7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVDpcXG4tXFx0XFx0XFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfYmxvY2spLFxcbi1cXHRcXHRcXHRcXHRcXHRmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSksXFxuLVxcdFxcdFxcdFxcdFxcdGlibG9jayAtIG9mZik7XFxuLVxcdFxcdFxcdGlmIChwYmxvY2sgPT0gLTIpXFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHRyZXR1cm4gKHBibG9jayk7XFxuLVxcdFxcdGNhc2UgVlhGU19UWVBFRF9EQVRBOlxcbi1cXHRcXHRcXHRpZiAoKGlibG9jayAtIG9mZikgXFx1MDAzYyBmczMyX3RvX2NwdShzYmksIHR5cC1cXHUwMDNldnRfc2l6ZSkpXFxuLVxcdFxcdFxcdFxcdHJldHVybiAoZnMzMl90b19jcHUoc2JpLCB0eXAtXFx1MDAzZXZ0X2Jsb2NrKSArXFxuLVxcdFxcdFxcdFxcdFxcdFxcdGlibG9jayAtIG9mZik7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1RfREVWNDpcXG4tXFx0XFx0Y2FzZSBWWEZTX1RZUEVEX0RBVEFfREVWNDoge1xcbi1cXHRcXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XFx0KnR5cDQgPVxcbi1cXHRcXHRcXHRcXHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcXG4tXFxuLVxcdFxcdFxcdHByaW50ayhLRVJOX0lORk8gXFxcIlxcXFxuXFxcXG5UWVBFRF9ERVY0IGRldGVjdGVkIVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHByaW50ayhLRVJOX0lORk8gXFxcImJsb2NrOiAlbGx1XFxcXHRzaXplOiAlbGxkXFxcXHRkZXY6ICVkXFxcXG5cXFwiLFxcbi1cXHRcXHRcXHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfYmxvY2spLFxcbi1cXHRcXHRcXHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVxcdTAwM2V2ZDRfc2l6ZSksXFxuLVxcdFxcdFxcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXFx1MDAzZXZkNF9kZXYpKTtcXG4tXFx0XFx0XFx0cmV0dXJuIDA7XFxuLVxcdFxcdH1cXG4tXFx0XFx0ZGVmYXVsdDpcXG4tXFx0XFx0XFx0V0FSTl9PTl9PTkNFKDEpO1xcbi1cXHRcXHRcXHRyZXR1cm4gMDtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYm1hcDEgLSB2eGZzLWludGVybmFsIGJtYXAgb3BlcmF0aW9uXFxuLSAqIEBpcDpcXHRcXHRcXHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxcbi0gKiBAaWJsb2NrOlxcdFxcdGxvZ2ljYWwgYmxvY2tcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXFxuLSAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1kYWRkcl90XFxuLXZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1xcdFxcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XFxuLVxcbi1cXHRpZiAoVlhGU19JU0VYVDQodmlwKSlcXG4tXFx0XFx0cmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spO1xcbi1cXHRpZiAoVlhGU19JU1RZUEVEKHZpcCkpXFxuLVxcdFxcdHJldHVybiB2eGZzX2JtYXBfdHlwZWQoaXAsIGlibG9jayk7XFxuLVxcdGlmIChWWEZTX0lTTk9ORSh2aXApKVxcbi1cXHRcXHRnb3RvIHVuc3VwcDtcXG4tXFx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxcbi1cXHRcXHRnb3RvIHVuc3VwcDtcXG4tXFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IGlub2RlICVsbHUgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfaW5vLCB2aXAtXFx1MDAzZXZpaV9vcmd0eXBlKTtcXG4tXFx0QlVHKCk7XFxuLVxcbi11bnN1cHA6XFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IGlub2RlICVsbHUgaGFzIGFuIHVuc3VwcG9ydGVkIG9yZ3R5cGUgKCV4KVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfaW5vLCB2aXAtXFx1MDAzZXZpaV9vcmd0eXBlKTtcXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaFxcbisrKyAvZGV2L251bGxcXG5AQCAtMSw2OCArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqL1xcbi0jaWZuZGVmIF9WWEZTX0RJUl9IX1xcbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXFxuLSAqXFxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdnhmcyBkaXJlY3RvcnkgZm9ybWF0Llxcbi0gKi9cXG4tXFxuLVxcbi0vKlxcbi0gKiBWeEZTIGRpcmVjdG9yeSBibG9jayBoZWFkZXIuXFxuLSAqXFxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cXG4tICogSXQgaXMgdXNlZCBmb3IgZnJlZSBzcGFjZSBtYW5hZ2VtZW50IGFuZCBhZGRpdGlvbmFsbHkgaW5jbHVkZXNcXG4tICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLlxcbi0gKlxcbi0gKiBUaGUgaGFzaCBtYXkgYmUgZW1wdHkgYW5kIGluIGZhY3Qgd2UgZG8gbm90IHVzZSBpdCBhbGwgaW4gdGhlXFxuLSAqIExpbnV4IGRyaXZlciBmb3Igbm93Llxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfZGlyYmxrIHtcXG4tXFx0X19mczE2XFx0XFx0ZF9mcmVlO1xcdFxcdC8qIGZyZWUgc3BhY2UgaW4gZGlyYmxvY2sgKi9cXG4tXFx0X19mczE2XFx0XFx0ZF9uaGFzaDtcXHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xcbi1cXHRfX2ZzMTZcXHRcXHRkX2hhc2hbXTtcXHQvKiBoYXNoIGNoYWluICovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcXG4tICpcXHRvZiBhbiBWeEZTIGRpcmVjdG9yeSBlbnRyeS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19OQU1FTEVOXFx0MjU2XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGRpcmVjdG9yeSBlbnRyeS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2RpcmVjdCB7XFxuLVxcdF9fZnMzMlxcdFxcdGRfaW5vO1xcdFxcdFxcdC8qIGlub2RlIG51bWJlciAqL1xcbi1cXHRfX2ZzMTZcXHRcXHRkX3JlY2xlbjtcXHRcXHQvKiByZWNvcmQgbGVuZ3RoICovXFxuLVxcdF9fZnMxNlxcdFxcdGRfbmFtZWxlbjtcXHRcXHQvKiBkX25hbWUgbGVuZ3RoICovXFxuLVxcdF9fZnMxNlxcdFxcdGRfaGFzaG5leHQ7XFx0XFx0LyogbmV4dCBoYXNoIGVudHJ5ICovXFxuLVxcdGNoYXJcXHRcXHRkX25hbWVbVlhGU19OQU1FTEVOXTtcXHQvKiBuYW1lICovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWWEZTX0RJUlBBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cnkgYm91bmRhcmllcywgaXMgX211c3RfIGJlXFxuLSAqXFx0YSBtdWx0aXBsZSBvZiBmb3VyLlxcbi0gKiBWWEZTX05BTUVNSU4gaXMgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeSB3aXRoIGEgTlVMTCBkX25hbWUuXFxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcXG4tICpcXHR1c2FibGUgZm9yIGRpcmVjdG9yeSBzaXplcy5cXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcXG4tICpcXHRhIGRfbmFtZSB3aXRoIHNpemUgbGVuLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX0RJUlBBRFxcdFxcdDRcXG4tI2RlZmluZSBWWEZTX05BTUVNSU5cXHRcXHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcXG4tI2RlZmluZSBWWEZTX0RJUlJPVU5EKGxlbilcXHQoKFZYRlNfRElSUEFEICsgKGxlbikgLSAxKSBcXHUwMDI2IH4oVlhGU19ESVJQQUQgLTEpKVxcbi0jZGVmaW5lIFZYRlNfRElSTEVOKGxlbilcXHQoVlhGU19ESVJST1VORChWWEZTX05BTUVNSU4gKyAobGVuKSkpXFxuLVxcbi0vKlxcbi0gKiBWWEZTX0RJUkJMS09WIGlzIHRoZSBvdmVyaGVhZCBvZiBhIHNwZWNpZmljIGRpcmJsb2NrLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKVxcdFxcXFxcXG4tXFx0KChzaXplb2Yoc2hvcnQpICogZnMxNl90b19jcHUoc2JpLCBkYnAtXFx1MDAzZWRfbmhhc2gpKSArIDQpXFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmggYi9mcy9mcmVldnhmcy92eGZzX2V4dGVybi5oXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsNDkgKzAsMCBAQFxcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19FWFRFUk5fSF9cXG4tI2RlZmluZSBfVlhGU19FWFRFUk5fSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBleHRlcm5hbCBwcm90b3R5cGVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvdG90eXBlcyBmb3IgYWxsIHZ4ZnMgZnVuY3Rpb25zIHVzZWRcXG4tICogb3V0c2lkZSB0aGVpciByZXNwZWN0aXZlIHNvdXJjZSBmaWxlcy5cXG4tICovXFxuLVxcbi1cXG4tc3RydWN0IGttZW1fY2FjaGU7XFxuLXN0cnVjdCBzdXBlcl9ibG9jaztcXG4tc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbztcXG4tc3RydWN0IGlub2RlO1xcbi1cXG4tXFxuLS8qIHZ4ZnNfYm1hcC5jICovXFxuLWV4dGVybiBkYWRkcl90XFx0XFx0XFx0dnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKiwgbG9uZyk7XFxuLVxcbi0vKiB2eGZzX2ZzaGVhZC5jICovXFxuLWV4dGVybiBpbnRcXHRcXHRcXHR2eGZzX3JlYWRfZnNoZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTtcXG4tXFxuLS8qIHZ4ZnNfaW5vZGUuYyAqL1xcbi1leHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHM7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTtcXG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVxcdFxcdCp2eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZywgaW5vX3QpO1xcbi1leHRlcm4gc3RydWN0IGlub2RlXFx0XFx0KnZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XFxuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcXHRcXHQqdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7XFxuLVxcbi0vKiB2eGZzX2xvb2t1cC5jICovXFxuLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9uc1xcdHZ4ZnNfZGlyX2lub2RlX29wcztcXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnNcXHR2eGZzX2Rpcl9vcGVyYXRpb25zO1xcbi1cXG4tLyogdnhmc19vbHQuYyAqL1xcbi1leHRlcm4gaW50XFx0XFx0XFx0dnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nKTtcXG4tXFxuLS8qIHZ4ZnNfc3Vici5jICovXFxuLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHZ4ZnNfYW9wcztcXG4tZXh0ZXJuIHN0cnVjdCBwYWdlICpcXHRcXHR2eGZzX2dldF9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHVfbG9uZyk7XFxuLWV4dGVybiB2b2lkXFx0XFx0XFx0dnhmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqKTtcXG4tZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqXFx0dnhmc19icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50KTtcXG4tXFxuLSNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBlNmFiOGJkZjdhNmNhLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxNjYgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXFxuLSAqL1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGZpbGVzZXQgaGVhZGVyIHJvdXRpbmVzLlxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmcuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19mc2hlYWQuaFxcXCJcXG4tXFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1zdGF0aWMgdm9pZFxcbi12eGZzX2R1bXBmc2goc3RydWN0IHZ4ZnNfZnNoICpmaHApXFxuLXtcXG4tXFx0cHJpbnRrKFxcXCJcXFxcblxcXFxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcXFxcblxcXCIpO1xcbi1cXHRwcmludGsoXFxcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXFxcblxcXCIpO1xcbi1cXHRwcmludGsoXFxcInZlcnNpb246ICV1XFxcXG5cXFwiLCBmaHAtXFx1MDAzZWZzaF92ZXJzaW9uKTtcXG4tXFx0cHJpbnRrKFxcXCJmc2luZGV4OiAldVxcXFxuXFxcIiwgZmhwLVxcdTAwM2Vmc2hfZnNpbmRleCk7XFxuLVxcdHByaW50ayhcXFwiaWF1aW5vOiAldVxcXFx0bmlub2RlczoldVxcXFxuXFxcIixcXG4tXFx0XFx0XFx0ZmhwLVxcdTAwM2Vmc2hfaWF1aW5vLCBmaHAtXFx1MDAzZWZzaF9uaW5vZGVzKTtcXG4tXFx0cHJpbnRrKFxcXCJtYXhpbm9kZTogJXVcXFxcdGxjdGlubzogJXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdGZocC1cXHUwMDNlZnNoX21heGlub2RlLCBmaHAtXFx1MDAzZWZzaF9sY3Rpbm8pO1xcbi1cXHRwcmludGsoXFxcIm5hdTogJXVcXFxcblxcXCIsIGZocC1cXHUwMDNlZnNoX25hdSk7XFxuLVxcdHByaW50ayhcXFwiaWxpc3Rpbm9bMF06ICV1XFxcXHRpbGlzdGlub1sxXTogJXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdGZocC1cXHUwMDNlZnNoX2lsaXN0aW5vWzBdLCBmaHAtXFx1MDAzZWZzaF9pbGlzdGlub1sxXSk7XFxuLX1cXG4tI2VuZGlmXFxuLVxcbi0vKipcXG4tICogdnhmc19nZXRmc2ggLSByZWFkIGZpbGVzZXQgaGVhZGVyIGludG8gbWVtb3J5XFxuLSAqIEBpcDpcXHRcXHR0aGUgKGZha2UpIGZpbGVzZXQgaGVhZGVyIGlub2RlXFxuLSAqIEB3aGljaDpcXHQwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlclxcbi0gKiAgIGRlc2NyaWJlZCBieSBAaXAgaW50byBtZW1vcnkuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIGZpbGVzZXQgaGVhZGVyIHN0cnVjdHVyZSBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICpcXG4tdnhmc19nZXRmc2goc3RydWN0IGlub2RlICppcCwgaW50IHdoaWNoKVxcbi17XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdFxcdCpicDtcXG4tXFxuLVxcdGJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpO1xcbi1cXHRpZiAoYnApIHtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfZnNoXFx0XFx0KmZocDtcXG4tXFxuLVxcdFxcdGlmICghKGZocCA9IGttYWxsb2Nfb2JqKCpmaHApKSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdG1lbWNweShmaHAsIGJwLVxcdTAwM2ViX2RhdGEsIHNpemVvZigqZmhwKSk7XFxuLVxcbi1cXHRcXHRwdXRfYmgoYnApO1xcbi1cXHRcXHRyZXR1cm4gKGZocCk7XFxuLVxcdH1cXG4tb3V0Olxcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRyZXR1cm4gTlVMTDtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcmVhZF9mc2hlYWQgLSByZWFkIHRoZSBmaWxlc2V0IGhlYWRlcnNcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIHRvIHdoaWNoIHRoZSBmaWxlc2V0IGJlbG9uZ3NcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19yZWFkX2ZzaGVhZCB3aWxsIGZpbGwgdGhlIGlub2RlIGFuZCBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW4gQHNiLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKC1FSU5WQUwpLlxcbi0gKi9cXG4taW50XFxuLXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCppbmZwID0gVlhGU19TQkkoc2JwKTtcXG4tXFx0c3RydWN0IHZ4ZnNfZnNoXFx0XFx0XFx0KnBmcCwgKnNmcDtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1xcdFxcdCp2aXA7XFxuLVxcbi1cXHRpbmZwLVxcdTAwM2V2c2lfZnNoaXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLVxcdTAwM2V2c2lfaWV4dCwgaW5mcC1cXHUwMDNldnNpX2ZzaGlubyk7XFxuLVxcdGlmICghaW5mcC1cXHUwMDNldnNpX2ZzaGlwKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIHJlYWQgZnNoIGlub2RlXFxcXG5cXFwiKTtcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcdH1cXG4tXFxuLVxcdHZpcCA9IFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9mc2hpcCk7XFxuLVxcdGlmICghVlhGU19JU0ZTSCh2aXApKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxcXG5cXFwiLFxcbi1cXHRcXHRcXHRcXHR2aXAtXFx1MDAzZXZpaV9tb2RlIFxcdTAwMjYgVlhGU19UWVBFX01BU0spOyBcXG4tXFx0XFx0Z290byBvdXRfaXB1dF9mc2hpcDtcXG4tXFx0fVxcbi1cXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0cHJpbnRrKFxcXCJ2eGZzOiBmc2ggaW5vZGUgZHVtcDpcXFxcblxcXCIpO1xcbi1cXHR2eGZzX2R1bXBpKHZpcCwgaW5mcC1cXHUwMDNldnNpX2ZzaGlubyk7XFxuLSNlbmRpZlxcbi1cXG4tXFx0c2ZwID0gdnhmc19nZXRmc2goaW5mcC1cXHUwMDNldnNpX2ZzaGlwLCAwKTtcXG4tXFx0aWYgKCFzZnApIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJ2eGZzOiB1bmFibGUgdG8gZ2V0IHN0cnVjdHVyYWwgZnNoXFxcXG5cXFwiKTtcXG4tXFx0XFx0Z290byBvdXRfaXB1dF9mc2hpcDtcXG4tXFx0fSBcXG4tXFxuLSNpZmRlZiBESUFHTk9TVElDXFxuLVxcdHZ4ZnNfZHVtcGZzaChzZnApO1xcbi0jZW5kaWZcXG4tXFxuLVxcdHBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtXFx1MDAzZXZzaV9mc2hpcCwgMSk7XFxuLVxcdGlmICghcGZwKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gb3V0X2ZyZWVfc2ZwO1xcbi1cXHR9XFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHR2eGZzX2R1bXBmc2gocGZwKTtcXG4tI2VuZGlmXFxuLVxcbi1cXHRpbmZwLVxcdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXFx1MDAzZXZzaV9pZXh0LFxcbi1cXHRcXHRcXHRmczMyX3RvX2NwdShpbmZwLCBzZnAtXFx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xcbi1cXHRpZiAoIWluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGxpc3QgaW5vZGVcXFxcblxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9mcmVlX3BmcDtcXG4tXFx0fVxcbi1cXHRpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpKSkge1xcbi1cXHRcXHRwcmludGsoS0VSTl9FUlIgXFxcInZ4ZnM6IHN0cnVjdHVyYWwgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KS1cXHUwMDNldmlpX21vZGUgXFx1MDAyNiBWWEZTX1RZUEVfTUFTSyk7IFxcbi1cXHRcXHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XFxuLVxcdH1cXG4tXFxuLVxcdGluZnAtXFx1MDAzZXZzaV9pbGlzdCA9IHZ4ZnNfc3RpZ2V0KHNicCwgZnMzMl90b19jcHUoaW5mcCwgcGZwLVxcdTAwM2Vmc2hfaWxpc3Rpbm9bMF0pKTtcXG4tXFx0aWYgKCFpbmZwLVxcdTAwM2V2c2lfaWxpc3QpIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fRVJSIFxcXCJ2eGZzOiB1bmFibGUgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcXFxcblxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dF9pcHV0X3N0aWxpc3Q7XFxuLVxcdH1cXG4tXFx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9pbGlzdCkpKSB7XFxuLVxcdFxcdHByaW50ayhLRVJOX0VSUiBcXFwidnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdFZYRlNfSU5PKGluZnAtXFx1MDAzZXZzaV9pbGlzdCktXFx1MDAzZXZpaV9tb2RlIFxcdTAwMjYgVlhGU19UWVBFX01BU0spO1xcbi1cXHRcXHRnb3RvIG91dF9pcHV0X2lsaXN0O1xcbi1cXHR9XFxuLVxcbi1cXHRrZnJlZShwZnApO1xcbi1cXHRrZnJlZShzZnApO1xcbi1cXHRyZXR1cm4gMDtcXG4tXFxuLSBvdXRfaXB1dF9pbGlzdDpcXG4tIFxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX2lsaXN0KTtcXG4tIG91dF9pcHV0X3N0aWxpc3Q6XFxuLSBcXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9zdGlsaXN0KTtcXG4tIG91dF9mcmVlX3BmcDpcXG4tXFx0a2ZyZWUocGZwKTtcXG4tIG91dF9mcmVlX3NmcDpcXG4tIFxcdGtmcmVlKHNmcCk7XFxuLSBvdXRfaXB1dF9mc2hpcDpcXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRyZXR1cm4gLUVJTlZBTDtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGRmZDIxNDc1OTljNDkuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDQzICswLDAgQEBcXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19GU0hFQURfSF9cXG4tI2RlZmluZSBfVlhGU19GU0hFQURfSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBoeXNpY2FsIHN0cnVjdHVyZSBvZiB0aGUgVnhGU1xcbi0gKiBmaWxlc2V0IGhlYWRlci5cXG4tICovXFxuLVxcbi1cXG4tLypcXG4tICogRmlsZXNldCBoZWFkZXIgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19mc2gge1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfdmVyc2lvbjtcXHRcXHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9mc2luZGV4O1xcdFxcdC8qIGZpbGVzZXQgaW5kZXggKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX3RpbWU7XFx0XFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX3V0aW1lO1xcdFxcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfZXh0b3A7XFx0XFx0LyogZXh0b3AgZmxhZ3MgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX25pbm9kZXM7XFx0XFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbmF1O1xcdFxcdC8qIG51bWJlciBvZiBJQVVzICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9vbGRfaWxlc2l6ZTtcXHQvKiBvbGQgc2l6ZSBvZiBpbGlzdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfZGZsYWdzO1xcdFxcdC8qIGZsYWdzICovXFxuLVxcdF9fZnMzMlxcdFxcdGZzaF9xdW90YTtcXHRcXHQvKiBxdW90YSBsaW1pdCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbWF4aW5vZGU7XFx0XFx0LyogbWF4aW11bSBpbm9kZSBudW1iZXIgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX2lhdWlubztcXHRcXHQvKiBJQVUgaW5vZGUgKi9cXG4tXFx0X19mczMyXFx0XFx0ZnNoX2lsaXN0aW5vWzJdO1xcdC8qIGlsaXN0IGlub2RlcyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRmc2hfbGN0aW5vO1xcdFxcdC8qIGxpbmsgY291bnQgdGFibGUgaW5vZGUgKi9cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcXG4tXFx0ICogIGEpIGFyZSBub3Qgb2YgYW55IGludGVyZXN0IGZvciB1cywgYW5kXFxuLVxcdCAqICBiKSBkaWZmZXIgYSBsb3QgaW4gZGlmZmVyZW50IHZ4ZnMgdmVyc2lvbnMvcG9ydHNcXG4tXFx0ICovXFxuLX07XFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsNTMgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBwb3J0IGZvciAnaW1tZWQnIGlub2Rlcy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvcGFnZW1hcC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLVxcbi0vKipcXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXFxuLSAqIEBmcDpcXHRcXHRmaWxlIGNvbnRleHQgKHVudXNlZClcXG4tICogQGZvbGlvOlxcdGZvbGlvIHRvIGZpbGwgaW4uXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlXFxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICpcXG4tICogTG9ja2luZyBzdGF0dXM6XFxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19pbW1lZF9yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAgPSBWWEZTX0lOTyhmb2xpby1cXHUwMDNlbWFwcGluZy1cXHUwMDNlaG9zdCk7XFxuLVxcdHZvaWQgKnNyYyA9IHZpcC1cXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkICsgZm9saW9fcG9zKGZvbGlvKTtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsgaSsrKSB7XFxuLVxcdFxcdG1lbWNweV90b19wYWdlKGZvbGlvX3BhZ2UoZm9saW8sIGkpLCAwLCBzcmMsIFBBR0VfU0laRSk7XFxuLVxcdFxcdHNyYyArPSBQQUdFX1NJWkU7XFxuLVxcdH1cXG4tXFxuLVxcdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xcbi1cXHRmb2xpb191bmxvY2soZm9saW8pO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLS8qXFxuLSAqIEFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW1tZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxcbi0gKi9cXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7XFxuLVxcdC5yZWFkX2ZvbGlvID1cXHR2eGZzX2ltbWVkX3JlYWRfZm9saW8sXFxuLX07XFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDIxZmM5NGI5ODIwOWYuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsMzE0ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBpbm9kZSByb3V0aW5lcy5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbmFtZWkuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2lub2RlLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi1cXG4tXFxuLSNpZmRlZiBESUFHTk9TVElDXFxuLS8qXFxuLSAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuXFxuLSAqL1xcbi12b2lkXFxuLXZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXFxuLXtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcIlxcXFxuXFxcXG5cXFwiKTtcXG4tXFx0aWYgKGlubylcXG4tXFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcImR1bXBpbmcgdnhmcyBpbm9kZSAlbGRcXFxcblxcXCIsIGlubyk7XFxuLVxcdGVsc2VcXG4tXFx0XFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcImR1bXBpbmcgdW5rbm93biB2eGZzIGlub2RlXFxcXG5cXFwiKTtcXG4tXFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXFxcblxcXCIpO1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwibW9kZSBpcyAleFxcXFxuXFxcIiwgdmlwLVxcdTAwM2V2aWlfbW9kZSk7XFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJubGluazoldSwgdWlkOiV1LCBnaWQ6JXVcXFxcblxcXCIsXFxuLVxcdFxcdFxcdHZpcC1cXHUwMDNldmlpX25saW5rLCB2aXAtXFx1MDAzZXZpaV91aWQsIHZpcC1cXHUwMDNldmlpX2dpZCk7XFxuLVxcdHByaW50ayhLRVJOX0RFQlVHIFxcXCJzaXplOiVMeCwgYmxvY2tzOiV1XFxcXG5cXFwiLFxcbi1cXHRcXHRcXHR2aXAtXFx1MDAzZXZpaV9zaXplLCB2aXAtXFx1MDAzZXZpaV9ibG9ja3MpO1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwib3JndHlwZToldVxcXFxuXFxcIiwgdmlwLVxcdTAwM2V2aWlfb3JndHlwZSk7XFxuLX1cXG4tI2VuZGlmXFxuLVxcbi0vKipcXG4tICogdnhmc190cmFuc21vZCAtIG1vZGUgZm9yIGEgVnhGUyBpbm9kZVxcbi0gKiBAdmlwOlxcdFZ4RlMgaW5vZGVcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cXG4tICogIFZ4RlMgaW5vZGUgc3RydWN0dXJlLlxcbi0gKi9cXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxcbi12eGZzX3RyYW5zbW9kKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcClcXG4te1xcbi1cXHR1bW9kZV90XFx0XFx0XFx0cmV0ID0gdmlwLVxcdTAwM2V2aWlfbW9kZSBcXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcXG4tXFxuLVxcdGlmIChWWEZTX0lTRklGTyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRklGTztcXG4tXFx0aWYgKFZYRlNfSVNDSFIodmlwKSlcXG4tXFx0XFx0cmV0IHw9IFNfSUZDSFI7XFxuLVxcdGlmIChWWEZTX0lTRElSKHZpcCkpXFxuLVxcdFxcdHJldCB8PSBTX0lGRElSO1xcbi1cXHRpZiAoVlhGU19JU0JMSyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRkJMSztcXG4tXFx0aWYgKFZYRlNfSVNMTksodmlwKSlcXG4tXFx0XFx0cmV0IHw9IFNfSUZMTks7XFxuLVxcdGlmIChWWEZTX0lTUkVHKHZpcCkpXFxuLVxcdFxcdHJldCB8PSBTX0lGUkVHO1xcbi1cXHRpZiAoVlhGU19JU1NPQyh2aXApKVxcbi1cXHRcXHRyZXQgfD0gU19JRlNPQ0s7XFxuLVxcbi1cXHRyZXR1cm4gKHJldCk7XFxuLX1cXG4tXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXFxuLVxcdFxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXFxuLXtcXG4tXFx0c3RydWN0IGlub2RlICppbm9kZSA9IFxcdTAwMjZ2aXAtXFx1MDAzZXZmc19pbm9kZTtcXG4tXFxuLVxcdHZpcC1cXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX21vZGUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9ubGluayA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfbmxpbmspO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV91aWQgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX3VpZCk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfZ2lkKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfc2l6ZSA9IGZzNjRfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfc2l6ZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2F0aW1lID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9hdGltZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfYXV0aW1lKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfbXRpbWUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX210aW1lKTtcXG4tXFx0dmlwLVxcdTAwM2V2aWlfbXV0aW1lID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9tdXRpbWUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfY3RpbWUpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9jdXRpbWUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2N1dGltZSk7XFxuLVxcdHZpcC1cXHUwMDNldmlpX29yZ3R5cGUgPSBkaXAtXFx1MDAzZXZkaV9vcmd0eXBlO1xcbi1cXG4tXFx0dmlwLVxcdTAwM2V2aWlfYmxvY2tzID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXFx1MDAzZXZkaV9ibG9ja3MpO1xcbi1cXHR2aXAtXFx1MDAzZXZpaV9nZW4gPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2dlbik7XFxuLVxcbi1cXHRpZiAoVlhGU19JU0RJUih2aXApKVxcbi1cXHRcXHR2aXAtXFx1MDAzZXZpaV9kb3Rkb3QgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cXHUwMDNldmRpX2RvdGRvdCk7XFxuLVxcdGVsc2UgaWYgKCFWWEZTX0lTUkVHKHZpcCkgXFx1MDAyNlxcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcXG4tXFx0XFx0dmlwLVxcdTAwM2V2aWlfcmRldiA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVxcdTAwM2V2ZGlfcmRldik7XFxuLVxcbi1cXHQvKiBkb24ndCBlbmRpYW4gc3dhcCB0aGUgZmllbGRzIHRoYXQgZGlmZmVyIGJ5IG9yZ3R5cGUgKi9cXG4tXFx0bWVtY3B5KFxcdTAwMjZ2aXAtXFx1MDAzZXZpaV9vcmcsIFxcdTAwMjZkaXAtXFx1MDAzZXZkaV9vcmcsIHNpemVvZih2aXAtXFx1MDAzZXZpaV9vcmcpKTtcXG4tXFxuLVxcdGlub2RlLVxcdTAwM2VpX21vZGUgPSB2eGZzX3RyYW5zbW9kKHZpcCk7XFxuLVxcdGlfdWlkX3dyaXRlKGlub2RlLCAodWlkX3QpdmlwLVxcdTAwM2V2aWlfdWlkKTtcXG4tXFx0aV9naWRfd3JpdGUoaW5vZGUsIChnaWRfdCl2aXAtXFx1MDAzZXZpaV9naWQpO1xcbi1cXG4tXFx0c2V0X25saW5rKGlub2RlLCB2aXAtXFx1MDAzZXZpaV9ubGluayk7XFxuLVxcdGlub2RlLVxcdTAwM2VpX3NpemUgPSB2aXAtXFx1MDAzZXZpaV9zaXplO1xcbi1cXG4tXFx0aW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtXFx1MDAzZXZpaV9hdGltZSwgMCk7XFxuLVxcdGlub2RlX3NldF9jdGltZShpbm9kZSwgdmlwLVxcdTAwM2V2aWlfY3RpbWUsIDApO1xcbi1cXHRpbm9kZV9zZXRfbXRpbWUoaW5vZGUsIHZpcC1cXHUwMDNldmlpX210aW1lLCAwKTtcXG4tXFxuLVxcdGlub2RlLVxcdTAwM2VpX2Jsb2NrcyA9IHZpcC1cXHUwMDNldmlpX2Jsb2NrcztcXG4tXFx0aW5vZGUtXFx1MDAzZWlfZ2VuZXJhdGlvbiA9IHZpcC1cXHUwMDNldmlpX2dlbjtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYmxraWdldCAtIGZpbmQgaW5vZGUgYmFzZWQgb24gZXh0ZW50ICNcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtIHdlIHNlYXJjaCBpblxcbi0gKiBAZXh0ZW50OlxcdG51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaFxcbi0gKiBAaW5vOlxcdGlub2RlIG51bWJlciB0byBzZWFyY2hcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX2Jsa2lnZXQgc2VhcmNoZXMgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnlcXG4tICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50Llxcbi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxcbi0gKlxcbi0gKiBOT1RFOlxcbi0gKiAgV2hpbGUgX192eGZzX2lnZXQgdXNlcyB0aGUgcGFnZWNhY2hlIHZ4ZnNfYmxraWdldCB1c2VzIHRoZVxcbi0gKiAgYnVmZmVyY2FjaGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlIHRoZVxcbi0gKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50Llxcbi0gKi9cXG4tc3RydWN0IGlub2RlICpcXG4tdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgZXh0ZW50LCBpbm9fdCBpbm8pXFxuLXtcXG4tXFx0c3RydWN0IGJ1ZmZlcl9oZWFkXFx0XFx0KmJwO1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHRcXHRcXHQqaW5vZGU7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdFxcdGJsb2NrLCBvZmZzZXQ7XFxuLVxcbi1cXHRpbm9kZSA9IG5ld19pbm9kZShzYnApO1xcbi1cXHRpZiAoIWlub2RlKVxcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0aW5vZGUtXFx1MDAzZWlfaW5vID0gZ2V0X25leHRfaW5vKCk7XFxuLVxcbi1cXHRibG9jayA9IGV4dGVudCArICgoaW5vICogVlhGU19JU0laRSkgLyBzYnAtXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4tXFx0b2Zmc2V0ID0gKChpbm8gJSAoc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkUpO1xcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spO1xcbi1cXG4tXFx0aWYgKGJwIFxcdTAwMjZcXHUwMDI2IGJ1ZmZlcl9tYXBwZWQoYnApKSB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2lub2RlX2luZm9cXHQqdmlwID0gVlhGU19JTk8oaW5vZGUpO1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc19kaW5vZGVcXHQqZGlwO1xcbi1cXG4tXFx0XFx0ZGlwID0gKHN0cnVjdCB2eGZzX2Rpbm9kZSAqKShicC1cXHUwMDNlYl9kYXRhICsgb2Zmc2V0KTtcXG4tXFx0XFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xcbi1cXHRcXHR2aXAtXFx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXFx1MDAzZWFfb3BzID0gXFx1MDAyNnZ4ZnNfYW9wcztcXG4tI2lmZGVmIERJQUdOT1NUSUNcXG4tXFx0XFx0dnhmc19kdW1waSh2aXAsIGlubyk7XFxuLSNlbmRpZlxcbi1cXHRcXHRicmVsc2UoYnApO1xcbi1cXHRcXHRyZXR1cm4gaW5vZGU7XFxuLVxcdH1cXG4tXFxuLVxcdHByaW50ayhLRVJOX1dBUk5JTkcgXFxcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxcXFxuXFxcIiwgYmxvY2spO1xcbi1cXHRicmVsc2UoYnApO1xcbi1cXHRpcHV0KGlub2RlKTtcXG4tXFx0cmV0dXJuIE5VTEw7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiBfX3Z4ZnNfaWdldCAtIGdlbmVyaWMgZmluZCBpbm9kZSBmYWNpbGl0eVxcbi0gKiBAaWxpc3RwOlxcdFxcdGlub2RlIGxpc3RcXG4tICogQHZpcDpcXHRcXHRWeEZTIGlub2RlIHRvIGZpbGwgaW5cXG4tICogQGlubzpcXHRcXHRpbm9kZSBudW1iZXJcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbVxcbi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuXFxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGFuIGVycm9yIGNvZGUuXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLV9fdnhmc19pZ2V0KHN0cnVjdCBpbm9kZSAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXAsIGlub190IGlubylcXG4te1xcbi1cXHRzdHJ1Y3QgcGFnZVxcdFxcdFxcdCpwcDtcXG4tXFx0dV9sb25nXFx0XFx0XFx0XFx0b2Zmc2V0O1xcbi1cXG4tXFx0b2Zmc2V0ID0gKGlubyAlIChQQUdFX1NJWkUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFO1xcbi1cXHRwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLVxcdTAwM2VpX21hcHBpbmcsIGlubyAqIFZYRlNfSVNJWkUgLyBQQUdFX1NJWkUpO1xcbi1cXG4tXFx0aWYgKCFJU19FUlIocHApKSB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2Rpbm9kZVxcdCpkaXA7XFxuLVxcdFxcdGNhZGRyX3RcXHRcXHRcXHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcXG4tXFxuLVxcdFxcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpO1xcbi1cXHRcXHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXFx1MDAzZWlfc2IpLCB2aXAsIGRpcCk7XFxuLVxcdFxcdHZpcC1cXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHRcXHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcXG4tI2VuZGlmXFxuLVxcdFxcdHZ4ZnNfcHV0X3BhZ2UocHApO1xcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFx0fVxcbi1cXG4tXFx0cHJpbnRrKEtFUk5fV0FSTklORyBcXFwidnhmczogZXJyb3Igb24gcGFnZSAweCVwIGZvciBpbm9kZSAlbGRcXFxcblxcXCIsXFxuLVxcdFxcdHBwLCAodW5zaWduZWQgbG9uZylpbm8pO1xcbi1cXHRyZXR1cm4gUFRSX0VSUihwcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3N0aWdldCAtIGZpbmQgaW5vZGUgdXNpbmcgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdFxcbi0gKiBAc2JwOlxcdFZGUyBzdXBlcmJsb2NrXFxuLSAqIEBpbm86XFx0aW5vZGUgI1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogIEZpbmQgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicCB1c2luZ1xcbi0gKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC5cXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXFxuLSAqL1xcbi1zdHJ1Y3QgaW5vZGUgKlxcbi12eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKVxcbi17XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuLVxcdGludCBlcnJvcjtcXG4tXFxuLVxcdGlub2RlID0gbmV3X2lub2RlKHNicCk7XFxuLVxcdGlmICghaW5vZGUpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRpbm9kZS1cXHUwMDNlaV9pbm8gPSBnZXRfbmV4dF9pbm8oKTtcXG4tXFxuLVxcdGVycm9yID0gX192eGZzX2lnZXQoVlhGU19TQkkoc2JwKS1cXHUwMDNldnNpX3N0aWxpc3QsIFZYRlNfSU5PKGlub2RlKSwgaW5vKTtcXG4tXFx0aWYgKGVycm9yKSB7XFxuLVxcdFxcdGlwdXQoaW5vZGUpO1xcbi1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGlub2RlO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlXFxuLSAqIEBzYnA6XFx0dGhlIHN1cGVyYmxvY2sgdG8gZ2V0IHRoZSBpbm9kZSBmb3JcXG4tICogQGlubzpcXHR0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB0byBnZXRcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICB2eGZzX3JlYWRfaW5vZGUgY3JlYXRlcyBhbiBpbm9kZSwgcmVhZHMgdGhlIGRpc2sgaW5vZGUgZm9yIEBpbm8gYW5kIGZpbGxzXFxuLSAqICBpbiBhbGwgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBuZXcgaW5vZGUuXFxuLSAqL1xcbi1zdHJ1Y3QgaW5vZGUgKlxcbi12eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXFx0XFx0KnZpcDtcXG4tXFx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uc1xcdCphb3BzO1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKmlwO1xcbi1cXHRpbnQgZXJyb3I7XFxuLVxcbi1cXHRpcCA9IGlnZXRfbG9ja2VkKHNicCwgaW5vKTtcXG4tXFx0aWYgKCFpcClcXG4tXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuLVxcdGlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgXFx1MDAyNiBJX05FVykpXFxuLVxcdFxcdHJldHVybiBpcDtcXG4tXFxuLVxcdHZpcCA9IFZYRlNfSU5PKGlwKTtcXG4tXFx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVxcdTAwM2V2c2lfaWxpc3QsIHZpcCwgaW5vKTtcXG4tXFx0aWYgKGVycm9yKSB7XFxuLVxcdFxcdGlnZXRfZmFpbGVkKGlwKTtcXG4tXFx0XFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xcbi1cXHR9XFxuLVxcbi1cXHRpZiAoVlhGU19JU0lNTUVEKHZpcCkpXFxuLVxcdFxcdGFvcHMgPSBcXHUwMDI2dnhmc19pbW1lZF9hb3BzO1xcbi1cXHRlbHNlXFxuLVxcdFxcdGFvcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi1cXG4tXFx0aWYgKFNfSVNSRUcoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aXAtXFx1MDAzZWlfZm9wID0gXFx1MDAyNmdlbmVyaWNfcm9fZm9wcztcXG4tXFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBhb3BzO1xcbi1cXHR9IGVsc2UgaWYgKFNfSVNESVIoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aXAtXFx1MDAzZWlfb3AgPSBcXHUwMDI2dnhmc19kaXJfaW5vZGVfb3BzO1xcbi1cXHRcXHRpcC1cXHUwMDNlaV9mb3AgPSBcXHUwMDI2dnhmc19kaXJfb3BlcmF0aW9ucztcXG4tXFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBhb3BzO1xcbi1cXHR9IGVsc2UgaWYgKFNfSVNMTksoaXAtXFx1MDAzZWlfbW9kZSkpIHtcXG4tXFx0XFx0aWYgKCFWWEZTX0lTSU1NRUQodmlwKSkge1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9vcCA9IFxcdTAwMjZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucztcXG4tXFx0XFx0XFx0aW5vZGVfbm9oaWdobWVtKGlwKTtcXG4tXFx0XFx0XFx0aXAtXFx1MDAzZWlfbWFwcGluZy1cXHUwMDNlYV9vcHMgPSBcXHUwMDI2dnhmc19hb3BzO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9vcCA9IFxcdTAwMjZzaW1wbGVfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zO1xcbi1cXHRcXHRcXHRpcC1cXHUwMDNlaV9saW5rID0gdmlwLVxcdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQ7XFxuLVxcdFxcdFxcdG5kX3Rlcm1pbmF0ZV9saW5rKGlwLVxcdTAwM2VpX2xpbmssIGlwLVxcdTAwM2VpX3NpemUsXFxuLVxcdFxcdFxcdFxcdFxcdCAgc2l6ZW9mKHZpcC1cXHUwMDNldmlpX2ltbWVkLnZpX2ltbWVkKSAtIDEpO1xcbi1cXHRcXHR9XFxuLVxcdH0gZWxzZVxcbi1cXHRcXHRpbml0X3NwZWNpYWxfaW5vZGUoaXAsIGlwLVxcdTAwM2VpX21vZGUsIG9sZF9kZWNvZGVfZGV2KHZpcC1cXHUwMDNldmlpX3JkZXYpKTtcXG4tXFxuLVxcdHVubG9ja19uZXdfaW5vZGUoaXApO1xcbi1cXHRyZXR1cm4gaXA7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2V2aWN0X2lub2RlIC0gcmVtb3ZlIGlub2RlIGZyb20gbWFpbiBtZW1vcnlcXG4tICogQGlwOlxcdFxcdGlub2RlIHRvIGRpc2NhcmQuXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgdnhmc19ldmljdF9pbm9kZSgpIGlzIGNhbGxlZCBvbiB0aGUgZmluYWwgaXB1dCBhbmQgZnJlZXMgdGhlIHByaXZhdGVcXG4tICogIGlub2RlIGFyZWEuXFxuLSAqL1xcbi12b2lkXFxuLXZ4ZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppcClcXG4te1xcbi1cXHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19maW5hbChcXHUwMDI2aXAtXFx1MDAzZWlfZGF0YSk7XFxuLVxcdGNsZWFyX2lub2RlKGlwKTtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmggYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAxZTllMTM4ZDJiMzM4Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDE2OSArMCwwIEBAXFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cXG4tI2RlZmluZSBfVlhGU19JTk9ERV9IX1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHN0cnVjdHVyZS5cXG4tICpcXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXFxuLSAqIGlub2RlcyBvZiB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtLlxcbi0gKi9cXG4tXFxuLVxcbi0jZGVmaW5lIFZYRlNfSVNJWkVcXHRcXHQweDEwMFxcdFxcdC8qIElub2RlIHNpemUgKi9cXG4tXFxuLSNkZWZpbmUgVlhGU19OREFERFJcXHRcXHQxMFxcdFxcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cXG4tI2RlZmluZSBWWEZTX05JQUREUlxcdFxcdDJcXHRcXHQvKiBOdW1iZXIgb2YgaW5kaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cXG4tI2RlZmluZSBWWEZTX05JTU1FRFxcdFxcdDk2XFx0XFx0LyogU2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBpbiBpbm9kZSAqL1xcbi0jZGVmaW5lIFZYRlNfTlRZUEVEXFx0XFx0NlxcdFxcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXFxuLVxcbi0jZGVmaW5lIFZYRlNfVFlQRURfT0ZGU0VUTUFTS1xcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXFxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFTUFTS1xcdCgweEZGMDAwMDAwMDAwMDAwMDBVTEwpXFxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcXHQ1Nlxcbi1cXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXFxcXG4tXFx0KChzYnApLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgdnhmc190eXBlZCkpXFxuLVxcbi0vKlxcbi0gKiBQb3NzaWJsZSBleHRlbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgJVZYRlNfT1JHX1RZUEVEIGV4dGVudHMuXFxuLSAqL1xcbi1lbnVtIHtcXG4tXFx0VlhGU19UWVBFRF9JTkRJUkVDVFxcdFxcdD0gMSxcXG4tXFx0VlhGU19UWVBFRF9EQVRBXFx0XFx0XFx0PSAyLFxcbi1cXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcXHQ9IDMsXFxuLVxcdFZYRlNfVFlQRURfREFUQV9ERVY0XFx0XFx0PSA0LFxcbi19O1xcbi1cXG4tLypcXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfaW1tZWQge1xcbi1cXHRfX3U4XFx0XFx0XFx0dmlfaW1tZWRbVlhGU19OSU1NRURdO1xcbi19O1xcbi1cXG4tc3RydWN0IHZ4ZnNfZXh0NCB7XFxuLVxcdF9fZnMzMlxcdFxcdFxcdHZlNF9zcGFyZTtcXHRcXHQvKiA/PyAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRcXHR2ZTRfaW5kc2l6ZTtcXHRcXHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHRcXHR2ZTRfaW5kaXJbVlhGU19OSUFERFJdO1xcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cXG4tXFx0c3RydWN0IGRpcmVjdCB7XFx0XFx0XFx0XFx0XFx0LyogRGlyZWN0IGV4dGVudHMgKi9cXG4tXFx0XFx0X19mczMyXFx0XFx0ZXh0ZW50O1xcdFxcdFxcdC8qIEV4dGVudCBudW1iZXIgKi9cXG4tXFx0XFx0X19mczMyXFx0XFx0c2l6ZTtcXHRcXHRcXHQvKiBTaXplIG9mIGV4dGVudCAqL1xcbi1cXHR9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdO1xcbi19O1xcbi1cXG4tc3RydWN0IHZ4ZnNfdHlwZWQge1xcbi1cXHRfX2ZzNjRcXHRcXHR2dF9oZHI7XFx0XFx0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cXG4tXFx0X19mczMyXFx0XFx0dnRfYmxvY2s7XFx0LyogRXh0ZW50IGJsb2NrICovXFxuLVxcdF9fZnMzMlxcdFxcdHZ0X3NpemU7XFx0LyogU2l6ZSBpbiBibG9ja3MgKi9cXG4tfTtcXG4tXFxuLXN0cnVjdCB2eGZzX3R5cGVkX2RldjQge1xcbi1cXHRfX2ZzNjRcXHRcXHR2ZDRfaGRyO1xcdC8qIEhlYWRlciwgMHhUVE9PT09PT09PT09PT09POyBUPXR5cGUsTz1vZmZzICovXFxuLVxcdF9fZnM2NFxcdFxcdHZkNF9ibG9jaztcXHQvKiBFeHRlbnQgYmxvY2sgKi9cXG4tXFx0X19mczY0XFx0XFx0dmQ0X3NpemU7XFx0LyogU2l6ZSBpbiBibG9ja3MgKi9cXG4tXFx0X19mczMyXFx0XFx0dmQ0X2RldjtcXHQvKiBEZXZpY2UgSUQgKi9cXG4tXFx0X191OFxcdFxcdF9fcGFkMTtcXG4tfTtcXG4tXFxuLS8qXFxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2Rpbm9kZSB7XFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tb2RlO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfbmxpbms7XFx0LyogTGluayBjb3VudCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfdWlkO1xcdC8qIFVJRCAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfZ2lkO1xcdC8qIEdJRCAqL1xcbi1cXHRfX2ZzNjRcXHRcXHR2ZGlfc2l6ZTtcXHQvKiBJbm9kZSBzaXplIGluIGJ5dGVzICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9hdGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSBzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0dmRpX2F1dGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tdGltZTtcXHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gc2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9tdXRpbWU7XFx0LyogTGFzdCBtb2RpZnkgdGltZSAtIHVzZWMgKi9cXG4tXFx0X19mczMyXFx0XFx0dmRpX2N0aW1lO1xcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXFxuLVxcdF9fZnMzMlxcdFxcdHZkaV9jdXRpbWU7XFx0LyogQ3JlYXRlIHRpbWUgLSB1c2VjICovXFxuLVxcdF9fdThcXHRcXHR2ZGlfYWZsYWdzO1xcdC8qIEFsbG9jYXRpb24gZmxhZ3MgKi9cXG4tXFx0X191OFxcdFxcdHZkaV9vcmd0eXBlO1xcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXFxuLVxcdF9fZnMxNlxcdFxcdHZkaV9lb3BmbGFncztcXG4tXFx0X19mczMyXFx0XFx0dmRpX2VvcGRhdGE7XFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0X19mczMyXFx0XFx0XFx0cmRldjtcXG4tXFx0XFx0X19mczMyXFx0XFx0XFx0ZG90ZG90O1xcbi1cXHRcXHRzdHJ1Y3Qge1xcbi1cXHRcXHRcXHRfX3UzMlxcdFxcdHJlc2VydmVkO1xcbi1cXHRcXHRcXHRfX2ZzMzJcXHRcXHRmaXhleHRzaXplO1xcbi1cXHRcXHR9IGlfcmVndWxhcjtcXG4tXFx0XFx0c3RydWN0IHtcXG4tXFx0XFx0XFx0X19mczMyXFx0XFx0bWF0Y2hpbm87XFxuLVxcdFxcdFxcdF9fZnMzMlxcdFxcdGZzZXRpbmRleDtcXG4tXFx0XFx0fSBpX3Z4c3BlYztcXG4tXFx0XFx0X191NjRcXHRcXHRcXHRhbGlnbjtcXG4tXFx0fSB2ZGlfZnRhcmVhO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfYmxvY2tzO1xcdC8qIEhvdyBtdWNoIGJsb2NrcyBkb2VzIGlub2RlIG9jY3VweSAqL1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfZ2VuO1xcdC8qIElub2RlIGdlbmVyYXRpb24gKi9cXG4tXFx0X19mczY0XFx0XFx0dmRpX3ZlcnNpb247XFx0LyogVmVyc2lvbiAqL1xcbi1cXHR1bmlvbiB7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2ltbWVkXFx0aW1tZWQ7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX2V4dDRcXHRleHQ0O1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc190eXBlZFxcdHR5cGVkW1ZYRlNfTlRZUEVEXTtcXG4tXFx0fSB2ZGlfb3JnO1xcbi1cXHRfX2ZzMzJcXHRcXHR2ZGlfaWF0dHJpbm87XFxuLX07XFxuLVxcbi0jZGVmaW5lIHZkaV9yZGV2XFx0dmRpX2Z0YXJlYS5yZGV2XFxuLSNkZWZpbmUgdmRpX2RvdGRvdFxcdHZkaV9mdGFyZWEuZG90ZG90XFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcXHR2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZVxcbi0jZGVmaW5lIHZkaV9tYXRjaGlub1xcdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXFxuLSNkZWZpbmUgdmRpX2ZzZXRpbmRleFxcdHZkaV9mdGFyZWEudnhzcGVjLmZzZXRpbmRleFxcbi1cXG4tI2RlZmluZSB2ZGlfaW1tZWRcXHR2ZGlfb3JnLmltbWVkXFxuLSNkZWZpbmUgdmRpX2V4dDRcXHR2ZGlfb3JnLmV4dDRcXG4tI2RlZmluZSB2ZGlfdHlwZWRcXHR2ZGlfb3JnLnR5cGVkXFxuLVxcbi1cXG4tLypcXG4tICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xcbi1cXHRzdHJ1Y3QgaW5vZGVcXHR2ZnNfaW5vZGU7XFxuLVxcbi1cXHRfX3UzMlxcdFxcdHZpaV9tb2RlO1xcbi1cXHRfX3UzMlxcdFxcdHZpaV9ubGluaztcXHQvKiBMaW5rIGNvdW50ICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX3VpZDtcXHQvKiBVSUQgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfZ2lkO1xcdC8qIEdJRCAqL1xcbi1cXHRfX3U2NFxcdFxcdHZpaV9zaXplO1xcdC8qIElub2RlIHNpemUgaW4gYnl0ZXMgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfYXRpbWU7XFx0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2F1dGltZTtcXHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX210aW1lO1xcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSBzZWMgKi9cXG4tXFx0X191MzJcXHRcXHR2aWlfbXV0aW1lO1xcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2N0aW1lO1xcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2N1dGltZTtcXHQvKiBDcmVhdGUgdGltZSAtIHVzZWMgKi9cXG4tXFx0X191OFxcdFxcdHZpaV9vcmd0eXBlO1xcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0X191MzJcXHRcXHRcXHRyZGV2O1xcbi1cXHRcXHRfX3UzMlxcdFxcdFxcdGRvdGRvdDtcXG4tXFx0fSB2aWlfZnRhcmVhO1xcbi1cXHRfX3UzMlxcdFxcdHZpaV9ibG9ja3M7XFx0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXFxuLVxcdF9fdTMyXFx0XFx0dmlpX2dlbjtcXHQvKiBJbm9kZSBnZW5lcmF0aW9uICovXFxuLVxcdHVuaW9uIHtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfaW1tZWRcXHRpbW1lZDtcXG4tXFx0XFx0c3RydWN0IHZ4ZnNfZXh0NFxcdGV4dDQ7XFxuLVxcdFxcdHN0cnVjdCB2eGZzX3R5cGVkXFx0dHlwZWRbVlhGU19OVFlQRURdO1xcbi1cXHR9IHZpaV9vcmc7XFxuLX07XFxuLVxcbi0jZGVmaW5lIHZpaV9yZGV2XFx0dmlpX2Z0YXJlYS5yZGV2XFxuLSNkZWZpbmUgdmlpX2RvdGRvdFxcdHZpaV9mdGFyZWEuZG90ZG90XFxuLVxcbi0jZGVmaW5lIHZpaV9pbW1lZFxcdHZpaV9vcmcuaW1tZWRcXG4tI2RlZmluZSB2aWlfZXh0NFxcdHZpaV9vcmcuZXh0NFxcbi0jZGVmaW5lIHZpaV90eXBlZFxcdHZpaV9vcmcudHlwZWRcXG4tXFxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcXG4te1xcbi1cXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xcbi19XFxuLVxcbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwyNzMgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXFxuLSAqL1xcbi1cXG4tLypcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGxvb2t1cCBhbmQgb3RoZXIgZGlyZWN0b3J5IHJlbGF0ZWQgY29kZS5cXG4tICovXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZmlsZWxvY2suaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RpbWUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9oaWdobWVtLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2Rpci5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19pbm9kZS5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19leHRlcm4uaFxcXCJcXG4tXFxuLS8qXFxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cXG4tICovXFxuLSNkZWZpbmUgVlhGU19CTE9DS19QRVJfUEFHRShzYnApICAoKFBBR0VfU0laRSAvIChzYnApLVxcdTAwM2VzX2Jsb2Nrc2l6ZSkpXFxuLVxcbi1cXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlxcdHZ4ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHVuc2lnbmVkIGludCk7XFxuLXN0YXRpYyBpbnRcXHRcXHR2eGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopO1xcbi1cXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xcbi1cXHQubG9va3VwID1cXHRcXHR2eGZzX2xvb2t1cCxcXG4tfTtcXG4tXFxuLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdnhmc19kaXJfb3BlcmF0aW9ucyA9IHtcXG4tXFx0Lmxsc2VlayA9XFx0XFx0Z2VuZXJpY19maWxlX2xsc2VlayxcXG4tXFx0LnJlYWQgPVxcdFxcdFxcdGdlbmVyaWNfcmVhZF9kaXIsXFxuLVxcdC5pdGVyYXRlX3NoYXJlZCA9XFx0dnhmc19yZWFkZGlyLFxcbi1cXHQuc2V0bGVhc2UgPVxcdFxcdGdlbmVyaWNfc2V0bGVhc2UsXFxuLX07XFxuLVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfZmluZF9lbnRyeSAtIGZpbmQgYSBtYXRoaW5nIGRpcmVjdG9yeSBlbnRyeSBmb3IgYSBkZW50cnlcXG4tICogQGlwOlxcdFxcdGRpcmVjdG9yeSBpbm9kZVxcbi0gKiBAZHA6XFx0XFx0ZGVudHJ5IGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgYSBkaXJlY3RcXG4tICogQHBwcDpcXHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcXHUwMDI2c3RydWN0IHZ4ZnNfZGlyZWN0IGZvciB0aGUgVkZTIGRpcmVjdG9yeVxcbi0gKiAgIGNhY2hlIGVudHJ5IEBkcC4gIEBwcHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuXFxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxcbi0gKi9cXG4tc3RhdGljIHN0cnVjdCB2eGZzX2RpcmVjdCAqXFxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXFxuLXtcXG4tXFx0dV9sb25nIGJzaXplID0gaXAtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbi1cXHRjb25zdCBjaGFyICpuYW1lID0gZHAtXFx1MDAzZWRfbmFtZS5uYW1lO1xcbi1cXHRpbnQgbmFtZWxlbiA9IGRwLVxcdTAwM2VkX25hbWUubGVuO1xcbi1cXHRsb2ZmX3QgbGltaXQgPSBWWEZTX0RJUlJPVU5EKGlwLVxcdTAwM2VpX3NpemUpO1xcbi1cXHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlX2V4aXQgPSBOVUxMO1xcbi1cXHRsb2ZmX3QgcG9zID0gMDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqc2JpID0gVlhGU19TQkkoaXAtXFx1MDAzZWlfc2IpO1xcbi1cXG4tXFx0d2hpbGUgKHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwcDtcXG4tXFx0XFx0Y2hhciAqa2FkZHI7XFxuLVxcdFxcdGludCBwZ19vZnMgPSBwb3MgXFx1MDAyNiB+UEFHRV9NQVNLO1xcbi1cXG4tXFx0XFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVxcdTAwM2VpX21hcHBpbmcsIHBvcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4tXFx0XFx0aWYgKElTX0VSUihwcCkpXFxuLVxcdFxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRcXHRrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTtcXG4tXFxuLVxcdFxcdHdoaWxlIChwZ19vZnMgXFx1MDAzYyBQQUdFX1NJWkUgXFx1MDAyNlxcdTAwMjYgcG9zIFxcdTAwM2MgbGltaXQpIHtcXG4tXFx0XFx0XFx0c3RydWN0IHZ4ZnNfZGlyZWN0ICpkZTtcXG4tXFxuLVxcdFxcdFxcdGlmICgocG9zIFxcdTAwMjYgKGJzaXplIC0gMSkpIFxcdTAwM2MgNCkge1xcbi1cXHRcXHRcXHRcXHRzdHJ1Y3Qgdnhmc19kaXJibGsgKmRicCA9XFxuLVxcdFxcdFxcdFxcdFxcdChzdHJ1Y3Qgdnhmc19kaXJibGsgKilcXG4tXFx0XFx0XFx0XFx0XFx0IChrYWRkciArIChwb3MgXFx1MDAyNiB+UEFHRV9NQVNLKSk7XFxuLVxcdFxcdFxcdFxcdGludCBvdmVyaGVhZCA9IFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApO1xcbi1cXG4tXFx0XFx0XFx0XFx0cG9zICs9IG92ZXJoZWFkO1xcbi1cXHRcXHRcXHRcXHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0ZGUgPSAoc3RydWN0IHZ4ZnNfZGlyZWN0ICopKGthZGRyICsgcGdfb2ZzKTtcXG4tXFxuLVxcdFxcdFxcdGlmICghZGUtXFx1MDAzZWRfcmVjbGVuKSB7XFxuLVxcdFxcdFxcdFxcdHBvcyArPSBic2l6ZSAtIDE7XFxuLVxcdFxcdFxcdFxcdHBvcyBcXHUwMDI2PSB+KGJzaXplIC0gMSk7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cXHUwMDNlZF9yZWNsZW4pO1xcbi1cXHRcXHRcXHRwb3MgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cXHUwMDNlZF9yZWNsZW4pO1xcbi1cXHRcXHRcXHRpZiAoIWRlLVxcdTAwM2VkX2lubylcXG4tXFx0XFx0XFx0XFx0Y29udGludWU7XFxuLVxcbi1cXHRcXHRcXHRpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLVxcdTAwM2VkX25hbWVsZW4pKVxcbi1cXHRcXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0XFx0aWYgKCFtZW1jbXAobmFtZSwgZGUtXFx1MDAzZWRfbmFtZSwgbmFtZWxlbikpIHtcXG4tXFx0XFx0XFx0XFx0KnBwcCA9IHBwO1xcbi1cXHRcXHRcXHRcXHRkZV9leGl0ID0gZGU7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkZV9leGl0KVxcbi1cXHRcXHRcXHR2eGZzX3B1dF9wYWdlKHBwKTtcXG4tXFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIGRlX2V4aXQ7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2lub2RlX2J5X25hbWUgLSBmaW5kIGlub2RlIG51bWJlciBmb3IgZGVudHJ5XFxuLSAqIEBkaXA6XFx0ZGlyZWN0b3J5IHRvIHNlYXJjaCBpblxcbi0gKiBAZHA6XFx0XFx0ZGVudHJ5IHdlIHNlYXJjaCBmb3JcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mXFxuLSAqICAgdGhlIHBhdGggY29tcG9uZW50IGRlc2NyaWJlZCBieSBAZHAgaW4gQGRpcC5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIGlub2RlIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgaW5vX3RcXG4tdnhmc19pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkcClcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19kaXJlY3RcXHRcXHQqZGU7XFxuLVxcdHN0cnVjdCBwYWdlXFx0XFx0XFx0KnBwO1xcbi1cXHRpbm9fdFxcdFxcdFxcdFxcdGlubyA9IDA7XFxuLVxcbi1cXHRkZSA9IHZ4ZnNfZmluZF9lbnRyeShkaXAsIGRwLCBcXHUwMDI2cHApO1xcbi1cXHRpZiAoZGUpIHtcXG4tXFx0XFx0aW5vID0gZnMzMl90b19jcHUoVlhGU19TQkkoZGlwLVxcdTAwM2VpX3NiKSwgZGUtXFx1MDAzZWRfaW5vKTtcXG4tXFx0XFx0a3VubWFwKHBwKTtcXG4tXFx0XFx0cHV0X3BhZ2UocHApO1xcbi1cXHR9XFxuLVxcdFxcbi1cXHRyZXR1cm4gKGlubyk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2xvb2t1cCAtIGxvb2t1cCBwYXRobmFtZSBjb21wb25lbnRcXG4tICogQGRpcDpcXHRkaXIgaW4gd2hpY2ggd2UgbG9va3VwXFxuLSAqIEBkcDpcXHRcXHRkZW50cnkgd2UgbG9va3VwXFxuLSAqIEBmbGFnczpcXHRsb29rdXAgZmxhZ3NcXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19sb29rdXAgdHJpZXMgdG8gbG9va3VwIHRoZSBwYXRobmFtZSBjb21wb25lbnQgZGVzY3JpYmVkXFxuLSAqICAgYnkgQGRwIGluIEBkaXAuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgQSBOVUxMLXBvaW50ZXIgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZW5jb2RlZFxcbi0gKiAgIGluIHRoZSByZXR1cm4gcG9pbnRlci5cXG4tICovXFxuLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpcXG4tdnhmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXFxuLXtcXG4tXFx0c3RydWN0IGlub2RlXFx0XFx0KmlwID0gTlVMTDtcXG4tXFx0aW5vX3RcXHRcXHRcXHRpbm87XFxuLVxcdFxcdFxcdCBcXG4tXFx0aWYgKGRwLVxcdTAwM2VkX25hbWUubGVuIFxcdTAwM2UgVlhGU19OQU1FTEVOKVxcbi1cXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTtcXG4tXFx0XFx0XFx0XFx0IFxcbi1cXHRpbm8gPSB2eGZzX2lub2RlX2J5X25hbWUoZGlwLCBkcCk7XFxuLVxcdGlmIChpbm8pXFxuLVxcdFxcdGlwID0gdnhmc19pZ2V0KGRpcC1cXHUwMDNlaV9zYiwgaW5vKTtcXG4tXFx0cmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3JlYWRkaXIgLSByZWFkIGEgZGlyZWN0b3J5XFxuLSAqIEBmcDpcXHRcXHR0aGUgZGlyZWN0b3J5IHRvIHJlYWRcXG4tICogQGN0eDpcXHRkaXJfY29udGV4dCBmb3IgZmlsbGRpci9yZWFkZGlyXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfcmVhZGRpciBmaWxscyBAcmV0cCB3aXRoIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gQGZwXFxuLSAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8uXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLXZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbi17XFxuLVxcdHN0cnVjdCBpbm9kZVxcdFxcdCppcCA9IGZpbGVfaW5vZGUoZnApO1xcbi1cXHRzdHJ1Y3Qgc3VwZXJfYmxvY2tcXHQqc2JwID0gaXAtXFx1MDAzZWlfc2I7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdGJzaXplID0gc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4tXFx0bG9mZl90XFx0XFx0XFx0cG9zLCBsaW1pdDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdCpzYmkgPSBWWEZTX1NCSShzYnApO1xcbi1cXG4tXFx0aWYgKGN0eC1cXHUwMDNlcG9zID09IDApIHtcXG4tXFx0XFx0aWYgKCFkaXJfZW1pdF9kb3QoZnAsIGN0eCkpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjdHgtXFx1MDAzZXBvcysrO1xcbi1cXHR9XFxuLVxcdGlmIChjdHgtXFx1MDAzZXBvcyA9PSAxKSB7XFxuLVxcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBcXFwiLi5cXFwiLCAyLCBWWEZTX0lOTyhpcCktXFx1MDAzZXZpaV9kb3Rkb3QsIERUX0RJUikpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHRjdHgtXFx1MDAzZXBvcysrO1xcbi1cXHR9XFxuLVxcbi1cXHRsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXFx1MDAzZWlfc2l6ZSk7XFxuLVxcdGlmIChjdHgtXFx1MDAzZXBvcyBcXHUwMDNlIGxpbWl0KVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdHBvcyA9IGN0eC1cXHUwMDNlcG9zIFxcdTAwMjYgfjNMO1xcbi1cXG4tXFx0d2hpbGUgKHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdHN0cnVjdCBwYWdlICpwcDtcXG4tXFx0XFx0Y2hhciAqa2FkZHI7XFxuLVxcdFxcdGludCBwZ19vZnMgPSBwb3MgXFx1MDAyNiB+UEFHRV9NQVNLO1xcbi1cXHRcXHRpbnQgcmMgPSAwO1xcbi1cXG4tXFx0XFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVxcdTAwM2VpX21hcHBpbmcsIHBvcyBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4tXFx0XFx0aWYgKElTX0VSUihwcCkpXFxuLVxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXG4tXFx0XFx0a2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7XFxuLVxcbi1cXHRcXHR3aGlsZSAocGdfb2ZzIFxcdTAwM2MgUEFHRV9TSVpFIFxcdTAwMjZcXHUwMDI2IHBvcyBcXHUwMDNjIGxpbWl0KSB7XFxuLVxcdFxcdFxcdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGU7XFxuLVxcbi1cXHRcXHRcXHRpZiAoKHBvcyBcXHUwMDI2IChic2l6ZSAtIDEpKSBcXHUwMDNjIDQpIHtcXG4tXFx0XFx0XFx0XFx0c3RydWN0IHZ4ZnNfZGlyYmxrICpkYnAgPVxcbi1cXHRcXHRcXHRcXHRcXHQoc3RydWN0IHZ4ZnNfZGlyYmxrICopXFxuLVxcdFxcdFxcdFxcdFxcdCAoa2FkZHIgKyAocG9zIFxcdTAwMjYgflBBR0VfTUFTSykpO1xcbi1cXHRcXHRcXHRcXHRpbnQgb3ZlcmhlYWQgPSBWWEZTX0RJUkJMS09WKHNiaSwgZGJwKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHBvcyArPSBvdmVyaGVhZDtcXG4tXFx0XFx0XFx0XFx0cGdfb2ZzICs9IG92ZXJoZWFkO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XFxuLVxcbi1cXHRcXHRcXHRpZiAoIWRlLVxcdTAwM2VkX3JlY2xlbikge1xcbi1cXHRcXHRcXHRcXHRwb3MgKz0gYnNpemUgLSAxO1xcbi1cXHRcXHRcXHRcXHRwb3MgXFx1MDAyNj0gfihic2l6ZSAtIDEpO1xcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0cGdfb2ZzICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfcmVjbGVuKTtcXG4tXFx0XFx0XFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfcmVjbGVuKTtcXG4tXFx0XFx0XFx0aWYgKCFkZS1cXHUwMDNlZF9pbm8pXFxuLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0XFx0cmMgPSBkaXJfZW1pdChjdHgsIGRlLVxcdTAwM2VkX25hbWUsXFxuLVxcdFxcdFxcdFxcdFxcdGZzMTZfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfbmFtZWxlbiksXFxuLVxcdFxcdFxcdFxcdFxcdGZzMzJfdG9fY3B1KHNiaSwgZGUtXFx1MDAzZWRfaW5vKSxcXG4tXFx0XFx0XFx0XFx0XFx0RFRfVU5LTk9XTik7XFxuLVxcdFxcdFxcdGlmICghcmMpIHtcXG4tXFx0XFx0XFx0XFx0LyogdGhlIGRpciBlbnRyeSB3YXMgbm90IHJlYWQsIGZpeCBwb3MuICovXFxuLVxcdFxcdFxcdFxcdHBvcyAtPSBmczE2X3RvX2NwdShzYmksIGRlLVxcdTAwM2VkX3JlY2xlbik7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdH1cXG4tXFx0XFx0dnhmc19wdXRfcGFnZShwcCk7XFxuLVxcdFxcdGlmICghcmMpXFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHR9XFxuLVxcbi1cXHRjdHgtXFx1MDAzZXBvcyA9IHBvcyB8IDI7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiAwO1xcbi19XFxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jXFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMjNmMzUxODdjMjg5Ni4uMDAwMDAwMDAwMDAwMFxcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmNcXG4rKysgL2Rldi9udWxsXFxuQEAgLTEsMTA1ICswLDAgQEBcXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbi0vKlxcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cXG4tICovXFxuLVxcbi0vKiBcXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIG9iamVjdCBsb2NhdGlvbiB0YWJsZSBzdXBwb3J0Llxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWZmZXJfaGVhZC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuLVxcbi0jaW5jbHVkZSBcXFwidnhmcy5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19vbHQuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkXFxuLXZ4ZnNfZ2V0X2ZzaGVhZChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKmZzaHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApXFxuLXtcXG4tXFx0QlVHX09OKGluZnAtXFx1MDAzZXZzaV9mc2hpbm8pO1xcbi1cXHRpbmZwLVxcdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cXHUwMDNlb2x0X2ZzaW5vWzBdKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB2b2lkXFxuLXZ4ZnNfZ2V0X2lsaXN0KHN0cnVjdCB2eGZzX29sdGlsaXN0ICppbGlzdHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApXFxuLXtcXG4tXFx0QlVHX09OKGluZnAtXFx1MDAzZXZzaV9pZXh0KTtcXG4tXFx0aW5mcC1cXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXFx1MDAzZW9sdF9pZXh0WzBdKTtcXG4tfVxcbi1cXG4tc3RhdGljIGlubGluZSB1X2xvbmdcXG4tdnhmc19vYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGRhZGRyX3QgYmxvY2ssIHVfbG9uZyBic2l6ZSlcXG4te1xcbi1cXHRCVUdfT04oc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcXG4tXFx0cmV0dXJuIChibG9jayAqIChzYnAtXFx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcXG4tfVxcbi1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX3JlYWRfb2x0IC0gcmVhZCBvbHRcXG4tICogQHNicDpcXHRzdXBlcmJsb2NrIG9mIHRoZSBmaWxlc3lzdGVtXFxuLSAqIEBic2l6ZTpcXHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXFxuLSAqICAgaW50byBtYWluIG1lbW9yeSBhbmQgZG9lcyBzb21lIGJhc2ljIHNldHVwLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXFxuLSAqL1xcbi1pbnRcXG4tdnhmc19yZWFkX29sdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGJzaXplKVxcbi17XFxuLVxcdHN0cnVjdCB2eGZzX3NiX2luZm9cXHQqaW5mcCA9IFZYRlNfU0JJKHNicCk7XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdCpicDtcXG4tXFx0c3RydWN0IHZ4ZnNfb2x0XFx0XFx0Km9wO1xcbi1cXHRjaGFyXFx0XFx0XFx0Km9hZGRyLCAqZWFkZHI7XFxuLVxcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgdnhmc19vYmxvY2soc2JwLCBpbmZwLVxcdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xcbi1cXHRpZiAoIWJwIHx8ICFicC1cXHUwMDNlYl9kYXRhKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cXHUwMDNlYl9kYXRhO1xcbi1cXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXFx1MDAzZW9sdF9tYWdpYykgIT0gVlhGU19PTFRfTUFHSUMpIHtcXG4tXFx0XFx0cHJpbnRrKEtFUk5fTk9USUNFIFxcXCJ2eGZzOiBpdmFsaWQgb2x0IG1hZ2ljIG51bWJlclxcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogSXQgaXMgaW4gdGhlb3J5IHBvc3NpYmxlIHRoYXQgdnNpX29sdHNpemUgaXMgXFx1MDAzZSAxLlxcbi1cXHQgKiBJJ3ZlIG5vdCBzZWVuIGFueSBzdWNoIGZpbGVzeXN0ZW0geWV0IGFuZCBJJ20gbGF6eS4uICAtLWhjaFxcbi1cXHQgKi9cXG4tXFx0aWYgKGluZnAtXFx1MDAzZXZzaV9vbHRzaXplIFxcdTAwM2UgMSkge1xcbi1cXHRcXHRwcmludGsoS0VSTl9OT1RJQ0UgXFxcInZ4ZnM6IG9sdHNpemUgXFx1MDAzZSAxIGRldGVjdGVkLlxcXFxuXFxcIik7XFxuLVxcdFxcdHByaW50ayhLRVJOX05PVElDRSBcXFwidnhmczogcGxlYXNlIG5vdGlmeSBoY2hAaW5mcmFkZWFkLm9yZ1xcXFxuXFxcIik7XFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0fVxcbi1cXG4tXFx0b2FkZHIgPSBicC1cXHUwMDNlYl9kYXRhICsgZnMzMl90b19jcHUoaW5mcCwgb3AtXFx1MDAzZW9sdF9zaXplKTtcXG4tXFx0ZWFkZHIgPSBicC1cXHUwMDNlYl9kYXRhICsgKGluZnAtXFx1MDAzZXZzaV9vbHRzaXplICogc2JwLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuLVxcbi1cXHR3aGlsZSAob2FkZHIgXFx1MDAzYyBlYWRkcikge1xcbi1cXHRcXHRzdHJ1Y3Qgdnhmc19vbHRjb21tb25cXHQqb2NwID1cXG4tXFx0XFx0XFx0KHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyO1xcbi1cXHRcXHRcXG4tXFx0XFx0c3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtXFx1MDAzZW9sdF90eXBlKSkge1xcbi1cXHRcXHRjYXNlIFZYRlNfT0xUX0ZTSEVBRDpcXG4tXFx0XFx0XFx0dnhmc19nZXRfZnNoZWFkKChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKilvYWRkciwgaW5mcCk7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRjYXNlIFZYRlNfT0xUX0lMSVNUOlxcbi1cXHRcXHRcXHR2eGZzX2dldF9pbGlzdCgoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKilvYWRkciwgaW5mcCk7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRvYWRkciArPSBmczMyX3RvX2NwdShpbmZwLCBvY3AtXFx1MDAzZW9sdF9zaXplKTtcXG4tXFx0fVxcbi1cXG4tXFx0YnJlbHNlKGJwKTtcXG4tXFx0cmV0dXJuIChpbmZwLVxcdTAwM2V2c2lfZnNoaW5vIFxcdTAwMjZcXHUwMDI2IGluZnAtXFx1MDAzZXZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMO1xcbi1cXG4tZmFpbDpcXG4tXFx0YnJlbHNlKGJwKTtcXG4tXFx0cmV0dXJuIC1FSU5WQUw7XFxuLX1cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCA1M2FmYmEwOGQ2MTdmLi4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuaFxcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxMjAgKzAsMCBAQFxcbi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cXG4tI2RlZmluZSBfVlhGU19PTFRfSF9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBPYmplY3QgTG9jYXRpb24gVGFibGUgZGF0YSBzdHJ1Y3R1cmVzLlxcbi0gKlxcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxcbi0gKiBieSB0aGUgVmVyaXRhcyBGaWxlc3lzdGVtIHZlcnNpb24gMiBhbmQgbmV3ZXIuXFxuLSAqL1xcbi1cXG4tXFxuLS8qXFxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVxcdTAwM2VvbHRfbWFnaWMpLlxcbi0gKi9cXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1xcdFxcdDB4YTUwNEZDRjVcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgT0xUIGVudHJ5IHR5cGVzLlxcbi0gKi9cXG4tZW51bSB7XFxuLVxcdFZYRlNfT0xUX0ZSRUVcXHQ9IDEsXFxuLVxcdFZYRlNfT0xUX0ZTSEVBRFxcdD0gMixcXG4tXFx0VlhGU19PTFRfQ1VUXFx0PSAzLFxcbi1cXHRWWEZTX09MVF9JTElTVFxcdD0gNCxcXG4tXFx0VlhGU19PTFRfREVWXFx0PSA1LFxcbi1cXHRWWEZTX09MVF9TQlxcdD0gNlxcbi19O1xcbi1cXG4tLypcXG4tICogVnhGUyBPTFQgaGVhZGVyLlxcbi0gKlxcbi0gKiBUaGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIGhlYWRlciBpcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoXFxuLSAqIE9MVCBleHRlbnQuICBJdCBpcyB1c2VkIHRvIGZpbmcgY2VydGFpbiBmaWxlc3lzdGVtLXdpZGUgbWV0YWRhdGEsIGUuZy5cXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cXG4tICovXFxuLXN0cnVjdCB2eGZzX29sdCB7XFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9tYWdpYztcXHQvKiBtYWdpYyBudW1iZXJcXHRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfc2l6ZTtcXHQvKiBzaXplIG9mIHRoaXMgZW50cnlcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfY2hlY2tzdW07XFx0LyogY2hlY2tzdW0gb2YgZXh0ZW50XFx0XFx0Ki9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDE7XFx0LyogPz8/XFx0XFx0XFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X210aW1lO1xcdC8qIHRpbWUgb2YgbGFzdCBtb2QuIChzZWMpXFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X211dGltZTtcXHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAodXNlYylcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdG90ZnJlZTtcXHQvKiBmcmVlIHNwYWNlIGluIE9MVCBleHRlbnRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZXh0ZW50c1syXTtcXHQvKiBhZGRyIG9mIHRoaXMgZXh0ZW50LCByZXBsaWNhXFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2VzaXplO1xcdC8qIHNpemUgb2YgdGhpcyBleHRlbnRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfbmV4dFsyXTsgICAgLyogYWRkciBvZiBuZXh0IGV4dGVudCwgcmVwbGljYVxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9uc2l6ZTtcXHQvKiBzaXplIG9mIG5leHQgZXh0ZW50XFx0XFx0Ki9cXG4tXFx0X191MzJcXHRcXHRfX3VudXNlZDI7XFx0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XFx0Ki9cXG4tfTtcXG4tXFxuLS8qXFxuLSAqIFZ4RlMgY29tbW9uIE9MVCBlbnRyeSAob24gZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRjb21tb24ge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGZyZWUgT0xUIGVudHJ5IChvbiBkaXNrKS5cXG4tICovXFxuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2ZzaXplO1xcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBWeEZTIGluaXRpYWwtaW5vZGUgbGlzdCAob24gZGlzaykuXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRpbGlzdCB7XFxuLVxcdF9fZnMzMlxcdG9sdF90eXBlO1xcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRvbHRfc2l6ZTtcXHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X2lleHRbMl07XFx0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXFx0Ki9cXG4tfTtcXG4tXFxuLS8qXFxuLSAqIEN1cnJlbnQgVXNhZ2UgVGFibGUgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRjdXQge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9jdXRpbm87XFx0LyogaW5vZGUgb2YgY3VycmVudCB1c2FnZSB0YWJsZVxcdCovXFxuLVxcdF9fdThcXHRcXHRfX3BhZDtcXHRcXHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblxcdFxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfb2x0c2Ige1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXFx0XFx0Ki9cXG4tXFx0X19mczMyXFx0XFx0b2x0X3NpemU7XFx0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zYmlubztcXHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcXHQqL1xcbi1cXHRfX3UzMlxcdFxcdF9fdW51c2VkMTtcXHQvKiA/Pz9cXHRcXHRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfbG9naW5vWzJdO1xcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfb2x0aW5vWzJdO1xcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVxcdCovXFxuLX07XFxuLVxcbi0vKlxcbi0gKiBJbm9kZSBjb250YWluaW5nIGRldmljZSBjb25maWd1cmF0aW9uICsgaXQncyByZXBsaWNhIFxcbi0gKi9cXG4tc3RydWN0IHZ4ZnNfb2x0ZGV2IHtcXG4tXFx0X19mczMyXFx0XFx0b2x0X3R5cGU7XFx0LyogdHlwZSBvZiB0aGlzIHJlY29yZFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zaXplO1xcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZGV2aW5vWzJdO1xcdC8qIGlub2RlIG9mIGRldmljZSBjb25maWcgZmlsZXNcXHQqL1xcbi19O1xcbi1cXG4tLypcXG4tICogRmlsZXNldCBoZWFkZXIgXFxuLSAqL1xcbi1zdHJ1Y3Qgdnhmc19vbHRmc2hlYWQge1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfdHlwZTtcXHQvKiB0eXBlIG51bWJlclxcdFxcdFxcdCovXFxuLVxcdF9fZnMzMlxcdFxcdG9sdF9zaXplO1xcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcXHRcXHQqL1xcbi1cXHRfX2ZzMzJcXHRcXHRvbHRfZnNpbm9bMl07ICAgLyogaW5vZGVzIG9mIGZpbGVzZXQgaGVhZGVyXFx0Ki9cXG4tfTtcXG4tXFxuLSNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi9cXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IGY0Mzk4NzdlYTZlODAuLjAwMDAwMDAwMDAwMDBcXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xcbisrKyAvZGV2L251bGxcXG5AQCAtMSwxNTIgKzAsMCBAQFxcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuLS8qXFxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxcbi0gKi9cXG4tXFxuLS8qXFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXFxuLSAqL1xcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2V4dGVybi5oXFxcIlxcbi1cXG4tXFxuLXN0YXRpYyBpbnRcXHRcXHR2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKiwgc3RydWN0IGZvbGlvICopO1xcbi1zdGF0aWMgc2VjdG9yX3RcXHRcXHR2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QpO1xcbi1cXG4tY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2FvcHMgPSB7XFxuLVxcdC5yZWFkX2ZvbGlvID1cXHRcXHR2eGZzX3JlYWRfZm9saW8sXFxuLVxcdC5ibWFwID1cXHRcXHRcXHR2eGZzX2JtYXAsXFxuLX07XFxuLVxcbi1pbmxpbmUgdm9pZFxcbi12eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwcClcXG4te1xcbi1cXHRrdW5tYXAocHApO1xcbi1cXHRwdXRfcGFnZShwcCk7XFxuLX1cXG4tXFxuLS8qKlxcbi0gKiB2eGZzX2dldF9wYWdlIC0gcmVhZCBhIHBhZ2UgaW50byBtZW1vcnkuXFxuLSAqIEBtYXBwaW5nOlxcdG1hcHBpbmcgdG8gcmVhZCBmcm9tXFxuLSAqIEBuOlxcdFxcdHBhZ2UgbnVtYmVyXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIHZ4ZnNfZ2V0X3BhZ2UgcmVhZHMgdGhlIEBuIHRoIHBhZ2Ugb2YgQGlwIGludG8gdGhlIHBhZ2VjYWNoZS5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBUaGUgd2FudGVkIHBhZ2Ugb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci5cXG4tICovXFxuLXN0cnVjdCBwYWdlICpcXG4tdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdV9sb25nIG4pXFxuLXtcXG4tXFx0c3RydWN0IHBhZ2UgKlxcdFxcdFxcdHBwO1xcbi1cXG4tXFx0cHAgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBuLCBOVUxMKTtcXG4tXFxuLVxcdGlmICghSVNfRVJSKHBwKSkge1xcbi1cXHRcXHRrbWFwKHBwKTtcXG4tXFx0XFx0LyoqIGlmICghUGFnZUNoZWNrZWQocHApKSAqKi9cXG4tXFx0XFx0XFx0LyoqIHZ4ZnNfY2hlY2tfcGFnZShwcCk7ICoqL1xcbi1cXHR9XFxuLVxcdFxcbi1cXHRyZXR1cm4gKHBwKTtcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfYnJlYWQgLSByZWFkIGJ1ZmZlciBmb3IgYSBnaXZlIGlub2RlLGJsb2NrIHR1cGxlXFxuLSAqIEBpcDpcXHRcXHRpbm9kZVxcbi0gKiBAYmxvY2s6XFx0bG9naWNhbCBibG9ja1xcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mXFxuLSAqICAgQGlwIGludG8gdGhlIGJ1ZmZlcmNhY2hlLlxcbi0gKlxcbi0gKiBSZXR1cm5zOlxcbi0gKiAgIFRoZSByZXN1bHRpbmcgXFx1MDAyNnN0cnVjdCBidWZmZXJfaGVhZC5cXG4tICovXFxuLXN0cnVjdCBidWZmZXJfaGVhZCAqXFxuLXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICppcCwgaW50IGJsb2NrKVxcbi17XFxuLVxcdHN0cnVjdCBidWZmZXJfaGVhZFxcdCpicDtcXG4tXFx0ZGFkZHJfdFxcdFxcdFxcdHBibG9jaztcXG4tXFxuLVxcdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGJsb2NrKTtcXG4tXFx0YnAgPSBzYl9icmVhZChpcC1cXHUwMDNlaV9zYiwgcGJsb2NrKTtcXG4tXFxuLVxcdHJldHVybiAoYnApO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19nZXRibGsgLSBsb2NhdGUgYnVmZmVyIGZvciBnaXZlbiBpbm9kZSxibG9jayB0dXBsZVxcbi0gKiBAaXA6XFx0XFx0aW5vZGVcXG4tICogQGlibG9jazpcXHRsb2dpY2FsIGJsb2NrXFxuLSAqIEBicDpcXHRcXHRidWZmZXIgc2tlbGV0b25cXG4tICogQGNyZWF0ZTpcXHQlVFJVRSBpZiBibG9ja3MgbWF5IGJlIG5ld2x5IGFsbG9jYXRlZC5cXG4tICpcXG4tICogRGVzY3JpcHRpb246XFxuLSAqICAgVGhlIHZ4ZnNfZ2V0YmxrIGZ1bmN0aW9uIGZpbGxzIEBicCB3aXRoIHRoZSByaWdodCBwaHlzaWNhbFxcbi0gKiAgIGJsb2NrIGFuZCBkZXZpY2UgbnVtYmVyIHRvIHBlcmZvcm0gYSBsb3dsZXZlbCByZWFkL3dyaXRlIG9uXFxuLSAqICAgaXQuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdiBlcnJvciBjb2RlICgtRUlPKS5cXG4tICovXFxuLXN0YXRpYyBpbnRcXG4tdnhmc19nZXRibGsoc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgaWJsb2NrLFxcbi1cXHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpicCwgaW50IGNyZWF0ZSlcXG4te1xcbi1cXHRkYWRkcl90XFx0XFx0XFx0cGJsb2NrO1xcbi1cXG4tXFx0cGJsb2NrID0gdnhmc19ibWFwMShpcCwgaWJsb2NrKTtcXG4tXFx0aWYgKHBibG9jayAhPSAwKSB7XFxuLVxcdFxcdG1hcF9iaChicCwgaXAtXFx1MDAzZWlfc2IsIHBibG9jayk7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gLUVJTztcXG4tfVxcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcmVhZF9mb2xpbyAtIHJlYWQgb25lIHBhZ2Ugc3luY2hyb25vdXNseSBpbnRvIHRoZSBwYWdlY2FjaGVcXG4tICogQGZpbGU6XFx0ZmlsZSBjb250ZXh0ICh1bnVzZWQpXFxuLSAqIEBmb2xpbzpcXHRmb2xpbyB0byBmaWxsIGluLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGVcXG4tICogICBwYWdlY2FjaGUuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cXG4tICpcXG4tICogTG9ja2luZyBzdGF0dXM6XFxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi17XFxuLVxcdHJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTtcXG4tfVxcbi0gXFxuLS8qKlxcbi0gKiB2eGZzX2JtYXAgLSBwZXJmb3JtIGxvZ2ljYWwgdG8gcGh5c2ljYWwgYmxvY2sgbWFwcGluZ1xcbi0gKiBAbWFwcGluZzpcXHRsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlXFxuLSAqIEBibG9jazpcXHRsb2dpY2FsIGJsb2NrIChyZWxhdGl2ZSB0byBAbWFwcGluZykuXFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIFZ4ZnNfYm1hcCBmaW5kIG91dCB0aGUgY29ycmVzcG9uZGluZyBwaHNpY2FsIGJsb2NrIHRvIHRoZVxcbi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci5cXG4tICpcXG4tICogUmV0dXJuczpcXG4tICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxcbi0gKlxcbi0gKiBMb2NraW5nIHN0YXR1czpcXG4tICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC5cXG4tICovXFxuLXN0YXRpYyBzZWN0b3JfdFxcbi12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKVxcbi17XFxuLVxcdHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTtcXG4tfVxcbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmNcXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCBkN2Q4NDdkNzVjM2Q1Li4wMDAwMDAwMDAwMDAwXFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXFxuKysrIC9kZXYvbnVsbFxcbkBAIC0xLDM0NyArMCwwIEBAXFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4tLypcXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXFxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcXG4tICovXFxuLVxcbi0vKlxcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxcbi0gKi9cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2luaXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Jsa2Rldi5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N0YXQuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Zmcy5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi1cXG4tI2luY2x1ZGUgXFxcInZ4ZnMuaFxcXCJcXG4tI2luY2x1ZGUgXFxcInZ4ZnNfZXh0ZXJuLmhcXFwiXFxuLSNpbmNsdWRlIFxcXCJ2eGZzX2Rpci5oXFxcIlxcbi0jaW5jbHVkZSBcXFwidnhmc19pbm9kZS5oXFxcIlxcbi1cXG4tXFxuLU1PRFVMRV9BVVRIT1IoXFxcIkNocmlzdG9waCBIZWxsd2lnLCBLcnp5c3p0b2YgQmxhc3prb3dza2lcXFwiKTtcXG4tTU9EVUxFX0RFU0NSSVBUSU9OKFxcXCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlclxcXCIpO1xcbi1NT0RVTEVfTElDRU5TRShcXFwiRHVhbCBCU0QvR1BMXFxcIik7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwO1xcbi1cXG4tLyoqXFxuLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlc1xcbi0gKiBAc2JwOlxcdFZGUyBzdXBlcmJsb2NrLlxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX3B1dF9zdXBlciBmcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgQHNicFxcbi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC5cXG4tICovXFxuLVxcbi1zdGF0aWMgdm9pZFxcbi12eGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicClcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0KmluZnAgPSBWWEZTX1NCSShzYnApO1xcbi1cXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9pbGlzdCk7XFxuLVxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpO1xcbi1cXG4tXFx0YnJlbHNlKGluZnAtXFx1MDAzZXZzaV9icCk7XFxuLVxcdGtmcmVlKGluZnApO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19zdGF0ZnMgLSBnZXQgZmlsZXN5c3RlbSBpbmZvcm1hdGlvblxcbi0gKiBAZGVudHJ5OlxcdFZGUyBkZW50cnkgdG8gbG9jYXRlIHN1cGVyYmxvY2tcXG4tICogQGJ1ZnA6XFx0b3V0cHV0IGJ1ZmZlclxcbi0gKlxcbi0gKiBEZXNjcmlwdGlvbjpcXG4tICogICB2eGZzX3N0YXRmcyBmaWxscyB0aGUgc3RhdGZzIGJ1ZmZlciBAYnVmcCB3aXRoIGluZm9ybWF0aW9uXFxuLSAqICAgYWJvdXQgdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IEBkZW50cnkuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgWmVyby5cXG4tICpcXG4tICogTG9ja2luZzpcXG4tICogICBObyBsb2NrcyBoZWxkLlxcbi0gKlxcbi0gKiBOb3RlczpcXG4tICogICBUaGlzIGlzIGV2ZXJ5dGhpbmcgYnV0IGNvbXBsZXRlLi4uXFxuLSAqL1xcbi1zdGF0aWMgaW50XFxuLXZ4ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZnApXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mb1xcdFxcdCppbmZwID0gVlhGU19TQkkoZGVudHJ5LVxcdTAwM2VkX3NiKTtcXG4tXFx0c3RydWN0IHZ4ZnNfc2IgKnJhd19zYiA9IGluZnAtXFx1MDAzZXZzaV9yYXc7XFxuLVxcdHU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihkZW50cnktXFx1MDAzZWRfc2ItXFx1MDAzZXNfYmRldi1cXHUwMDNlYmRfZGV2KTtcXG4tXFxuLVxcdGJ1ZnAtXFx1MDAzZWZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7XFxuLVxcdGJ1ZnAtXFx1MDAzZWZfYnNpemUgPSBkZW50cnktXFx1MDAzZWRfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbi1cXHRidWZwLVxcdTAwM2VmX2Jsb2NrcyA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cXHUwMDNldnNfZHNpemUpO1xcbi1cXHRidWZwLVxcdTAwM2VmX2JmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVxcdTAwM2V2c19mcmVlKTtcXG4tXFx0YnVmcC1cXHUwMDNlZl9iYXZhaWwgPSAwO1xcbi1cXHRidWZwLVxcdTAwM2VmX2ZpbGVzID0gMDtcXG4tXFx0YnVmcC1cXHUwMDNlZl9mZnJlZSA9IGZzMzJfdG9fY3B1KGluZnAsIHJhd19zYi1cXHUwMDNldnNfaWZyZWUpO1xcbi1cXHRidWZwLVxcdTAwM2VmX2ZzaWQgPSB1NjRfdG9fZnNpZChpZCk7XFxuLVxcdGJ1ZnAtXFx1MDAzZWZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjtcXG4tXFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi1zdGF0aWMgaW50IHZ4ZnNfcmVjb25maWd1cmUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbi17XFxuLVxcdHN5bmNfZmlsZXN5c3RlbShmYy1cXHUwMDNlcm9vdC1cXHUwMDNlZF9zYik7XFxuLVxcdGZjLVxcdTAwM2VzYl9mbGFncyB8PSBTQl9SRE9OTFk7XFxuLVxcdHJldHVybiAwO1xcbi19XFxuLVxcbi1zdGF0aWMgc3RydWN0IGlub2RlICp2eGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuLXtcXG4tXFx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmk7XFxuLVxcbi1cXHR2aSA9IGFsbG9jX2lub2RlX3NiKHNiLCB2eGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XFxuLVxcdGlmICghdmkpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRpbm9kZV9pbml0X29uY2UoXFx1MDAyNnZpLVxcdTAwM2V2ZnNfaW5vZGUpO1xcbi1cXHRyZXR1cm4gXFx1MDAyNnZpLVxcdTAwM2V2ZnNfaW5vZGU7XFxuLX1cXG4tXFxuLXN0YXRpYyB2b2lkIHZ4ZnNfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi17XFxuLVxcdGttZW1fY2FjaGVfZnJlZSh2eGZzX2lub2RlX2NhY2hlcCwgVlhGU19JTk8oaW5vZGUpKTtcXG4tfVxcbi1cXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHZ4ZnNfc3VwZXJfb3BzID0ge1xcbi1cXHQuYWxsb2NfaW5vZGVcXHRcXHQ9IHZ4ZnNfYWxsb2NfaW5vZGUsXFxuLVxcdC5mcmVlX2lub2RlXFx0XFx0PSB2eGZzX2ZyZWVfaW5vZGUsXFxuLVxcdC5ldmljdF9pbm9kZVxcdFxcdD0gdnhmc19ldmljdF9pbm9kZSxcXG4tXFx0LnB1dF9zdXBlclxcdFxcdD0gdnhmc19wdXRfc3VwZXIsXFxuLVxcdC5zdGF0ZnNcXHRcXHRcXHQ9IHZ4ZnNfc3RhdGZzLFxcbi19O1xcbi1cXG4tc3RhdGljIGludCB2eGZzX3RyeV9zYl9tYWdpYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IGZzX2NvbnRleHQgKmZjLFxcbi1cXHRcXHR1bnNpZ25lZCBibGssIF9fZnMzMiBtYWdpYylcXG4te1xcbi1cXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJwO1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYiAqcnNicDtcXG4tXFx0c3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCA9IFZYRlNfU0JJKHNicCk7XFxuLVxcdGludCBzaWxlbnQgPSBmYy1cXHUwMDNlc2JfZmxhZ3MgXFx1MDAyNiBTQl9TSUxFTlQ7XFxuLVxcdGludCByYyA9IC1FTk9NRU07XFxuLVxcbi1cXHRicCA9IHNiX2JyZWFkKHNicCwgYmxrKTtcXG4tXFx0ZG8ge1xcbi1cXHRcXHRpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkge1xcbi1cXHRcXHRcXHRpZiAoIXNpbGVudCkge1xcbi1cXHRcXHRcXHRcXHR3YXJuZihmYyxcXG4tXFx0XFx0XFx0XFx0ICAgICAgXFxcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGRpc2sgc3VwZXJibG9jayBhdCAldVxcXCIsXFxuLVxcdFxcdFxcdFxcdCAgICAgIGJsayk7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJjID0gLUVJTlZBTDtcXG4tXFx0XFx0cnNicCA9IChzdHJ1Y3Qgdnhmc19zYiAqKWJwLVxcdTAwM2ViX2RhdGE7XFxuLVxcdFxcdGlmIChyc2JwLVxcdTAwM2V2c19tYWdpYyAhPSBtYWdpYykge1xcbi1cXHRcXHRcXHRpZiAoIXNpbGVudClcXG4tXFx0XFx0XFx0XFx0aW5mb2YoZmMsXFxuLVxcdFxcdFxcdFxcdCAgICAgIFxcXCJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljICUwOHggYXQgJXVcXFwiLFxcbi1cXHRcXHRcXHRcXHQgICAgICByc2JwLVxcdTAwM2V2c19tYWdpYywgYmxrKTtcXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHJjID0gMDtcXG4tXFx0XFx0aW5mcC1cXHUwMDNldnNpX3JhdyA9IHJzYnA7XFxuLVxcdFxcdGluZnAtXFx1MDAzZXZzaV9icCA9IGJwO1xcbi1cXHR9IHdoaWxlICgwKTtcXG4tXFxuLVxcdGlmIChyYykge1xcbi1cXHRcXHRpbmZwLVxcdTAwM2V2c2lfcmF3ID0gTlVMTDtcXG4tXFx0XFx0aW5mcC1cXHUwMDNldnNpX2JwID0gTlVMTDtcXG4tXFx0XFx0YnJlbHNlKGJwKTtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIHJjO1xcbi19XFxuLVxcbi0vKipcXG4tICogdnhmc19maWxsX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0aWFsaXplIGZpbGVzeXN0ZW1cXG4tICogQHNicDpcXHRcXHRWRlMgc3VwZXJibG9jayAodG8gZmlsbClcXG4tICogQGZjOlxcdFxcdFxcdGZpbGVzeXRlbSBjb250ZXh0XFxuLSAqXFxuLSAqIERlc2NyaXB0aW9uOlxcbi0gKiAgIFdlIGFyZSBjYWxsZWQgb24gdGhlIGZpcnN0IG1vdW50IG9mIGEgZmlsZXN5c3RlbSB0byByZWFkIHRoZVxcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXFxuLSAqXFxuLSAqIFJldHVybnM6XFxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cXG4tICpcXG4tICogTG9ja2luZzpcXG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cXHUwMDNlc19sb2NrLlxcbi0gKi9cXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4te1xcbi1cXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXFx0KmluZnA7XFxuLVxcdHN0cnVjdCB2eGZzX3NiXFx0XFx0KnJzYnA7XFxuLVxcdHVfbG9uZ1xcdFxcdFxcdGJzaXplO1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XFxuLVxcdGludCByZXQgPSAtRUlOVkFMO1xcbi1cXHRpbnQgc2lsZW50ID0gZmMtXFx1MDAzZXNiX2ZsYWdzIFxcdTAwMjYgU0JfU0lMRU5UO1xcbi1cXHR1MzIgajtcXG4tXFxuLVxcdHNicC1cXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XFxuLVxcbi1cXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xcbi1cXHRpZiAoIWluZnApIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcXFwiKTtcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcdH1cXG4tXFxuLVxcdGJzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYnAsIEJMT0NLX1NJWkUpO1xcbi1cXHRpZiAoIWJzaXplKSB7XFxuLVxcdFxcdHdhcm5mKGZjLCBcXFwidnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdHNicC1cXHUwMDNlc19vcCA9IFxcdTAwMjZ2eGZzX3N1cGVyX29wcztcXG4tXFx0c2JwLVxcdTAwM2VzX2ZzX2luZm8gPSBpbmZwO1xcbi1cXHRzYnAtXFx1MDAzZXNfdGltZV9taW4gPSAwO1xcbi1cXHRzYnAtXFx1MDAzZXNfdGltZV9tYXggPSBVMzJfTUFYO1xcbi1cXG4tXFx0aWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLFxcbi1cXHRcXHRcXHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XFxuLVxcdFxcdC8qIFVuaXh3YXJlLCB4ODYgKi9cXG4tXFx0XFx0aW5mcC1cXHUwMDNlYnl0ZV9vcmRlciA9IFZYRlNfQk9fTEU7XFxuLVxcdH0gZWxzZSBpZiAoIXZ4ZnNfdHJ5X3NiX21hZ2ljKHNicCwgZmMsIDgsXFxuLVxcdFxcdFxcdChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fYmUzMihWWEZTX1NVUEVSX01BR0lDKSkpIHtcXG4tXFx0XFx0LyogSFAtVVgsIHBhcmlzYyAqL1xcbi1cXHRcXHRpbmZwLVxcdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19CRTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKCFzaWxlbnQpXFxuLVxcdFxcdFxcdGluZm9mKGZjLCBcXFwidnhmczogY2FuJ3QgZmluZCBzdXBlcmJsb2NrLlxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0cnNicCA9IGluZnAtXFx1MDAzZXZzaV9yYXc7XFxuLVxcdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVxcdTAwM2V2c192ZXJzaW9uKTtcXG4tXFx0aWYgKChqIFxcdTAwM2MgMiB8fCBqIFxcdTAwM2UgNCkgXFx1MDAyNlxcdTAwMjYgIXNpbGVudCkge1xcbi1cXHRcXHRpbmZvZihmYywgXFxcInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxcIiwgaik7XFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuLVxcbi0jaWZkZWYgRElBR05PU1RJQ1xcbi1cXHRwcmludGsoS0VSTl9ERUJVRyBcXFwidnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXFxcXG5cXFwiLCBqKTtcXG4tXFx0cHJpbnRrKEtFUk5fREVCVUcgXFxcInZ4ZnM6IGJsb2Nrc2l6ZTogJWRcXFxcblxcXCIsXFxuLVxcdFxcdGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXFx1MDAzZXZzX2JzaXplKSk7XFxuLSNlbmRpZlxcbi1cXG4tXFx0c2JwLVxcdTAwM2VzX21hZ2ljID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfbWFnaWMpO1xcbi1cXG4tXFx0aW5mcC1cXHUwMDNldnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXFx1MDAzZXZzX29sdGV4dFswXSk7XFxuLVxcdGluZnAtXFx1MDAzZXZzaV9vbHRzaXplID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfb2x0c2l6ZSk7XFxuLVxcbi1cXHRqID0gZnMzMl90b19jcHUoaW5mcCwgcnNicC1cXHUwMDNldnNfYnNpemUpO1xcbi1cXHRpZiAoIXNiX3NldF9ibG9ja3NpemUoc2JwLCBqKSkge1xcbi1cXHRcXHR3YXJuZihmYywgXFxcInZ4ZnM6IHVuYWJsZSB0byBzZXQgZmluYWwgYmxvY2sgc2l6ZVxcXCIpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXG4tXFx0aWYgKHZ4ZnNfcmVhZF9vbHQoc2JwLCBic2l6ZSkpIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBvbHRcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdGlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHtcXG4tXFx0XFx0d2FybmYoZmMsIFxcXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2hlYWRcXFwiKTtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4tXFxuLVxcdHJvb3QgPSB2eGZzX2lnZXQoc2JwLCBWWEZTX1JPT1RfSU5PKTtcXG4tXFx0aWYgKElTX0VSUihyb290KSkge1xcbi1cXHRcXHRyZXQgPSBQVFJfRVJSKHJvb3QpO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbi1cXHRzYnAtXFx1MDAzZXNfcm9vdCA9IGRfbWFrZV9yb290KHJvb3QpO1xcbi1cXHRpZiAoIXNicC1cXHUwMDNlc19yb290KSB7XFxuLVxcdFxcdHdhcm5mKGZjLCBcXFwidnhmczogdW5hYmxlIHRvIGdldCByb290IGRlbnRyeS5cXFwiKTtcXG4tXFx0XFx0Z290byBvdXRfZnJlZV9pbGlzdDtcXG4tXFx0fVxcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLVxcdFxcbi1vdXRfZnJlZV9pbGlzdDpcXG4tXFx0aXB1dChpbmZwLVxcdTAwM2V2c2lfZnNoaXApO1xcbi1cXHRpcHV0KGluZnAtXFx1MDAzZXZzaV9pbGlzdCk7XFxuLVxcdGlwdXQoaW5mcC1cXHUwMDNldnNpX3N0aWxpc3QpO1xcbi1vdXQ6XFxuLVxcdGJyZWxzZShpbmZwLVxcdTAwM2V2c2lfYnApO1xcbi1cXHRrZnJlZShpbmZwKTtcXG4tXFx0cmV0dXJuIHJldDtcXG4tfVxcbi1cXG4tLypcXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cXG4tICovXFxuLXN0YXRpYyBpbnQgdnhmc19nZXRfdHJlZShzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuLXtcXG4tXFx0cmV0dXJuIGdldF90cmVlX2JkZXYoZmMsIHZ4ZnNfZmlsbF9zdXBlcik7XFxuLX1cXG4tXFxuLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNfY29udGV4dF9vcGVyYXRpb25zIHZ4ZnNfY29udGV4dF9vcHMgPSB7XFxuLVxcdC5nZXRfdHJlZVxcdD0gdnhmc19nZXRfdHJlZSxcXG4tXFx0LnJlY29uZmlndXJlXFx0PSB2eGZzX3JlY29uZmlndXJlLFxcbi19O1xcbi1cXG4tc3RhdGljIGludCB2eGZzX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuLXtcXG4tXFx0ZmMtXFx1MDAzZW9wcyA9IFxcdTAwMjZ2eGZzX2NvbnRleHRfb3BzO1xcbi1cXG4tXFx0cmV0dXJuIDA7XFxuLX1cXG4tXFxuLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7XFxuLVxcdC5vd25lclxcdFxcdD0gVEhJU19NT0RVTEUsXFxuLVxcdC5uYW1lXFx0XFx0PSBcXFwidnhmc1xcXCIsXFxuLVxcdC5raWxsX3NiXFx0PSBraWxsX2Jsb2NrX3N1cGVyLFxcbi1cXHQuZnNfZmxhZ3NcXHQ9IEZTX1JFUVVJUkVTX0RFVixcXG4tXFx0LmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LFxcbi19O1xcbi1NT0RVTEVfQUxJQVNfRlMoXFxcInZ4ZnNcXFwiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovXFxuLU1PRFVMRV9BTElBUyhcXFwidnhmc1xcXCIpO1xcbi1cXG4tc3RhdGljIGludCBfX2luaXRcXG4tdnhmc19pbml0KHZvaWQpXFxuLXtcXG4tXFx0aW50IHJ2O1xcbi1cXG4tXFx0dnhmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZV91c2VyY29weShcXFwidnhmc19pbm9kZVxcXCIsXFxuLVxcdFxcdFxcdHNpemVvZihzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvKSwgMCxcXG4tXFx0XFx0XFx0U0xBQl9SRUNMQUlNX0FDQ09VTlQsXFxuLVxcdFxcdFxcdG9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksXFxuLVxcdFxcdFxcdHNpemVvZl9maWVsZChzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLFxcbi1cXHRcXHRcXHRcXHR2aWlfaW1tZWQudmlfaW1tZWQpLFxcbi1cXHRcXHRcXHROVUxMKTtcXG4tXFx0aWYgKCF2eGZzX2lub2RlX2NhY2hlcClcXG4tXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLVxcdHJ2ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbShcXHUwMDI2dnhmc19mc190eXBlKTtcXG4tXFx0aWYgKHJ2IFxcdTAwM2MgMClcXG4tXFx0XFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcXG4tXFx0cmV0dXJuIHJ2O1xcbi19XFxuLVxcbi1zdGF0aWMgdm9pZCBfX2V4aXRcXG4tdnhmc19jbGVhbnVwKHZvaWQpXFxuLXtcXG4tXFx0dW5yZWdpc3Rlcl9maWxlc3lzdGVtKFxcdTAwMjZ2eGZzX2ZzX3R5cGUpO1xcbi1cXHQvKlxcbi1cXHQgKiBNYWtlIHN1cmUgYWxsIGRlbGF5ZWQgcmN1IGZyZWUgaW5vZGVzIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZVxcbi1cXHQgKiBkZXN0cm95IGNhY2hlLlxcbi1cXHQgKi9cXG4tXFx0cmN1X2JhcnJpZXIoKTtcXG4tXFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcXG4tfVxcbi1cXG4tbW9kdWxlX2luaXQodnhmc19pbml0KTtcXG4tbW9kdWxlX2V4aXQodnhmc19jbGVhbnVwKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMzBUMTg6NDA6MTAuNzEyODY1NTgyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6ODY3Mjc5NTg0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4ZGFlNTE0OGMxMDQ1ZmQwMGU1YWE5MTMxZjdkMzU4NDY0YzBjOGU1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdWwgMzAgMTg6NDA6MDkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZjk0NzJjMWEwOTA3Li41NTE4YjViYzNlZmE0IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbisrKyBiL01BSU5UQUlORVJTXG5AQCAtMTA1NjUsMTIgKzEwNTY1LDYgQEAgTDpcdGxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnXG4gUzpcdE9ycGhhblxuIEY6XHRkcml2ZXJzL3VzYi9waHkvcGh5LWZzbC11c2IqXG4gXG4tRlJFRVZYRlMgRklMRVNZU1RFTVxuLU06XHRDaHJpc3RvcGggSGVsbHdpZyBcdTAwM2NoY2hAaW5mcmFkZWFkLm9yZ1x1MDAzZVxuLVM6XHRNYWludGFpbmVkXG4tVzpcdGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL3Z4ZnNcbi1GOlx0ZnMvZnJlZXZ4ZnMvXG4tXG4gRlJFRVpFUlxuIE06XHRcIlJhZmFlbCBKLiBXeXNvY2tpXCIgXHUwMDNjcmFmYWVsQGtlcm5lbC5vcmdcdTAwM2VcbiBSOlx0UGF2ZWwgTWFjaGVrIFx1MDAzY3BhdmVsQGtlcm5lbC5vcmdcdTAwM2VcbmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZ1xuaW5kZXggY2Y2YWU2NDc3NmU2Mi4uNmU3ZTYzYWZhZTJiMiAxMDA2NDRcbi0tLSBhL2ZzL0tjb25maWdcbisrKyBiL2ZzL0tjb25maWdcbkBAIC0zMjEsNyArMzIxLDYgQEAgc291cmNlIFwiZnMvamZmczIvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvdWJpZnMvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvY3JhbWZzL0tjb25maWdcIlxuIHNvdXJjZSBcImZzL3NxdWFzaGZzL0tjb25maWdcIlxuLXNvdXJjZSBcImZzL2ZyZWV2eGZzL0tjb25maWdcIlxuIHNvdXJjZSBcImZzL21pbml4L0tjb25maWdcIlxuIHNvdXJjZSBcImZzL29tZnMvS2NvbmZpZ1wiXG4gc291cmNlIFwiZnMvaHBmcy9LY29uZmlnXCJcbmRpZmYgLS1naXQgYS9mcy9NYWtlZmlsZSBiL2ZzL01ha2VmaWxlXG5pbmRleCA4OWE4YTlkMjA3ZDFjLi5hYzBkMWMwMDUyM2YwIDEwMDY0NFxuLS0tIGEvZnMvTWFrZWZpbGVcbisrKyBiL2ZzL01ha2VmaWxlXG5AQCAtODAsNyArODAsNiBAQCBvYmotJChDT05GSUdfSVNPOTY2MF9GUylcdCs9IGlzb2ZzL1xuIG9iai0kKENPTkZJR19IRlNQTFVTX0ZTKVx0Kz0gaGZzcGx1cy8gIyBCZWZvcmUgaGZzIHRvIGZpbmQgd3JhcHBlZCBIRlMrXG4gb2JqLSQoQ09ORklHX0hGU19GUylcdFx0Kz0gaGZzL1xuIG9iai0kKENPTkZJR19FQ1JZUFRfRlMpXHRcdCs9IGVjcnlwdGZzL1xuLW9iai0kKENPTkZJR19WWEZTX0ZTKVx0XHQrPSBmcmVldnhmcy9cbiBvYmotJChDT05GSUdfTkZTX0ZTKVx0XHQrPSBuZnMvXG4gb2JqLSQoQ09ORklHX0VYUE9SVEZTKVx0XHQrPSBleHBvcnRmcy9cbiBvYmotJChDT05GSUdfTkZTRClcdFx0Kz0gbmZzZC9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9LY29uZmlnIGIvZnMvZnJlZXZ4ZnMvS2NvbmZpZ1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA5MTIxMDdlYmVhNmY0Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy9LY29uZmlnXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNyArMCwwIEBAXG4tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tY29uZmlnIFZYRlNfRlNcbi1cdHRyaXN0YXRlIFwiRnJlZVZ4RlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoVkVSSVRBUyBWeEZTKFRNKSBjb21wYXRpYmxlKVwiXG4tXHRkZXBlbmRzIG9uIEJMT0NLXG4tXHRzZWxlY3QgQlVGRkVSX0hFQURcbi1cdGhlbHBcbi1cdCAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pXG4tXHQgIGZpbGUgc3lzdGVtIGZvcm1hdC4gIFZFUklUQVMgVnhGUyhUTSkgaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtXG4tXHQgIG9mIFNDTyBVbml4V2FyZSAoYW5kIHBvc3NpYmx5IG90aGVycykgYW5kIG9wdGlvbmFsbHkgYXZhaWxhYmxlXG4tXHQgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBIb3dldmVyXG4tXHQgIHRoZXNlIHBhcnRpY3VsYXIgT1MgaW1wbGVtZW50YXRpb25zIG9mIHZ4ZnMgbWF5IGRpZmZlciBpbiBvbi1kaXNrXG4tXHQgIGRhdGEgZW5kaWFubmVzcyBhbmQvb3Igc3VwZXJibG9jayBvZmZzZXQuIFRoZSB2eGZzIG1vZHVsZSBoYXMgYmVlblxuLVx0ICB0ZXN0ZWQgd2l0aCBTQ08gVW5peFdhcmUgYW5kIEhQLVVYIEIuMTAuMjAgKHBhLXJpc2MgMS4xIGFyY2guKVxuLVx0ICBDdXJyZW50bHkgb25seSByZWFkb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkIGFuZCBWeEZYIHZlcnNpb25zXG4tXHQgIDIsIDMgYW5kIDQuIFRlc3RzIHdlcmUgcGVyZm9ybWVkIHdpdGggSFAtVVggVnhGUyB2ZXJzaW9uIDMuXG4tXG4tXHQgIE5PVEU6IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGFzIHVzZWQgYnkgbW91bnQoMSksIG1vdW50KDIpIGFuZFxuLVx0ICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdFxuLVx0ICB0aGUgYWN0dWFsIGRyaXZlci5cbi1cbi1cdCAgVGhlcmUgaXMgYSB1c2Vyc3BhY2UgdXRpbGl0eSBmb3IgSFAtVVggbG9naWNhbCB2b2x1bWVzIHdoaWNoIG1ha2VzXG4tXHQgIGNyZWF0aW5nIEhQLVVYIGxvZ2ljYWwgdm9sdW1lcyBlYXN5IGZyb20gSFAtVVggZGlzayBibG9jayBkZXZpY2UgZmlsZVxuLVx0ICBvciByZWd1bGFyIGZpbGUgd2l0aCBpbWFnZSBvZiB0aGUgZGlzay4gU2VlOlxuLVx0ICAgICAgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXgtdnhmcy9cbi1cbi1cdCAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmVcbi1cdCAgY2FsbGVkIGZyZWV2eGZzLiAgSWYgdW5zdXJlLCBzYXkgTi5cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9NYWtlZmlsZSBiL2ZzL2ZyZWV2eGZzL01ha2VmaWxlXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGU2ZWU1OTI5MTUyMWMuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL01ha2VmaWxlXG4rKysgL2Rldi9udWxsXG5AQCAtMSw5ICswLDAgQEBcbi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0jXG4tIyBWeEZTIE1ha2VmaWxlXG4tI1xuLVxuLW9iai0kKENPTkZJR19WWEZTX0ZTKSArPSBmcmVldnhmcy5vXG4tXG4tZnJlZXZ4ZnMtb2JqcyA6PSB2eGZzX2JtYXAubyB2eGZzX2ZzaGVhZC5vIHZ4ZnNfaW1tZWQubyB2eGZzX2lub2RlLm8gXFxcbi1cdFx0IHZ4ZnNfbG9va3VwLm8gdnhmc19vbHQubyB2eGZzX3N1YnIubyB2eGZzX3N1cGVyLm9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggYmZmZDE1NmQ2NDM0Yy4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmcy5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNTcgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX1NVUEVSX0hfXG4tI2RlZmluZSBfVlhGU19TVVBFUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cGVyYmxvY2sgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogc3VwZXJibG9ja3Mgb2YgdGhlIFZlcml0YXMgRmlsZXN5c3RlbS5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4tXG4tLypcbi0gKiBTdXBlcmJsb2NrIG1hZ2ljIG51bWJlciAodnhmc19zdXBlci1cdTAwM2V2c19tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX1NVUEVSX01BR0lDXHQweGE1MDFGQ0Y1XG4tXG4tLypcbi0gKiBUaGUgcm9vdCBpbm9kZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfUk9PVF9JTk9cdFx0MlxuLVxuLS8qXG4tICogTnVtIG9mIGVudHJpZXMgaW4gZnJlZSBleHRlbnQgYXJyYXlcbi0gKi9cbi0jZGVmaW5lIFZYRlNfTkVGUkVFXHRcdDMyXG4tXG4tZW51bSB2eGZzX2J5dGVfb3JkZXIge1xuLVx0VlhGU19CT19MRSxcbi1cdFZYRlNfQk9fQkUsXG4tfTtcbi1cbi10eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2ZzMTY7XG4tdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyO1xuLXR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fZnM2NDtcbi1cbi0vKlxuLSAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuXG4tICovXG4tc3RydWN0IHZ4ZnNfc2Ige1xuLVx0Lypcbi1cdCAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLlxuLVx0ICpcbi1cdCAqIExvdHMgb2YgdGhpcyBmaWVsZHMgYXJlIG5vIG1vcmUgdXNlZCBieSB2ZXJzaW9uIDJcbi1cdCAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy5cbi1cdCAqL1xuLVx0X19mczMyXHRcdHZzX21hZ2ljO1x0XHQvKiBNYWdpYyBudW1iZXIgKi9cbi1cdF9fZnMzMlx0XHR2c192ZXJzaW9uO1x0XHQvKiBWeEZTIHZlcnNpb24gKi9cbi1cdF9fZnMzMlx0XHR2c19jdGltZTtcdFx0LyogY3JlYXRlIHRpbWUgLSBzZWNzICovXG4tXHRfX2ZzMzJcdFx0dnNfY3V0aW1lO1x0XHQvKiBjcmVhdGUgdGltZSAtIHVzZWNzICovXG4tXHRfX2ZzMzJcdFx0X191bnVzZWQxO1x0XHQvKiB1bnVzZWQgKi9cbi1cdF9fZnMzMlx0XHRfX3VudXNlZDI7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9sb2dzdGFydDtcdC8qIG9ic29sZXRlICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2xvZ2VuZDtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19ic2l6ZTtcdFx0LyogYmxvY2sgc2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX3NpemU7XHRcdC8qIG51bWJlciBvZiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19kc2l6ZTtcdFx0LyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX25pbm9kZTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmF1O1x0XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdF9fdW51c2VkMztcdFx0LyogdW51c2VkICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2RlZmlleHRzaXplO1x0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaWxic2l6ZTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19pbW1lZGxlbjtcdFx0Lyogc2l6ZSBvZiBpbW1lZGlhdGUgZGF0YSBhcmVhICovXG4tXHRfX2ZzMzJcdFx0dnNfbmRhZGRyO1x0XHQvKiBudW1iZXIgb2YgZGlyZWN0IGV4dGVudGVzICovXG4tXHRfX2ZzMzJcdFx0dnNfZmlyc3RhdTtcdFx0LyogYWRkcmVzcyBvZiBmaXJzdCBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2VtYXA7XHRcdC8qIG9mZnNldCBvZiBleHRlbnQgbWFwIGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfaW1hcDtcdFx0Lyogb2Zmc2V0IG9mIGlub2RlIG1hcCBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2lleHRvcDtcdFx0Lyogb2Zmc2V0IG9mIEV4dE9wLiBtYXAgaW4gQVUgKi9cbi1cdF9fZnMzMlx0XHR2c19pc3RhcnQ7XHRcdC8qIG9mZnNldCBvZiBpbm9kZSBsaXN0IGluIEFVICovXG4tXHRfX2ZzMzJcdFx0dnNfYnN0YXJ0O1x0XHQvKiBvZmZzZXQgb2YgZmRibG9jayBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX2ZlbWFwO1x0XHQvKiBhdWZpcnN0ICsgZW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpbWFwO1x0XHQvKiBhdWZpcnN0ICsgaW1hcCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpZXh0b3A7XHRcdC8qIGF1Zmlyc3QgKyBpZXh0b3AgKi9cbi1cdF9fZnMzMlx0XHR2c19maXN0YXJ0O1x0XHQvKiBhdWZpcnN0ICsgaXN0YXJ0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZmJzdGFydDtcdFx0LyogYXVmaXJzdCArIGJzdGFydCAqL1xuLVx0X19mczMyXHRcdHZzX25pbmRpcjtcdFx0LyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi9cbi1cdF9fZnMzMlx0XHR2c19hdWxlbjtcdFx0LyogbGVuZ3RoIG9mIEFVIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1aW1sZW47XHRcdC8qIGxlbmd0aCBvZiBpbWFwIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1ZW1sZW47XHRcdC8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1aWxlbjtcdFx0LyogbGVuZ3RoIG9mIGlsaXN0IGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1cGFkO1x0XHQvKiBsZW5ndGggb2YgcGFkIGluIGJsb2NrcyAqL1xuLVx0X19mczMyXHRcdHZzX2F1YmxvY2tzO1x0XHQvKiBkYXRhIGJsb2NrcyBpbiBBVSAqL1xuLVx0X19mczMyXHRcdHZzX21heHRpZXI7XHRcdC8qIGxvZyBiYXNlIDIgb2YgYXVibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19pbm9wYjtcdFx0LyogbnVtYmVyIG9mIGlub2RlcyBwZXIgYmxrICovXG4tXHRfX2ZzMzJcdFx0dnNfb2xkX2lub3BhdTtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfaW5vcGlsYjtcdFx0Lyogb2Jzb2xldGUgKi9cbi1cdF9fZnMzMlx0XHR2c19vbGRfbmRpcmlwYXU7XHQvKiBvYnNvbGV0ZSAqL1xuLVx0X19mczMyXHRcdHZzX2lhZGRybGVuO1x0XHQvKiBzaXplIG9mIGluZGlyZWN0IGFkZHIgZXh0LiAqL1xuLVx0X19mczMyXHRcdHZzX2JzaGlmdDtcdFx0LyogbG9nIGJhc2UgMiBvZiBic2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX2lub3NoaWZ0O1x0XHQvKiBsb2cgYmFzZSAyIG9mIGlub2JwICovXG4tXHRfX2ZzMzJcdFx0dnNfYm1hc2s7XHRcdC8qIH4oIGJzaXplIC0gMSApICovXG4tXHRfX2ZzMzJcdFx0dnNfYm9mZm1hc2s7XHRcdC8qIGJzaXplIC0gMSAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9pbm9tYXNrO1x0XHQvKiBvbGRfaW5vcGlsYiAtIDEgKi9cbi1cdF9fZnMzMlx0XHR2c19jaGVja3N1bTtcdFx0LyogY2hlY2tzdW0gb2YgVjEgZGF0YSAqL1xuLVx0XG4tXHQvKlxuLVx0ICogVmVyc2lvbiAxLCB3cml0YWJsZVxuLVx0ICovXG4tXHRfX2ZzMzJcdFx0dnNfZnJlZTtcdFx0LyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dnNfaWZyZWU7XHRcdC8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdHZzX2VmcmVlW1ZYRlNfTkVGUkVFXTtcdC8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqL1xuLVx0X19mczMyXHRcdHZzX2ZsYWdzO1x0XHQvKiBmbGFncyA/IT8gKi9cbi1cdF9fdThcdFx0dnNfbW9kO1x0XHRcdC8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqL1xuLVx0X191OFx0XHR2c19jbGVhbjtcdFx0LyogY2xlYW4gRlMgKi9cbi1cdF9fZnMxNlx0XHRfX3VudXNlZDQ7XHRcdC8qIHVudXNlZCAqL1xuLVx0X19mczMyXHRcdHZzX2ZpcnN0bG9naWQ7XHRcdC8qIG1vdW50IHRpbWUgbG9nIElEICovXG4tXHRfX2ZzMzJcdFx0dnNfd3RpbWU7XHRcdC8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dnNfd3V0aW1lO1x0XHQvKiBsYXN0IHRpbWUgd3JpdHRlbiAtIHVzZWMgKi9cbi1cdF9fdThcdFx0dnNfZm5hbWVbNl07XHRcdC8qIEZTIG5hbWUgKi9cbi1cdF9fdThcdFx0dnNfZnBhY2tbNl07XHRcdC8qIEZTIHBhY2sgbmFtZSAqL1xuLVx0X19mczMyXHRcdHZzX2xvZ3ZlcnNpb247XHRcdC8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqL1xuLVx0X191MzJcdFx0X191bnVzZWQ1O1x0XHQvKiB1bnVzZWQgKi9cbi1cdFxuLVx0Lypcbi1cdCAqIFZlcnNpb24gMiwgUmVhZC1vbmx5XG4tXHQgKi9cbi1cdF9fZnMzMlx0XHR2c19vbHRleHRbMl07XHRcdC8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi9cbi1cdF9fZnMzMlx0XHR2c19vbHRzaXplO1x0XHQvKiBPTFQgZXh0ZW50IHNpemUgKi9cbi1cdF9fZnMzMlx0XHR2c19pYXVpbWxlbjtcdFx0Lyogc2l6ZSBvZiBpbm9kZSBtYXAgKi9cbi1cdF9fZnMzMlx0XHR2c19pYXVzaXplO1x0XHQvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi9cbi1cdF9fZnMzMlx0XHR2c19kaW5vc2l6ZTtcdFx0Lyogc2l6ZSBvZiBpbm9kZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZzX29sZF9kbmlhZGRyO1x0XHQvKiBpbmRpciBsZXZlbHMgcGVyIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0dnNfY2hlY2tzdW0yO1x0XHQvKiBjaGVja3N1bSBvZiBWMiBSTyAqL1xuLVxuLVx0Lypcbi1cdCAqIEFjdHVhbGx5IG11Y2ggbW9yZS4uLlxuLVx0ICovXG4tfTtcbi1cbi1cbi0vKlxuLSAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19zYl9pbmZvIHtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCp2c2lfcmF3O1x0LyogcmF3IChvbiBkaXNrKSBzdXBlcmJsb2NrICovXG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdCp2c2lfYnA7XHQvKiBidWZmZXIgZm9yIHJhdyBzdXBlcmJsb2NrKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX2ZzaGlwO1x0LyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi9cbi1cdHN0cnVjdCBpbm9kZVx0XHQqdnNpX2lsaXN0O1x0LyogaW5vZGUgbGlzdCBpbm9kZSAqL1xuLVx0c3RydWN0IGlub2RlXHRcdCp2c2lfc3RpbGlzdDtcdC8qIHN0cnVjdHVyYWwgaW5vZGUgbGlzdCBpbm9kZSAqL1xuLVx0dV9sb25nXHRcdFx0dnNpX2lleHQ7XHQvKiBpbml0aWFsIGlub2RlIGxpc3QgKi9cbi1cdGlub190XHRcdFx0dnNpX2ZzaGlubztcdC8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovXG4tXHRkYWRkcl90XHRcdFx0dnNpX29sdGV4dDtcdC8qIE9MVCBleHRlbnQgKi9cbi1cdGRhZGRyX3RcdFx0XHR2c2lfb2x0c2l6ZTtcdC8qIE9MVCBzaXplICovXG4tXHRlbnVtIHZ4ZnNfYnl0ZV9vcmRlclx0Ynl0ZV9vcmRlcjtcbi19O1xuLVxuLXN0YXRpYyBpbmxpbmUgdTE2IGZzMTZfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczE2IGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpYSk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdTMyIGZzMzJfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczMyIGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpYSk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdTY0IGZzNjRfdG9fY3B1KHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSwgX19mczY0IGEpXG4te1xuLVx0aWYgKHNiaS1cdTAwM2VieXRlX29yZGVyID09IFZYRlNfQk9fQkUpXG4tXHRcdHJldHVybiBiZTY0X3RvX2NwdSgoX19mb3JjZSBfX2JlNjQpYSk7XG4tXHRlbHNlXG4tXHRcdHJldHVybiBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpYSk7XG4tfVxuLVxuLS8qXG4tICogRmlsZSBtb2Rlcy4gIEZpbGUgdHlwZXMgYWJvdmUgMHhmMDAwIGFyZSB2eGZzIGludGVybmFsIG9ubHksIHRoZXkgc2hvdWxkXG4tICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0XG4tICogbmV2ZXIgaGF2ZSBvbmUgb2YgdGhlIHJlZ3VsYXIgZmlsZSB0eXBlIGJpdHMgc2V0LlxuLSAqL1xuLWVudW0gdnhmc19tb2RlIHtcbi1cdFZYRlNfSVNVSUQgPSAweDAwMDAwODAwLFx0Lyogc2V0dWlkICovXG4tXHRWWEZTX0lTR0lEID0gMHgwMDAwMDQwMCxcdC8qIHNldGdpZCAqL1xuLVx0VlhGU19JU1ZUWCA9IDB4MDAwMDAyMDAsXHQvKiBzdGlja3kgYml0ICovXG4tXHRWWEZTX0lSRUFEID0gMHgwMDAwMDEwMCxcdC8qIHJlYWQgKi9cbi1cdFZYRlNfSVdSSVRFID0gMHgwMDAwMDA4MCxcdC8qIHdyaXRlICovXG4tXHRWWEZTX0lFWEVDID0gMHgwMDAwMDA0MCxcdC8qIGV4ZWMgKi9cbi1cbi1cdFZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLFx0LyogTmFtZWQgcGlwZSAqL1xuLVx0VlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsXHQvKiBDaGFyYWN0ZXIgZGV2aWNlICovXG4tXHRWWEZTX0lGRElSID0gMHgwMDAwNDAwMCxcdC8qIERpcmVjdG9yeSAqL1xuLVx0VlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsXHQvKiBYZW5peCBkZXZpY2UgPz8gKi9cbi1cdFZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLFx0LyogQmxvY2sgZGV2aWNlICovXG4tXHRWWEZTX0lGUkVHID0gMHgwMDAwODAwMCxcdC8qIFJlZ3VsYXIgZmlsZSAqL1xuLVx0VlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsXHQvKiBDb21wcmVzc2VkIGZpbGUgPyE/ICovXG4tXHRWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCxcdC8qIFN5bWxpbmsgKi9cbi1cdFZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLFx0LyogU29ja2V0ICovXG4tXG4tXHQvKiBWeEZTIGludGVybmFsICovXG4tXHRWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCxcdC8qIEZpbGVzZXQgaGVhZGVyICovXG4tXHRWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCxcdC8qIElub2RlIGxpc3QgKi9cbi1cdFZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLFx0LyogSW5vZGUgYWxsb2NhdGlvbiB1bml0ICovXG4tXHRWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCxcdC8qIEN1cnJlbnQgdXNhZ2UgdGFibGUgKi9cbi1cdFZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLFx0LyogQXR0ci4gaW5vZGUgKi9cbi1cdFZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLFx0LyogTGluayBjb3VudCB0YWJsZSAqL1xuLVx0VlhGU19JRklBVCA9IDB4NzAwMDAwMDAsXHQvKiBJbmRpcmVjdCBhdHRyaWJ1dGUgZmlsZSAqL1xuLVx0VlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIHJlb3JnIGZpbGUgKi9cbi1cdFZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLFx0LyogQlNEIHF1b3RhIGZpbGUgKi9cbi1cdFZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLFx0LyogXCJQYXNzIHRocm91Z2hcIiBpbm9kZSAqL1xuLVx0VlhGU19JRkxBQiA9IDB4MTEwMDAwMDAsXHQvKiBEZXZpY2UgbGFiZWwgZmlsZSAqL1xuLVx0VlhGU19JRk9MVCA9IDB4MTIwMDAwMDAsXHQvKiBPTFQgZmlsZSAqL1xuLVx0VlhGU19JRkxPRyA9IDB4MTMwMDAwMDAsXHQvKiBMb2cgZmlsZSAqL1xuLVx0VlhGU19JRkVNUCA9IDB4MTQwMDAwMDAsXHQvKiBFeHRlbnQgbWFwIGZpbGUgKi9cbi1cdFZYRlNfSUZFQVUgPSAweDE1MDAwMDAwLFx0LyogRXh0ZW50IEFVIGZpbGUgKi9cbi1cdFZYRlNfSUZBVVMgPSAweDE2MDAwMDAwLFx0LyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqL1xuLVx0VlhGU19JRkRFViA9IDB4MTcwMDAwMDAsXHQvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi9cbi1cbi19O1xuLVxuLSNkZWZpbmVcdFZYRlNfVFlQRV9NQVNLXHRcdDB4ZmZmZmYwMDBcbi1cbi0jZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKVx0KCgoaXApLVx1MDAzZXZpaV9tb2RlIFx1MDAyNiBWWEZTX1RZUEVfTUFTSykgPT0gKHR5cGUpKVxuLSNkZWZpbmUgVlhGU19JU0ZJRk8oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGSUZPKVxuLSNkZWZpbmUgVlhGU19JU0NIUih4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDSFIpXG4tI2RlZmluZSBWWEZTX0lTRElSKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkRJUilcbi0jZGVmaW5lIFZYRlNfSVNOQU0oeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGTkFNKVxuLSNkZWZpbmUgVlhGU19JU0JMSyh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZCTEspXG4tI2RlZmluZSBWWEZTX0lTTE5LKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRkxOSylcbi0jZGVmaW5lIFZYRlNfSVNSRUcoeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGUkVHKVxuLSNkZWZpbmUgVlhGU19JU0NNUCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZDTVApXG4tI2RlZmluZSBWWEZTX0lTU09DKHgpXHRcdFZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlNPQylcbi1cbi0jZGVmaW5lIFZYRlNfSVNGU0goeClcdFx0VlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKVxuLSNkZWZpbmUgVlhGU19JU0lMVCh4KVx0XHRWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpXG4tXG4tLypcbi0gKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19PUkdfTk9ORVx0PSAwLFx0LyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqL1xuLVx0VlhGU19PUkdfRVhUNFx0PSAxLFx0LyogRXh0NCAqL1xuLVx0VlhGU19PUkdfSU1NRURcdD0gMixcdC8qIEFsbCBkYXRhIHN0b3JlZCBpbiBpbm9kZSAqL1xuLVx0VlhGU19PUkdfVFlQRURcdD0gMyxcdC8qIFR5cGVkIGV4dGVudHMgKi9cbi19O1xuLVxuLSNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKVx0KChpcCktXHUwMDNldmlpX29yZ3R5cGUgPT0gKG9yZykpXG4tI2RlZmluZSBWWEZTX0lTTk9ORShpcClcdFx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSlcbi0jZGVmaW5lIFZYRlNfSVNFWFQ0KGlwKVx0XHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KVxuLSNkZWZpbmUgVlhGU19JU0lNTUVEKGlwKVx0VlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfSU1NRUQpXG4tI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApXHRWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19UWVBFRClcbi1cbi0vKlxuLSAqIEdldCBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmcm9tIFZGUyBzdXBlcmJsb2NrLlxuLSAqL1xuLSNkZWZpbmUgVlhGU19TQkkoc2JwKSBcXFxuLVx0KChzdHJ1Y3Qgdnhmc19zYl9pbmZvICopKHNicCktXHUwMDNlc19mc19pbmZvKVxuLVxuLSNlbmRpZiAvKiBfVlhGU19TVVBFUl9IXyAqL1xuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMWI4MjE2ZWIxZDkwYS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmNcbisrKyAvZGV2L251bGxcbkBAIC0xLDI3MiArMCwwIEBAXG4tLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXN5c3RlbSB0byBkaXNrIGJsb2NrIG1hcHBpbmcuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwidnhmcy5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLXN0YXRpYyB2b2lkXG4tdnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApXG4te1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJ0eXBlPSVMdSBcIiwgdHlwLVx1MDAzZXZ0X2hkciBcdTAwM2VcdTAwM2UgVlhGU19UWVBFRF9UWVBFU0hJRlQpO1xuLVx0cHJpbnRrKFwib2Zmc2V0PSVMeCBcIiwgdHlwLVx1MDAzZXZ0X2hkciBcdTAwMjYgVlhGU19UWVBFRF9PRkZTRVRNQVNLKTtcbi1cdHByaW50ayhcImJsb2NrPSV4IFwiLCB0eXAtXHUwMDNldnRfYmxvY2spO1xuLVx0cHJpbnRrKFwic2l6ZT0leFxcblwiLCB0eXAtXHUwMDNldnRfc2l6ZSk7XG4tfVxuLSNlbmRpZlxuLVxuLS8qKlxuLSAqIHZ4ZnNfYm1hcF9leHQ0IC0gZG8gYm1hcCBmb3IgZXh0NCBleHRlbnRzXG4tICogQGlwOlx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBibjpcdFx0bG9naWNhbCBibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwX2V4dDQgcGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciBpbm9kZXMgd2l0aFxuLSAqICAgZXh0NC1zdHlsZSBleHRlbnRzICh3aGljaCBhcmUgbXVjaCBsaWtlIHRoZSB0cmFkaXRpb25hbCBVTklYXG4tICogICBpbm9kZSBvcmdhbmlzYXRpb24pLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBkYWRkcl90XG4tdnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibilcbi17XG4tXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtXHUwMDNlaV9zYjtcbi1cdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCA9IFZYRlNfSU5PKGlwKTtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKHNiKTtcbi1cdHVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdHUzMiBpbmRzaXplID0gZnMzMl90b19jcHUoc2JpLCB2aXAtXHUwMDNldmlpX2V4dDQudmU0X2luZHNpemUpO1xuLVx0aW50IGk7XG4tXG4tXHRpZiAoaW5kc2l6ZSBcdTAwM2Ugc2ItXHUwMDNlc19ibG9ja3NpemUpXG4tXHRcdGdvdG8gZmFpbF9zaXplO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OREFERFI7IGkrKykge1xuLVx0XHRzdHJ1Y3QgZGlyZWN0ICpkID0gdmlwLVx1MDAzZXZpaV9leHQ0LnZlNF9kaXJlY3QgKyBpO1xuLVx0XHRpZiAoYm4gXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiBibiBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCBkLVx1MDAzZXNpemUpKVxuLVx0XHRcdHJldHVybiAoYm4gKyBmczMyX3RvX2NwdShzYmksIGQtXHUwMDNlZXh0ZW50KSk7XG4tXHRcdGJuIC09IGZzMzJfdG9fY3B1KHNiaSwgZC1cdTAwM2VzaXplKTtcbi1cdH1cbi1cbi1cdGlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6ZSAvIDQpKSA9PSAwKSB7XG4tXHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqYnVmO1xuLVx0XHRkYWRkcl90XHRibm87XG4tXHRcdF9fZnMzMiAqaW5kaXI7XG4tXG4tXHRcdGJ1ZiA9IHNiX2JyZWFkKHNiLFxuLVx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdmlwLVx1MDAzZXZpaV9leHQ0LnZlNF9pbmRpclswXSkpO1xuLVx0XHRpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKVxuLVx0XHRcdGdvdG8gZmFpbF9idWY7XG4tXG4tXHRcdGluZGlyID0gKF9fZnMzMiAqKWJ1Zi1cdTAwM2ViX2RhdGE7XG4tXHRcdGJubyA9IGZzMzJfdG9fY3B1KHNiaSwgaW5kaXJbKGJuIC8gaW5kc2l6ZSkgJSAoaW5kc2l6ZSAqIGJuKV0pICtcbi1cdFx0XHQoYm4gJSBpbmRzaXplKTtcbi1cbi1cdFx0YnJlbHNlKGJ1Zik7XG4tXHRcdHJldHVybiBibm87XG4tXHR9IGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fV0FSTklORyBcIm5vIG1hdGNoaW5nIGluZGlyP1wiKTtcbi1cbi1cdHJldHVybiAwO1xuLVxuLWZhaWxfc2l6ZTpcbi1cdHByaW50ayhcInZ4ZnM6IGluZGlyZWN0IGV4dGVudCB0b28gYmlnIVxcblwiKTtcbi1mYWlsX2J1Zjpcbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXBfaW5kaXIgLSByZWN1cnNpb24gZm9yIHZ4ZnNfYm1hcF90eXBlZFxuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaW5kaXI6XHRpbmRpcmVjdCBibG9jayB3ZSBzdGFydCByZWFkaW5nIGF0XG4tICogQHNpemU6XHRzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaFxuLSAqIEBibG9jazpcdHBhcnRpYWxseSByZXN1bHQgZnJvbSBmdXJ0aGVyIHNlYXJjaGVzXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfYm1hcF9pbmRpciByZWFkcyBhIFx1MDAyNnN0cnVjdCB2eGZzX3R5cGVkIGF0IEBpbmRpclxuLSAqICAgYW5kIHBlcmZvcm1zIHRoZSB0eXBlLWRlZmluZWQgYWN0aW9uLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTm90ZTpcbi0gKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/XG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdFx0KmJwID0gTlVMTDtcbi1cdGRhZGRyX3RcdFx0XHRcdHBibG9jayA9IDA7XG4tXHRpbnRcdFx0XHRcdGk7XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtXHUwMDNlaV9zYik7IGkrKykge1xuLVx0XHRzdHJ1Y3Qgdnhmc190eXBlZFx0KnR5cDtcbi1cdFx0aW50NjRfdFx0XHRcdG9mZjtcbi1cbi1cdFx0YnAgPSBzYl9icmVhZChpcC1cdTAwM2VpX3NiLFxuLVx0XHRcdFx0aW5kaXIgKyAoaSAvIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLVx1MDAzZWlfc2IpKSk7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKVxuLVx0XHRcdHJldHVybiAwO1xuLVxuLVx0XHR0eXAgPSAoKHN0cnVjdCB2eGZzX3R5cGVkICopYnAtXHUwMDNlYl9kYXRhKSArXG4tXHRcdFx0KGkgJSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC1cdTAwM2VpX3NiKSk7XG4tXHRcdG9mZiA9IGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikgXHUwMDI2IFZYRlNfVFlQRURfT0ZGU0VUTUFTSztcbi1cbi1cdFx0aWYgKGJsb2NrIFx1MDAzYyBvZmYpIHtcbi1cdFx0XHRicmVsc2UoYnApO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXG4tXHRcdHN3aXRjaCAoKHVfaW50MzJfdCkoZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKSBcdTAwM2VcdTAwM2Vcbi1cdFx0XHRcdFZYRlNfVFlQRURfVFlQRVNISUZUKSkge1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6XG4tXHRcdFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9ibG9jayksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpLFxuLVx0XHRcdFx0XHRibG9jayAtIG9mZik7XG4tXHRcdFx0aWYgKHBibG9jayA9PSAtMilcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfREFUQTpcbi1cdFx0XHRpZiAoKGJsb2NrIC0gb2ZmKSBcdTAwM2U9IGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpKVxuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0cGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfYmxvY2spICsgYmxvY2sgLSBvZmY7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OlxuLVx0XHRjYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7XG4tXHRcdFx0c3RydWN0IHZ4ZnNfdHlwZWRfZGV2NFx0KnR5cDQgPVxuLVx0XHRcdFx0KHN0cnVjdCB2eGZzX3R5cGVkX2RldjQgKil0eXA7XG4tXG4tXHRcdFx0cHJpbnRrKEtFUk5fSU5GTyBcIlxcblxcblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXFxuXCIpO1xuLVx0XHRcdHByaW50ayhLRVJOX0lORk8gXCJibG9jazogJWxsdVxcdHNpemU6ICVsbGRcXHRkZXY6ICVkXFxuXCIsXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfYmxvY2spLFxuLVx0XHRcdCAgICAgICBmczY0X3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X3NpemUpLFxuLVx0XHRcdCAgICAgICBmczMyX3RvX2NwdShzYmksIHR5cDQtXHUwMDNldmQ0X2RldikpO1xuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0fVxuLVx0XHRkZWZhdWx0OlxuLVx0XHRcdHByaW50ayhLRVJOX0VSUiBcIiVzOiVkIHZ0X2hkciAlbGx1XFxuXCIsIF9fZnVuY19fLFxuLVx0XHRcdFx0X19MSU5FX18sIGZzNjRfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2hkcikpO1xuLVx0XHRcdEJVRygpO1xuLVx0XHR9XG4tXHRcdGJyZWxzZShicCk7XG4tXHR9XG4tXG4tZmFpbDpcbi1cdHBibG9jayA9IDA7XG4tb3V0OlxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiAocGJsb2NrKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19ibWFwX3R5cGVkIC0gYm1hcCBmb3IgdHlwZWQgZXh0ZW50c1xuLSAqIEBpcDpcdFx0cG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3Jcbi0gKiBAaWJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBQZXJmb3JtcyB0aGUgYm1hcCBvcGVyYXRpb24gZm9yIHR5cGVkIGV4dGVudHMuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uXG4tICovXG4tc3RhdGljIGRhZGRyX3Rcbi12eGZzX2JtYXBfdHlwZWQoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwID0gVlhGU19JTk8oaXApO1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqc2JpID0gVlhGU19TQkkoaXAtXHUwMDNlaV9zYik7XG4tXHRkYWRkcl90XHRcdFx0XHRwYmxvY2sgPSAwO1xuLVx0aW50XHRcdFx0XHRpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVlhGU19OVFlQRUQ7IGkrKykge1xuLVx0XHRzdHJ1Y3Qgdnhmc190eXBlZFx0KnR5cCA9IHZpcC1cdTAwM2V2aWlfb3JnLnR5cGVkICsgaTtcbi1cdFx0dTY0XHRcdFx0aGRyID0gZnM2NF90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfaGRyKTtcbi1cdFx0aW50NjRfdFx0XHRcdG9mZiA9IChoZHIgXHUwMDI2IFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc190eXBkdW1wKHR5cCk7XG4tI2VuZGlmXG4tXHRcdGlmIChpYmxvY2sgXHUwMDNjIG9mZilcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0c3dpdGNoICgodTMyKShoZHIgXHUwMDNlXHUwMDNlIFZYRlNfVFlQRURfVFlQRVNISUZUKSkge1xuLVx0XHRjYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6XG4tXHRcdFx0cGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLFxuLVx0XHRcdFx0XHRmczMyX3RvX2NwdShzYmksIHR5cC1cdTAwM2V2dF9ibG9jayksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X3NpemUpLFxuLVx0XHRcdFx0XHRpYmxvY2sgLSBvZmYpO1xuLVx0XHRcdGlmIChwYmxvY2sgPT0gLTIpXG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHRyZXR1cm4gKHBibG9jayk7XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBOlxuLVx0XHRcdGlmICgoaWJsb2NrIC0gb2ZmKSBcdTAwM2MgZnMzMl90b19jcHUoc2JpLCB0eXAtXHUwMDNldnRfc2l6ZSkpXG4tXHRcdFx0XHRyZXR1cm4gKGZzMzJfdG9fY3B1KHNiaSwgdHlwLVx1MDAzZXZ0X2Jsb2NrKSArXG4tXHRcdFx0XHRcdFx0aWJsb2NrIC0gb2ZmKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0Y2FzZSBWWEZTX1RZUEVEX0lORElSRUNUX0RFVjQ6XG4tXHRcdGNhc2UgVlhGU19UWVBFRF9EQVRBX0RFVjQ6IHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0XHQqdHlwNCA9XG4tXHRcdFx0XHQoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDtcbi1cbi1cdFx0XHRwcmludGsoS0VSTl9JTkZPIFwiXFxuXFxuVFlQRURfREVWNCBkZXRlY3RlZCFcXG5cIik7XG4tXHRcdFx0cHJpbnRrKEtFUk5fSU5GTyBcImJsb2NrOiAlbGx1XFx0c2l6ZTogJWxsZFxcdGRldjogJWRcXG5cIixcbi1cdFx0XHQgICAgICAgZnM2NF90b19jcHUoc2JpLCB0eXA0LVx1MDAzZXZkNF9ibG9jayksXG4tXHRcdFx0ICAgICAgIGZzNjRfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfc2l6ZSksXG4tXHRcdFx0ICAgICAgIGZzMzJfdG9fY3B1KHNiaSwgdHlwNC1cdTAwM2V2ZDRfZGV2KSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbi1cdFx0ZGVmYXVsdDpcbi1cdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0cmV0dXJuIDA7XG4tXHRcdH1cbi1cdH1cbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2JtYXAxIC0gdnhmcy1pbnRlcm5hbCBibWFwIG9wZXJhdGlvblxuLSAqIEBpcDpcdFx0XHRwb2ludGVyIHRvIHRoZSBpbm9kZSB3ZSBkbyBibWFwIGZvclxuLSAqIEBpYmxvY2s6XHRcdGxvZ2ljYWwgYmxvY2tcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19ibWFwMSBwZXJmb21zIGEgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXG4tICogICBmb3Igdnhmcy1pbnRlcm5hbCBwdXJwb3Nlcy5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1kYWRkcl90XG4tdnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHRcdCp2aXAgPSBWWEZTX0lOTyhpcCk7XG4tXG4tXHRpZiAoVlhGU19JU0VYVDQodmlwKSlcbi1cdFx0cmV0dXJuIHZ4ZnNfYm1hcF9leHQ0KGlwLCBpYmxvY2spO1xuLVx0aWYgKFZYRlNfSVNUWVBFRCh2aXApKVxuLVx0XHRyZXR1cm4gdnhmc19ibWFwX3R5cGVkKGlwLCBpYmxvY2spO1xuLVx0aWYgKFZYRlNfSVNOT05FKHZpcCkpXG4tXHRcdGdvdG8gdW5zdXBwO1xuLVx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxuLVx0XHRnb3RvIHVuc3VwcDtcbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBpbm9kZSAlbGx1IGhhcyBubyB2YWxpZCBvcmd0eXBlICgleClcXG5cIixcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdEJVRygpO1xuLVxuLXVuc3VwcDpcbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBpbm9kZSAlbGx1IGhhcyBhbiB1bnN1cHBvcnRlZCBvcmd0eXBlICgleClcXG5cIixcbi1cdFx0XHRpcC1cdTAwM2VpX2lubywgdmlwLVx1MDAzZXZpaV9vcmd0eXBlKTtcbi1cdHJldHVybiAwO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCA4YzY3NjI3ZjJhM2Q5Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oXG4rKysgL2Rldi9udWxsXG5AQCAtMSw2OCArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19ESVJfSF9cbi0jZGVmaW5lIF9WWEZTX0RJUl9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIFZ4RlMgZGlyZWN0b3J5IGJsb2NrIGhlYWRlci5cbi0gKlxuLSAqIFRoaXMgZW50cnkgaXMgdGhlIGhlYWQgb2YgZXZlcnkgZmlsZXN5c3RlbSBibG9jayBpbiBhIGRpcmVjdG9yeS5cbi0gKiBJdCBpcyB1c2VkIGZvciBmcmVlIHNwYWNlIG1hbmFnZW1lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlc1xuLSAqIGEgaGFzaCBmb3Igc3BlZWRpbmcgdXAgZGlyZWN0b3J5IHNlYXJjaCAobG9va3VwKS5cbi0gKlxuLSAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGVcbi0gKiBMaW51eCBkcml2ZXIgZm9yIG5vdy5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaXJibGsge1xuLVx0X19mczE2XHRcdGRfZnJlZTtcdFx0LyogZnJlZSBzcGFjZSBpbiBkaXJibG9jayAqL1xuLVx0X19mczE2XHRcdGRfbmhhc2g7XHQvKiBubyBvZiBoYXNoIGNoYWlucyAqL1xuLVx0X19mczE2XHRcdGRfaGFzaFtdO1x0LyogaGFzaCBjaGFpbiAqL1xuLX07XG4tXG4tLypcbi0gKiBWWEZTX05BTUVMRU4gaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBkX25hbWUgZmllbGRcbi0gKlx0b2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tI2RlZmluZSBWWEZTX05BTUVMRU5cdDI1NlxuLVxuLS8qXG4tICogVnhGUyBkaXJlY3RvcnkgZW50cnkuXG4tICovXG4tc3RydWN0IHZ4ZnNfZGlyZWN0IHtcbi1cdF9fZnMzMlx0XHRkX2lubztcdFx0XHQvKiBpbm9kZSBudW1iZXIgKi9cbi1cdF9fZnMxNlx0XHRkX3JlY2xlbjtcdFx0LyogcmVjb3JkIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfbmFtZWxlbjtcdFx0LyogZF9uYW1lIGxlbmd0aCAqL1xuLVx0X19mczE2XHRcdGRfaGFzaG5leHQ7XHRcdC8qIG5leHQgaGFzaCBlbnRyeSAqL1xuLVx0Y2hhclx0XHRkX25hbWVbVlhGU19OQU1FTEVOXTtcdC8qIG5hbWUgKi9cbi19O1xuLVxuLS8qXG4tICogVlhGU19ESVJQQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJ5IGJvdW5kYXJpZXMsIGlzIF9tdXN0XyBiZVxuLSAqXHRhIG11bHRpcGxlIG9mIGZvdXIuXG4tICogVlhGU19OQU1FTUlOIGlzIHRoZSBsZW5ndGggb2YgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIE5VTEwgZF9uYW1lLlxuLSAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWVcbi0gKlx0dXNhYmxlIGZvciBkaXJlY3Rvcnkgc2l6ZXMuXG4tICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGhcbi0gKlx0YSBkX25hbWUgd2l0aCBzaXplIGxlbi5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSUEFEXHRcdDRcbi0jZGVmaW5lIFZYRlNfTkFNRU1JTlx0XHRvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSlcbi0jZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKVx0KChWWEZTX0RJUlBBRCArIChsZW4pIC0gMSkgXHUwMDI2IH4oVlhGU19ESVJQQUQgLTEpKVxuLSNkZWZpbmUgVlhGU19ESVJMRU4obGVuKVx0KFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICsgKGxlbikpKVxuLVxuLS8qXG4tICogVlhGU19ESVJCTEtPViBpcyB0aGUgb3ZlcmhlYWQgb2YgYSBzcGVjaWZpYyBkaXJibG9jay5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfRElSQkxLT1Yoc2JpLCBkYnApXHRcXFxuLVx0KChzaXplb2Yoc2hvcnQpICogZnMxNl90b19jcHUoc2JpLCBkYnAtXHUwMDNlZF9uaGFzaCkpICsgNClcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRElSX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggM2EyMTgwYzVlMjA4ZC4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaFxuKysrIC9kZXYvbnVsbFxuQEAgLTEsNDkgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfRVhURVJOX0hfXG4tI2RlZmluZSBfVlhGU19FWFRFUk5fSF9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBleHRlcm5hbCBwcm90b3R5cGVzLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHByb3RvdHlwZXMgZm9yIGFsbCB2eGZzIGZ1bmN0aW9ucyB1c2VkXG4tICogb3V0c2lkZSB0aGVpciByZXNwZWN0aXZlIHNvdXJjZSBmaWxlcy5cbi0gKi9cbi1cbi1cbi1zdHJ1Y3Qga21lbV9jYWNoZTtcbi1zdHJ1Y3Qgc3VwZXJfYmxvY2s7XG4tc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbztcbi1zdHJ1Y3QgaW5vZGU7XG4tXG4tXG4tLyogdnhmc19ibWFwLmMgKi9cbi1leHRlcm4gZGFkZHJfdFx0XHRcdHZ4ZnNfYm1hcDEoc3RydWN0IGlub2RlICosIGxvbmcpO1xuLVxuLS8qIHZ4ZnNfZnNoZWFkLmMgKi9cbi1leHRlcm4gaW50XHRcdFx0dnhmc19yZWFkX2ZzaGVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7XG4tXG4tLyogdnhmc19pbm9kZS5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzO1xuLWV4dGVybiB2b2lkXHRcdFx0dnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTtcbi1leHRlcm4gc3RydWN0IGlub2RlXHRcdCp2eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZywgaW5vX3QpO1xuLWV4dGVybiBzdHJ1Y3QgaW5vZGVcdFx0KnZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XG4tZXh0ZXJuIHN0cnVjdCBpbm9kZVx0XHQqdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7XG4tZXh0ZXJuIHZvaWRcdFx0XHR2eGZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqKTtcbi1cbi0vKiB2eGZzX2xvb2t1cC5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zXHR2eGZzX2Rpcl9pbm9kZV9vcHM7XG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnNcdHZ4ZnNfZGlyX29wZXJhdGlvbnM7XG4tXG4tLyogdnhmc19vbHQuYyAqL1xuLWV4dGVybiBpbnRcdFx0XHR2eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1X2xvbmcpO1xuLVxuLS8qIHZ4ZnNfc3Vici5jICovXG4tZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzO1xuLWV4dGVybiBzdHJ1Y3QgcGFnZSAqXHRcdHZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgdV9sb25nKTtcbi1leHRlcm4gdm9pZFx0XHRcdHZ4ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKik7XG4tZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqXHR2eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqLCBpbnQpO1xuLVxuLSNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBlNmFiOGJkZjdhNmNhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwxNjYgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciByb3V0aW5lcy5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2lub2RlLmhcIlxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2ZzaGVhZC5oXCJcbi1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLXN0YXRpYyB2b2lkXG4tdnhmc19kdW1wZnNoKHN0cnVjdCB2eGZzX2ZzaCAqZmhwKVxuLXtcbi1cdHByaW50ayhcIlxcblxcbmR1bXBpbmcgZmlsZXNldCBoZWFkZXI6XFxuXCIpO1xuLVx0cHJpbnRrKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblwiKTtcbi1cdHByaW50ayhcInZlcnNpb246ICV1XFxuXCIsIGZocC1cdTAwM2Vmc2hfdmVyc2lvbik7XG4tXHRwcmludGsoXCJmc2luZGV4OiAldVxcblwiLCBmaHAtXHUwMDNlZnNoX2ZzaW5kZXgpO1xuLVx0cHJpbnRrKFwiaWF1aW5vOiAldVxcdG5pbm9kZXM6JXVcXG5cIixcbi1cdFx0XHRmaHAtXHUwMDNlZnNoX2lhdWlubywgZmhwLVx1MDAzZWZzaF9uaW5vZGVzKTtcbi1cdHByaW50ayhcIm1heGlub2RlOiAldVxcdGxjdGlubzogJXVcXG5cIixcbi1cdFx0XHRmaHAtXHUwMDNlZnNoX21heGlub2RlLCBmaHAtXHUwMDNlZnNoX2xjdGlubyk7XG4tXHRwcmludGsoXCJuYXU6ICV1XFxuXCIsIGZocC1cdTAwM2Vmc2hfbmF1KTtcbi1cdHByaW50ayhcImlsaXN0aW5vWzBdOiAldVxcdGlsaXN0aW5vWzFdOiAldVxcblwiLFxuLVx0XHRcdGZocC1cdTAwM2Vmc2hfaWxpc3Rpbm9bMF0sIGZocC1cdTAwM2Vmc2hfaWxpc3Rpbm9bMV0pO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX2dldGZzaCAtIHJlYWQgZmlsZXNldCBoZWFkZXIgaW50byBtZW1vcnlcbi0gKiBAaXA6XHRcdHRoZSAoZmFrZSkgZmlsZXNldCBoZWFkZXIgaW5vZGVcbi0gKiBAd2hpY2g6XHQwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlclxuLSAqICAgZGVzY3JpYmVkIGJ5IEBpcCBpbnRvIG1lbW9yeS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby5cbi0gKi9cbi1zdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICpcbi12eGZzX2dldGZzaChzdHJ1Y3QgaW5vZGUgKmlwLCBpbnQgd2hpY2gpXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHRcdCpicDtcbi1cbi1cdGJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpO1xuLVx0aWYgKGJwKSB7XG4tXHRcdHN0cnVjdCB2eGZzX2ZzaFx0XHQqZmhwO1xuLVxuLVx0XHRpZiAoIShmaHAgPSBrbWFsbG9jX29iaigqZmhwKSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdG1lbWNweShmaHAsIGJwLVx1MDAzZWJfZGF0YSwgc2l6ZW9mKCpmaHApKTtcbi1cbi1cdFx0cHV0X2JoKGJwKTtcbi1cdFx0cmV0dXJuIChmaHApO1xuLVx0fVxuLW91dDpcbi1cdGJyZWxzZShicCk7XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19yZWFkX2ZzaGVhZCAtIHJlYWQgdGhlIGZpbGVzZXQgaGVhZGVyc1xuLSAqIEBzYnA6XHRzdXBlcmJsb2NrIHRvIHdoaWNoIHRoZSBmaWxlc2V0IGJlbG9uZ3Ncbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX2ZzaGVhZCB3aWxsIGZpbGwgdGhlIGlub2RlIGFuZCBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW4gQHNiLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKC1FSU5WQUwpLlxuLSAqL1xuLWludFxuLXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqaW5mcCA9IFZYRlNfU0JJKHNicCk7XG4tXHRzdHJ1Y3Qgdnhmc19mc2hcdFx0XHQqcGZwLCAqc2ZwO1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwO1xuLVxuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLVx1MDAzZXZzaV9pZXh0LCBpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9mc2hpcCkge1xuLVx0XHRwcmludGsoS0VSTl9FUlIgXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBmc2ggaW5vZGVcXG5cIik7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVx0fVxuLVxuLVx0dmlwID0gVlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aWYgKCFWWEZTX0lTRlNIKHZpcCkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXFxuXCIsXG4tXHRcdFx0XHR2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfZnNoaXA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHByaW50ayhcInZ4ZnM6IGZzaCBpbm9kZSBkdW1wOlxcblwiKTtcbi1cdHZ4ZnNfZHVtcGkodmlwLCBpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLSNlbmRpZlxuLVxuLVx0c2ZwID0gdnhmc19nZXRmc2goaW5mcC1cdTAwM2V2c2lfZnNoaXAsIDApO1xuLVx0aWYgKCFzZnApIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogdW5hYmxlIHRvIGdldCBzdHJ1Y3R1cmFsIGZzaFxcblwiKTtcbi1cdFx0Z290byBvdXRfaXB1dF9mc2hpcDtcbi1cdH0gXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChzZnApO1xuLSNlbmRpZlxuLVxuLVx0cGZwID0gdnhmc19nZXRmc2goaW5mcC1cdTAwM2V2c2lfZnNoaXAsIDEpO1xuLVx0aWYgKCFwZnApIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogdW5hYmxlIHRvIGdldCBwcmltYXJ5IGZzaFxcblwiKTtcbi1cdFx0Z290byBvdXRfZnJlZV9zZnA7XG4tXHR9XG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdHZ4ZnNfZHVtcGZzaChwZnApO1xuLSNlbmRpZlxuLVxuLVx0aW5mcC1cdTAwM2V2c2lfc3RpbGlzdCA9IHZ4ZnNfYmxraWdldChzYnAsIGluZnAtXHUwMDNldnNpX2lleHQsXG4tXHRcdFx0ZnMzMl90b19jcHUoaW5mcCwgc2ZwLVx1MDAzZWZzaF9pbGlzdGlub1swXSkpO1xuLVx0aWYgKCFpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgc3RydWN0dXJhbCBsaXN0IGlub2RlXFxuXCIpO1xuLVx0XHRnb3RvIG91dF9mcmVlX3BmcDtcbi1cdH1cbi1cdGlmICghVlhGU19JU0lMVChWWEZTX0lOTyhpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogc3RydWN0dXJhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxcblwiLFxuLVx0XHRcdFx0VlhGU19JTk8oaW5mcC1cdTAwM2V2c2lfc3RpbGlzdCktXHUwMDNldmlpX21vZGUgXHUwMDI2IFZYRlNfVFlQRV9NQVNLKTsgXG4tXHRcdGdvdG8gb3V0X2lwdXRfc3RpbGlzdDtcbi1cdH1cbi1cbi1cdGluZnAtXHUwMDNldnNpX2lsaXN0ID0gdnhmc19zdGlnZXQoc2JwLCBmczMyX3RvX2NwdShpbmZwLCBwZnAtXHUwMDNlZnNoX2lsaXN0aW5vWzBdKSk7XG4tXHRpZiAoIWluZnAtXHUwMDNldnNpX2lsaXN0KSB7XG4tXHRcdHByaW50ayhLRVJOX0VSUiBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgaW5vZGUgbGlzdCBpbm9kZVxcblwiKTtcbi1cdFx0Z290byBvdXRfaXB1dF9zdGlsaXN0O1xuLVx0fVxuLVx0aWYgKCFWWEZTX0lTSUxUKFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KSkpIHtcbi1cdFx0cHJpbnRrKEtFUk5fRVJSIFwidnhmczogaW5vZGUgbGlzdCBpbm9kZSBpcyBvZiB3cm9uZyB0eXBlICgleClcXG5cIixcbi1cdFx0XHRcdFZYRlNfSU5PKGluZnAtXHUwMDNldnNpX2lsaXN0KS1cdTAwM2V2aWlfbW9kZSBcdTAwMjYgVlhGU19UWVBFX01BU0spO1xuLVx0XHRnb3RvIG91dF9pcHV0X2lsaXN0O1xuLVx0fVxuLVxuLVx0a2ZyZWUocGZwKTtcbi1cdGtmcmVlKHNmcCk7XG4tXHRyZXR1cm4gMDtcbi1cbi0gb3V0X2lwdXRfaWxpc3Q6XG4tIFx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tIG91dF9pcHV0X3N0aWxpc3Q6XG4tIFx0aXB1dChpbmZwLVx1MDAzZXZzaV9zdGlsaXN0KTtcbi0gb3V0X2ZyZWVfcGZwOlxuLVx0a2ZyZWUocGZwKTtcbi0gb3V0X2ZyZWVfc2ZwOlxuLSBcdGtmcmVlKHNmcCk7XG4tIG91dF9pcHV0X2ZzaGlwOlxuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9mc2hpcCk7XG4tXHRyZXR1cm4gLUVJTlZBTDtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmhcbmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggZGZkMjE0NzU5OWM0OS4uMDAwMDAwMDAwMDAwMFxuLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuaFxuKysrIC9kZXYvbnVsbFxuQEAgLTEsNDMgKzAsMCBAQFxuLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi0jaWZuZGVmIF9WWEZTX0ZTSEVBRF9IX1xuLSNkZWZpbmUgX1ZYRlNfRlNIRUFEX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgc3RydWN0dXJlcy5cbi0gKlxuLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTXG4tICogZmlsZXNldCBoZWFkZXIuXG4tICovXG4tXG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19mc2gge1xuLVx0X19mczMyXHRcdGZzaF92ZXJzaW9uO1x0XHQvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2ZzaW5kZXg7XHRcdC8qIGZpbGVzZXQgaW5kZXggKi9cbi1cdF9fZnMzMlx0XHRmc2hfdGltZTtcdFx0LyogbW9kaWZpY2F0aW9uIHRpbWUgLSBzZWMgKi9cbi1cdF9fZnMzMlx0XHRmc2hfdXRpbWU7XHRcdC8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdGZzaF9leHRvcDtcdFx0LyogZXh0b3AgZmxhZ3MgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbmlub2RlcztcdFx0LyogYWxsb2NhdGVkIGlub2RlcyAqL1xuLVx0X19mczMyXHRcdGZzaF9uYXU7XHRcdC8qIG51bWJlciBvZiBJQVVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX29sZF9pbGVzaXplO1x0Lyogb2xkIHNpemUgb2YgaWxpc3QgKi9cbi1cdF9fZnMzMlx0XHRmc2hfZGZsYWdzO1x0XHQvKiBmbGFncyAqL1xuLVx0X19mczMyXHRcdGZzaF9xdW90YTtcdFx0LyogcXVvdGEgbGltaXQgKi9cbi1cdF9fZnMzMlx0XHRmc2hfbWF4aW5vZGU7XHRcdC8qIG1heGltdW0gaW5vZGUgbnVtYmVyICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lhdWlubztcdFx0LyogSUFVIGlub2RlICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2lsaXN0aW5vWzJdO1x0LyogaWxpc3QgaW5vZGVzICovXG4tXHRfX2ZzMzJcdFx0ZnNoX2xjdGlubztcdFx0LyogbGluayBjb3VudCB0YWJsZSBpbm9kZSAqL1xuLVxuLVx0Lypcbi1cdCAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXlcbi1cdCAqICBhKSBhcmUgbm90IG9mIGFueSBpbnRlcmVzdCBmb3IgdXMsIGFuZFxuLVx0ICogIGIpIGRpZmZlciBhIGxvdCBpbiBkaWZmZXJlbnQgdnhmcyB2ZXJzaW9ucy9wb3J0c1xuLVx0ICovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbW1lZC5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGVkNTFmY2QzNDc1NzIuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsNTMgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cHBvcnQgZm9yICdpbW1lZCcgaW5vZGVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tXG4tLyoqXG4tICogdnhmc19pbW1lZF9yZWFkX2ZvbGlvIC0gcmVhZCBwYXJ0IG9mIGFuIGltbWVkIGlub2RlIGludG8gcGFnZWNhY2hlXG4tICogQGZwOlx0XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ltbWVkX3JlYWRfZm9saW8gcmVhZHMgYSBwYXJ0IG9mIHRoZSBpbW1lZCBhcmVhIG9mIHRoZVxuLSAqICAgZmlsZSB0aGF0IGhvc3RzIEBmb2xpbyBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKlxuLSAqIExvY2tpbmcgc3RhdHVzOlxuLSAqICAgQGZvbGlvIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfaW1tZWRfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oZm9saW8tXHUwMDNlbWFwcGluZy1cdTAwM2Vob3N0KTtcbi1cdHZvaWQgKnNyYyA9IHZpcC1cdTAwM2V2aWlfaW1tZWQudmlfaW1tZWQgKyBmb2xpb19wb3MoZm9saW8pO1xuLVx0dW5zaWduZWQgbG9uZyBpO1xuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZm9saW9fbnJfcGFnZXMoZm9saW8pOyBpKyspIHtcbi1cdFx0bWVtY3B5X3RvX3BhZ2UoZm9saW9fcGFnZShmb2xpbywgaSksIDAsIHNyYywgUEFHRV9TSVpFKTtcbi1cdFx0c3JjICs9IFBBR0VfU0laRTtcbi1cdH1cbi1cbi1cdGZvbGlvX21hcmtfdXB0b2RhdGUoZm9saW8pO1xuLVx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi1cbi1cdHJldHVybiAwO1xuLX1cbi1cbi0vKlxuLSAqIEFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW1tZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuLSAqL1xuLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzID0ge1xuLVx0LnJlYWRfZm9saW8gPVx0dnhmc19pbW1lZF9yZWFkX2ZvbGlvLFxuLX07XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDIxZmM5NGI5ODIwOWYuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMzE0ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgcm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L25hbWVpLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2lub2RlLmhcIlxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tXG4tXG4tI2lmZGVmIERJQUdOT1NUSUNcbi0vKlxuLSAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuXG4tICovXG4tdm9pZFxuLXZ4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pXG4te1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJcXG5cXG5cIik7XG4tXHRpZiAoaW5vKVxuLVx0XHRwcmludGsoS0VSTl9ERUJVRyBcImR1bXBpbmcgdnhmcyBpbm9kZSAlbGRcXG5cIiwgaW5vKTtcbi1cdGVsc2Vcbi1cdFx0cHJpbnRrKEtFUk5fREVCVUcgXCJkdW1waW5nIHVua25vd24gdnhmcyBpbm9kZVxcblwiKTtcbi1cbi1cdHByaW50ayhLRVJOX0RFQlVHIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCIpO1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJtb2RlIGlzICV4XFxuXCIsIHZpcC1cdTAwM2V2aWlfbW9kZSk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcIm5saW5rOiV1LCB1aWQ6JXUsIGdpZDoldVxcblwiLFxuLVx0XHRcdHZpcC1cdTAwM2V2aWlfbmxpbmssIHZpcC1cdTAwM2V2aWlfdWlkLCB2aXAtXHUwMDNldmlpX2dpZCk7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcInNpemU6JUx4LCBibG9ja3M6JXVcXG5cIixcbi1cdFx0XHR2aXAtXHUwMDNldmlpX3NpemUsIHZpcC1cdTAwM2V2aWlfYmxvY2tzKTtcbi1cdHByaW50ayhLRVJOX0RFQlVHIFwib3JndHlwZToldVxcblwiLCB2aXAtXHUwMDNldmlpX29yZ3R5cGUpO1xuLX1cbi0jZW5kaWZcbi1cbi0vKipcbi0gKiB2eGZzX3RyYW5zbW9kIC0gbW9kZSBmb3IgYSBWeEZTIGlub2RlXG4tICogQHZpcDpcdFZ4RlMgaW5vZGVcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW5cbi0gKiAgVnhGUyBpbm9kZSBzdHJ1Y3R1cmUuXG4tICovXG4tc3RhdGljIF9faW5saW5lX18gdW1vZGVfdFxuLXZ4ZnNfdHJhbnNtb2Qoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKVxuLXtcbi1cdHVtb2RlX3RcdFx0XHRyZXQgPSB2aXAtXHUwMDNldmlpX21vZGUgXHUwMDI2IH5WWEZTX1RZUEVfTUFTSztcbi1cbi1cdGlmIChWWEZTX0lTRklGTyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRklGTztcbi1cdGlmIChWWEZTX0lTQ0hSKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGQ0hSO1xuLVx0aWYgKFZYRlNfSVNESVIodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZESVI7XG4tXHRpZiAoVlhGU19JU0JMSyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRkJMSztcbi1cdGlmIChWWEZTX0lTTE5LKHZpcCkpXG4tXHRcdHJldCB8PSBTX0lGTE5LO1xuLVx0aWYgKFZYRlNfSVNSRUcodmlwKSlcbi1cdFx0cmV0IHw9IFNfSUZSRUc7XG4tXHRpZiAoVlhGU19JU1NPQyh2aXApKVxuLVx0XHRyZXQgfD0gU19JRlNPQ0s7XG4tXG4tXHRyZXR1cm4gKHJldCk7XG4tfVxuLVxuLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXAydmlwX2NweShzdHJ1Y3Qgdnhmc19zYl9pbmZvICpzYmksXG4tXHRcdHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgc3RydWN0IHZ4ZnNfZGlub2RlICpkaXApXG4te1xuLVx0c3RydWN0IGlub2RlICppbm9kZSA9IFx1MDAyNnZpcC1cdTAwM2V2ZnNfaW5vZGU7XG4tXG4tXHR2aXAtXHUwMDNldmlpX21vZGUgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfbW9kZSk7XG4tXHR2aXAtXHUwMDNldmlpX25saW5rID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX25saW5rKTtcbi1cdHZpcC1cdTAwM2V2aWlfdWlkID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3VpZCk7XG4tXHR2aXAtXHUwMDNldmlpX2dpZCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9naWQpO1xuLVx0dmlwLVx1MDAzZXZpaV9zaXplID0gZnM2NF90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3NpemUpO1xuLVx0dmlwLVx1MDAzZXZpaV9hdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2F1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9hdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9tdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX211dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9tdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9jdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdGltZSk7XG4tXHR2aXAtXHUwMDNldmlpX2N1dGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9jdXRpbWUpO1xuLVx0dmlwLVx1MDAzZXZpaV9vcmd0eXBlID0gZGlwLVx1MDAzZXZkaV9vcmd0eXBlO1xuLVxuLVx0dmlwLVx1MDAzZXZpaV9ibG9ja3MgPSBmczMyX3RvX2NwdShzYmksIGRpcC1cdTAwM2V2ZGlfYmxvY2tzKTtcbi1cdHZpcC1cdTAwM2V2aWlfZ2VuID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX2dlbik7XG4tXG4tXHRpZiAoVlhGU19JU0RJUih2aXApKVxuLVx0XHR2aXAtXHUwMDNldmlpX2RvdGRvdCA9IGZzMzJfdG9fY3B1KHNiaSwgZGlwLVx1MDAzZXZkaV9kb3Rkb3QpO1xuLVx0ZWxzZSBpZiAoIVZYRlNfSVNSRUcodmlwKSBcdTAwMjZcdTAwMjYgIVZYRlNfSVNMTksodmlwKSlcbi1cdFx0dmlwLVx1MDAzZXZpaV9yZGV2ID0gZnMzMl90b19jcHUoc2JpLCBkaXAtXHUwMDNldmRpX3JkZXYpO1xuLVxuLVx0LyogZG9uJ3QgZW5kaWFuIHN3YXAgdGhlIGZpZWxkcyB0aGF0IGRpZmZlciBieSBvcmd0eXBlICovXG4tXHRtZW1jcHkoXHUwMDI2dmlwLVx1MDAzZXZpaV9vcmcsIFx1MDAyNmRpcC1cdTAwM2V2ZGlfb3JnLCBzaXplb2YodmlwLVx1MDAzZXZpaV9vcmcpKTtcbi1cbi1cdGlub2RlLVx1MDAzZWlfbW9kZSA9IHZ4ZnNfdHJhbnNtb2QodmlwKTtcbi1cdGlfdWlkX3dyaXRlKGlub2RlLCAodWlkX3QpdmlwLVx1MDAzZXZpaV91aWQpO1xuLVx0aV9naWRfd3JpdGUoaW5vZGUsIChnaWRfdCl2aXAtXHUwMDNldmlpX2dpZCk7XG4tXG4tXHRzZXRfbmxpbmsoaW5vZGUsIHZpcC1cdTAwM2V2aWlfbmxpbmspO1xuLVx0aW5vZGUtXHUwMDNlaV9zaXplID0gdmlwLVx1MDAzZXZpaV9zaXplO1xuLVxuLVx0aW5vZGVfc2V0X2F0aW1lKGlub2RlLCB2aXAtXHUwMDNldmlpX2F0aW1lLCAwKTtcbi1cdGlub2RlX3NldF9jdGltZShpbm9kZSwgdmlwLVx1MDAzZXZpaV9jdGltZSwgMCk7XG4tXHRpbm9kZV9zZXRfbXRpbWUoaW5vZGUsIHZpcC1cdTAwM2V2aWlfbXRpbWUsIDApO1xuLVxuLVx0aW5vZGUtXHUwMDNlaV9ibG9ja3MgPSB2aXAtXHUwMDNldmlpX2Jsb2Nrcztcbi1cdGlub2RlLVx1MDAzZWlfZ2VuZXJhdGlvbiA9IHZpcC1cdTAwM2V2aWlfZ2VuO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2Jsa2lnZXQgLSBmaW5kIGlub2RlIGJhc2VkIG9uIGV4dGVudCAjXG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW0gd2Ugc2VhcmNoIGluXG4tICogQGV4dGVudDpcdG51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaFxuLSAqIEBpbm86XHRpbm9kZSBudW1iZXIgdG8gc2VhcmNoXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19ibGtpZ2V0IHNlYXJjaGVzIGlub2RlIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5XG4tICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50LlxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBWeEZTIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICpcbi0gKiBOT1RFOlxuLSAqICBXaGlsZSBfX3Z4ZnNfaWdldCB1c2VzIHRoZSBwYWdlY2FjaGUgdnhmc19ibGtpZ2V0IHVzZXMgdGhlXG4tICogIGJ1ZmZlcmNhY2hlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGVcbi0gKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50LlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19ibGtpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgZXh0ZW50LCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHRcdCpicDtcbi1cdHN0cnVjdCBpbm9kZVx0XHRcdCppbm9kZTtcbi1cdHVfbG9uZ1x0XHRcdFx0YmxvY2ssIG9mZnNldDtcbi1cbi1cdGlub2RlID0gbmV3X2lub2RlKHNicCk7XG4tXHRpZiAoIWlub2RlKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdGlub2RlLVx1MDAzZWlfaW5vID0gZ2V0X25leHRfaW5vKCk7XG4tXG4tXHRibG9jayA9IGV4dGVudCArICgoaW5vICogVlhGU19JU0laRSkgLyBzYnAtXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0b2Zmc2V0ID0gKChpbm8gJSAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gVlhGU19JU0laRSkpICogVlhGU19JU0laRSk7XG4tXHRicCA9IHNiX2JyZWFkKHNicCwgYmxvY2spO1xuLVxuLVx0aWYgKGJwIFx1MDAyNlx1MDAyNiBidWZmZXJfbWFwcGVkKGJwKSkge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvXHQqdmlwID0gVlhGU19JTk8oaW5vZGUpO1xuLVx0XHRzdHJ1Y3Qgdnhmc19kaW5vZGVcdCpkaXA7XG4tXG4tXHRcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoYnAtXHUwMDNlYl9kYXRhICsgb2Zmc2V0KTtcbi1cdFx0ZGlwMnZpcF9jcHkoVlhGU19TQkkoc2JwKSwgdmlwLCBkaXApO1xuLVx0XHR2aXAtXHUwMDNldmZzX2lub2RlLmlfbWFwcGluZy1cdTAwM2VhX29wcyA9IFx1MDAyNnZ4ZnNfYW9wcztcbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0XHR2eGZzX2R1bXBpKHZpcCwgaW5vKTtcbi0jZW5kaWZcbi1cdFx0YnJlbHNlKGJwKTtcbi1cdFx0cmV0dXJuIGlub2RlO1xuLVx0fVxuLVxuLVx0cHJpbnRrKEtFUk5fV0FSTklORyBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxcblwiLCBibG9jayk7XG4tXHRicmVsc2UoYnApO1xuLVx0aXB1dChpbm9kZSk7XG4tXHRyZXR1cm4gTlVMTDtcbi19XG4tXG4tLyoqXG4tICogX192eGZzX2lnZXQgLSBnZW5lcmljIGZpbmQgaW5vZGUgZmFjaWxpdHlcbi0gKiBAaWxpc3RwOlx0XHRpbm9kZSBsaXN0XG4tICogQHZpcDpcdFx0VnhGUyBpbm9kZSB0byBmaWxsIGluXG4tICogQGlubzpcdFx0aW5vZGUgbnVtYmVyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgU2VhcmNoIHRoZSBmb3IgaW5vZGUgbnVtYmVyIEBpbm8gaW4gdGhlIGZpbGVzeXN0ZW1cbi0gKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuXG4tICogIFJldHVybnMgdGhlIG1hdGNoaW5nIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYW4gZXJyb3IgY29kZS5cbi0gKi9cbi1zdGF0aWMgaW50XG4tX192eGZzX2lnZXQoc3RydWN0IGlub2RlICppbGlzdHAsIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCwgaW5vX3QgaW5vKVxuLXtcbi1cdHN0cnVjdCBwYWdlXHRcdFx0KnBwO1xuLVx0dV9sb25nXHRcdFx0XHRvZmZzZXQ7XG4tXG4tXHRvZmZzZXQgPSAoaW5vICUgKFBBR0VfU0laRSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkU7XG4tXHRwcCA9IHZ4ZnNfZ2V0X3BhZ2UoaWxpc3RwLVx1MDAzZWlfbWFwcGluZywgaW5vICogVlhGU19JU0laRSAvIFBBR0VfU0laRSk7XG4tXG4tXHRpZiAoIUlTX0VSUihwcCkpIHtcbi1cdFx0c3RydWN0IHZ4ZnNfZGlub2RlXHQqZGlwO1xuLVx0XHRjYWRkcl90XHRcdFx0a2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwcCk7XG4tXG4tXHRcdGRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpO1xuLVx0XHRkaXAydmlwX2NweShWWEZTX1NCSShpbGlzdHAtXHUwMDNlaV9zYiksIHZpcCwgZGlwKTtcbi1cdFx0dmlwLVx1MDAzZXZmc19pbm9kZS5pX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tI2lmZGVmIERJQUdOT1NUSUNcbi1cdFx0dnhmc19kdW1waSh2aXAsIGlubyk7XG4tI2VuZGlmXG4tXHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHByaW50ayhLRVJOX1dBUk5JTkcgXCJ2eGZzOiBlcnJvciBvbiBwYWdlIDB4JXAgZm9yIGlub2RlICVsZFxcblwiLFxuLVx0XHRwcCwgKHVuc2lnbmVkIGxvbmcpaW5vKTtcbi1cdHJldHVybiBQVFJfRVJSKHBwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3Rcbi0gKiBAc2JwOlx0VkZTIHN1cGVyYmxvY2tcbi0gKiBAaW5vOlx0aW5vZGUgI1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIEZpbmQgaW5vZGUgQGlubyBpbiB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicCB1c2luZ1xuLSAqICB0aGUgc3RydWN0dXJhbCBpbm9kZSBsaXN0LlxuLSAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubylcbi17XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aW5vZGUgPSBuZXdfaW5vZGUoc2JwKTtcbi1cdGlmICghaW5vZGUpXG4tXHRcdHJldHVybiBOVUxMO1xuLVx0aW5vZGUtXHUwMDNlaV9pbm8gPSBnZXRfbmV4dF9pbm8oKTtcbi1cbi1cdGVycm9yID0gX192eGZzX2lnZXQoVlhGU19TQkkoc2JwKS1cdTAwM2V2c2lfc3RpbGlzdCwgVlhGU19JTk8oaW5vZGUpLCBpbm8pO1xuLVx0aWYgKGVycm9yKSB7XG4tXHRcdGlwdXQoaW5vZGUpO1xuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdH1cbi1cbi1cdHJldHVybiBpbm9kZTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlXG4tICogQHNicDpcdHRoZSBzdXBlcmJsb2NrIHRvIGdldCB0aGUgaW5vZGUgZm9yXG4tICogQGlubzpcdHRoZSBudW1iZXIgb2YgdGhlIGlub2RlIHRvIGdldFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogIHZ4ZnNfcmVhZF9pbm9kZSBjcmVhdGVzIGFuIGlub2RlLCByZWFkcyB0aGUgZGlzayBpbm9kZSBmb3IgQGlubyBhbmQgZmlsbHNcbi0gKiAgaW4gYWxsIHJlbGV2YW50IGZpZWxkcyBpbiB0aGUgbmV3IGlub2RlLlxuLSAqL1xuLXN0cnVjdCBpbm9kZSAqXG4tdnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBpbm9fdCBpbm8pXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mb1x0XHQqdmlwO1xuLVx0Y29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uc1x0KmFvcHM7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlwO1xuLVx0aW50IGVycm9yO1xuLVxuLVx0aXAgPSBpZ2V0X2xvY2tlZChzYnAsIGlubyk7XG4tXHRpZiAoIWlwKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbi1cdGlmICghKGlub2RlX3N0YXRlX3JlYWRfb25jZShpcCkgXHUwMDI2IElfTkVXKSlcbi1cdFx0cmV0dXJuIGlwO1xuLVxuLVx0dmlwID0gVlhGU19JTk8oaXApO1xuLVx0ZXJyb3IgPSBfX3Z4ZnNfaWdldChWWEZTX1NCSShzYnApLVx1MDAzZXZzaV9pbGlzdCwgdmlwLCBpbm8pO1xuLVx0aWYgKGVycm9yKSB7XG4tXHRcdGlnZXRfZmFpbGVkKGlwKTtcbi1cdFx0cmV0dXJuIEVSUl9QVFIoZXJyb3IpO1xuLVx0fVxuLVxuLVx0aWYgKFZYRlNfSVNJTU1FRCh2aXApKVxuLVx0XHRhb3BzID0gXHUwMDI2dnhmc19pbW1lZF9hb3BzO1xuLVx0ZWxzZVxuLVx0XHRhb3BzID0gXHUwMDI2dnhmc19hb3BzO1xuLVxuLVx0aWYgKFNfSVNSRUcoaXAtXHUwMDNlaV9tb2RlKSkge1xuLVx0XHRpcC1cdTAwM2VpX2ZvcCA9IFx1MDAyNmdlbmVyaWNfcm9fZm9wcztcbi1cdFx0aXAtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gYW9wcztcbi1cdH0gZWxzZSBpZiAoU19JU0RJUihpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlwLVx1MDAzZWlfb3AgPSBcdTAwMjZ2eGZzX2Rpcl9pbm9kZV9vcHM7XG4tXHRcdGlwLVx1MDAzZWlfZm9wID0gXHUwMDI2dnhmc19kaXJfb3BlcmF0aW9ucztcbi1cdFx0aXAtXHUwMDNlaV9tYXBwaW5nLVx1MDAzZWFfb3BzID0gYW9wcztcbi1cdH0gZWxzZSBpZiAoU19JU0xOSyhpcC1cdTAwM2VpX21vZGUpKSB7XG4tXHRcdGlmICghVlhGU19JU0lNTUVEKHZpcCkpIHtcbi1cdFx0XHRpcC1cdTAwM2VpX29wID0gXHUwMDI2cGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7XG4tXHRcdFx0aW5vZGVfbm9oaWdobWVtKGlwKTtcbi1cdFx0XHRpcC1cdTAwM2VpX21hcHBpbmctXHUwMDNlYV9vcHMgPSBcdTAwMjZ2eGZzX2FvcHM7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0aXAtXHUwMDNlaV9vcCA9IFx1MDAyNnNpbXBsZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7XG4tXHRcdFx0aXAtXHUwMDNlaV9saW5rID0gdmlwLVx1MDAzZXZpaV9pbW1lZC52aV9pbW1lZDtcbi1cdFx0XHRuZF90ZXJtaW5hdGVfbGluayhpcC1cdTAwM2VpX2xpbmssIGlwLVx1MDAzZWlfc2l6ZSxcbi1cdFx0XHRcdFx0ICBzaXplb2YodmlwLVx1MDAzZXZpaV9pbW1lZC52aV9pbW1lZCkgLSAxKTtcbi1cdFx0fVxuLVx0fSBlbHNlXG4tXHRcdGluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtXHUwMDNlaV9tb2RlLCBvbGRfZGVjb2RlX2Rldih2aXAtXHUwMDNldmlpX3JkZXYpKTtcbi1cbi1cdHVubG9ja19uZXdfaW5vZGUoaXApO1xuLVx0cmV0dXJuIGlwO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2V2aWN0X2lub2RlIC0gcmVtb3ZlIGlub2RlIGZyb20gbWFpbiBtZW1vcnlcbi0gKiBAaXA6XHRcdGlub2RlIHRvIGRpc2NhcmQuXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgdnhmc19ldmljdF9pbm9kZSgpIGlzIGNhbGxlZCBvbiB0aGUgZmluYWwgaXB1dCBhbmQgZnJlZXMgdGhlIHByaXZhdGVcbi0gKiAgaW5vZGUgYXJlYS5cbi0gKi9cbi12b2lkXG4tdnhmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlwKVxuLXtcbi1cdHRydW5jYXRlX2lub2RlX3BhZ2VzX2ZpbmFsKFx1MDAyNmlwLVx1MDAzZWlfZGF0YSk7XG4tXHRjbGVhcl9pbm9kZShpcCk7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuaFxuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxZTllMTM4ZDJiMzM4Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmhcbisrKyAvZGV2L251bGxcbkBAIC0xLDE2OSArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICogQ29weXJpZ2h0IChjKSAyMDE2IEtyenlzenRvZiBCbGFzemtvd3NraVxuLSAqL1xuLSNpZm5kZWYgX1ZYRlNfSU5PREVfSF9cbi0jZGVmaW5lIF9WWEZTX0lOT0RFX0hfXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLlxuLSAqXG4tICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkaXNrIGFuZCBjb3JlXG4tICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uXG4tICovXG4tXG4tXG4tI2RlZmluZSBWWEZTX0lTSVpFXHRcdDB4MTAwXHRcdC8qIElub2RlIHNpemUgKi9cbi1cbi0jZGVmaW5lIFZYRlNfTkRBRERSXHRcdDEwXHRcdC8qIE51bWJlciBvZiBkaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi9cbi0jZGVmaW5lIFZYRlNfTklBRERSXHRcdDJcdFx0LyogTnVtYmVyIG9mIGluZGlyZWN0IGFkZHJzIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05JTU1FRFx0XHQ5Nlx0XHQvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovXG4tI2RlZmluZSBWWEZTX05UWVBFRFx0XHQ2XHRcdC8qIE51bSBvZiB0eXBlZCBleHRlbnRzICovXG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX09GRlNFVE1BU0tcdCgweDAwRkZGRkZGRkZGRkZGRkZVTEwpXG4tI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLXHQoMHhGRjAwMDAwMDAwMDAwMDAwVUxMKVxuLSNkZWZpbmUgVlhGU19UWVBFRF9UWVBFU0hJRlRcdDU2XG4tXG4tI2RlZmluZSBWWEZTX1RZUEVEX1BFUl9CTE9DSyhzYnApIFxcXG4tXHQoKHNicCktXHUwMDNlc19ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IHZ4ZnNfdHlwZWQpKVxuLVxuLS8qXG4tICogUG9zc2libGUgZXh0ZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yICVWWEZTX09SR19UWVBFRCBleHRlbnRzLlxuLSAqL1xuLWVudW0ge1xuLVx0VlhGU19UWVBFRF9JTkRJUkVDVFx0XHQ9IDEsXG4tXHRWWEZTX1RZUEVEX0RBVEFcdFx0XHQ9IDIsXG4tXHRWWEZTX1RZUEVEX0lORElSRUNUX0RFVjRcdD0gMyxcbi1cdFZYRlNfVFlQRURfREFUQV9ERVY0XHRcdD0gNCxcbi19O1xuLVxuLS8qXG4tICogRGF0YSBzdG9yZWQgaW1tZWRpYXRlbHkgaW4gdGhlIGlub2RlLlxuLSAqL1xuLXN0cnVjdCB2eGZzX2ltbWVkIHtcbi1cdF9fdThcdFx0XHR2aV9pbW1lZFtWWEZTX05JTU1FRF07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc19leHQ0IHtcbi1cdF9fZnMzMlx0XHRcdHZlNF9zcGFyZTtcdFx0LyogPz8gKi9cbi1cdF9fZnMzMlx0XHRcdHZlNF9pbmRzaXplO1x0XHQvKiBJbmRpcmVjdCBleHRlbnQgc2l6ZSAqL1xuLVx0X19mczMyXHRcdFx0dmU0X2luZGlyW1ZYRlNfTklBRERSXTtcdC8qIEluZGlyZWN0IGV4dGVudHMgKi9cbi1cdHN0cnVjdCBkaXJlY3Qge1x0XHRcdFx0XHQvKiBEaXJlY3QgZXh0ZW50cyAqL1xuLVx0XHRfX2ZzMzJcdFx0ZXh0ZW50O1x0XHRcdC8qIEV4dGVudCBudW1iZXIgKi9cbi1cdFx0X19mczMyXHRcdHNpemU7XHRcdFx0LyogU2l6ZSBvZiBleHRlbnQgKi9cbi1cdH0gdmU0X2RpcmVjdFtWWEZTX05EQUREUl07XG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZCB7XG4tXHRfX2ZzNjRcdFx0dnRfaGRyO1x0XHQvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqL1xuLVx0X19mczMyXHRcdHZ0X2Jsb2NrO1x0LyogRXh0ZW50IGJsb2NrICovXG4tXHRfX2ZzMzJcdFx0dnRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tfTtcbi1cbi1zdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHtcbi1cdF9fZnM2NFx0XHR2ZDRfaGRyO1x0LyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfYmxvY2s7XHQvKiBFeHRlbnQgYmxvY2sgKi9cbi1cdF9fZnM2NFx0XHR2ZDRfc2l6ZTtcdC8qIFNpemUgaW4gYmxvY2tzICovXG4tXHRfX2ZzMzJcdFx0dmQ0X2RldjtcdC8qIERldmljZSBJRCAqL1xuLVx0X191OFx0XHRfX3BhZDE7XG4tfTtcbi1cbi0vKlxuLSAqIFRoZSBpbm9kZSBhcyBjb250YWluZWQgb24gdGhlIHBoeXNpY2FsIGRldmljZS5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19kaW5vZGUge1xuLVx0X19mczMyXHRcdHZkaV9tb2RlO1xuLVx0X19mczMyXHRcdHZkaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfdWlkO1x0LyogVUlEICovXG4tXHRfX2ZzMzJcdFx0dmRpX2dpZDtcdC8qIEdJRCAqL1xuLVx0X19mczY0XHRcdHZkaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdGltZTtcdC8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9hdXRpbWU7XHQvKiBMYXN0IHRpbWUgYWNjZXNzZWQgLSB1c2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9tdXRpbWU7XHQvKiBMYXN0IG1vZGlmeSB0aW1lIC0gdXNlYyAqL1xuLVx0X19mczMyXHRcdHZkaV9jdGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gc2VjICovXG4tXHRfX2ZzMzJcdFx0dmRpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2ZGlfYWZsYWdzO1x0LyogQWxsb2NhdGlvbiBmbGFncyAqL1xuLVx0X191OFx0XHR2ZGlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHRfX2ZzMTZcdFx0dmRpX2VvcGZsYWdzO1xuLVx0X19mczMyXHRcdHZkaV9lb3BkYXRhO1xuLVx0dW5pb24ge1xuLVx0XHRfX2ZzMzJcdFx0XHRyZGV2O1xuLVx0XHRfX2ZzMzJcdFx0XHRkb3Rkb3Q7XG4tXHRcdHN0cnVjdCB7XG4tXHRcdFx0X191MzJcdFx0cmVzZXJ2ZWQ7XG4tXHRcdFx0X19mczMyXHRcdGZpeGV4dHNpemU7XG4tXHRcdH0gaV9yZWd1bGFyO1xuLVx0XHRzdHJ1Y3Qge1xuLVx0XHRcdF9fZnMzMlx0XHRtYXRjaGlubztcbi1cdFx0XHRfX2ZzMzJcdFx0ZnNldGluZGV4O1xuLVx0XHR9IGlfdnhzcGVjO1xuLVx0XHRfX3U2NFx0XHRcdGFsaWduO1xuLVx0fSB2ZGlfZnRhcmVhO1xuLVx0X19mczMyXHRcdHZkaV9ibG9ja3M7XHQvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi9cbi1cdF9fZnMzMlx0XHR2ZGlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0X19mczY0XHRcdHZkaV92ZXJzaW9uO1x0LyogVmVyc2lvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZkaV9vcmc7XG4tXHRfX2ZzMzJcdFx0dmRpX2lhdHRyaW5vO1xuLX07XG4tXG4tI2RlZmluZSB2ZGlfcmRldlx0dmRpX2Z0YXJlYS5yZGV2XG4tI2RlZmluZSB2ZGlfZG90ZG90XHR2ZGlfZnRhcmVhLmRvdGRvdFxuLSNkZWZpbmUgdmRpX2ZpeGV4dHNpemVcdHZkaV9mdGFyZWEucmVndWxhci5maXhleHRzaXplXG4tI2RlZmluZSB2ZGlfbWF0Y2hpbm9cdHZkaV9mdGFyZWEudnhzcGVjLm1hdGNoaW5vXG4tI2RlZmluZSB2ZGlfZnNldGluZGV4XHR2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXhcbi1cbi0jZGVmaW5lIHZkaV9pbW1lZFx0dmRpX29yZy5pbW1lZFxuLSNkZWZpbmUgdmRpX2V4dDRcdHZkaV9vcmcuZXh0NFxuLSNkZWZpbmUgdmRpX3R5cGVkXHR2ZGlfb3JnLnR5cGVkXG4tXG4tXG4tLypcbi0gKiBUaGUgaW5vZGUgYXMgcmVwcmVzZW50ZWQgaW4gdGhlIG1haW4gbWVtb3J5LlxuLSAqL1xuLXN0cnVjdCB2eGZzX2lub2RlX2luZm8ge1xuLVx0c3RydWN0IGlub2RlXHR2ZnNfaW5vZGU7XG4tXG4tXHRfX3UzMlx0XHR2aWlfbW9kZTtcbi1cdF9fdTMyXHRcdHZpaV9ubGluaztcdC8qIExpbmsgY291bnQgKi9cbi1cdF9fdTMyXHRcdHZpaV91aWQ7XHQvKiBVSUQgKi9cbi1cdF9fdTMyXHRcdHZpaV9naWQ7XHQvKiBHSUQgKi9cbi1cdF9fdTY0XHRcdHZpaV9zaXplO1x0LyogSW5vZGUgc2l6ZSBpbiBieXRlcyAqL1xuLVx0X191MzJcdFx0dmlpX2F0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovXG4tXHRfX3UzMlx0XHR2aWlfYXV0aW1lO1x0LyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gdXNlYyAqL1xuLVx0X191MzJcdFx0dmlpX210aW1lO1x0LyogTGFzdCBtb2RpZnkgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX211dGltZTtcdC8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovXG4tXHRfX3UzMlx0XHR2aWlfY3RpbWU7XHQvKiBDcmVhdGUgdGltZSAtIHNlYyAqL1xuLVx0X191MzJcdFx0dmlpX2N1dGltZTtcdC8qIENyZWF0ZSB0aW1lIC0gdXNlYyAqL1xuLVx0X191OFx0XHR2aWlfb3JndHlwZTtcdC8qIE9yZ2FuaXNhdGlvbiB0eXBlICovXG4tXHR1bmlvbiB7XG4tXHRcdF9fdTMyXHRcdFx0cmRldjtcbi1cdFx0X191MzJcdFx0XHRkb3Rkb3Q7XG4tXHR9IHZpaV9mdGFyZWE7XG4tXHRfX3UzMlx0XHR2aWlfYmxvY2tzO1x0LyogSG93IG11Y2ggYmxvY2tzIGRvZXMgaW5vZGUgb2NjdXB5ICovXG4tXHRfX3UzMlx0XHR2aWlfZ2VuO1x0LyogSW5vZGUgZ2VuZXJhdGlvbiAqL1xuLVx0dW5pb24ge1xuLVx0XHRzdHJ1Y3Qgdnhmc19pbW1lZFx0aW1tZWQ7XG4tXHRcdHN0cnVjdCB2eGZzX2V4dDRcdGV4dDQ7XG4tXHRcdHN0cnVjdCB2eGZzX3R5cGVkXHR0eXBlZFtWWEZTX05UWVBFRF07XG4tXHR9IHZpaV9vcmc7XG4tfTtcbi1cbi0jZGVmaW5lIHZpaV9yZGV2XHR2aWlfZnRhcmVhLnJkZXZcbi0jZGVmaW5lIHZpaV9kb3Rkb3RcdHZpaV9mdGFyZWEuZG90ZG90XG4tXG4tI2RlZmluZSB2aWlfaW1tZWRcdHZpaV9vcmcuaW1tZWRcbi0jZGVmaW5lIHZpaV9leHQ0XHR2aWlfb3JnLmV4dDRcbi0jZGVmaW5lIHZpaV90eXBlZFx0dmlpX29yZy50eXBlZFxuLVxuLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqVlhGU19JTk8oc3RydWN0IGlub2RlICppbm9kZSlcbi17XG4tXHRyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpO1xuLX1cbi1cbi0jZW5kaWYgLyogX1ZYRlNfSU5PREVfSF8gKi9cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAxMzhlMDhkZTk3NmVhLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwyNzMgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqIENvcHlyaWdodCAoYykgMjAxNiBLcnp5c3p0b2YgQmxhc3prb3dza2lcbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBsb29rdXAgYW5kIG90aGVyIGRpcmVjdG9yeSByZWxhdGVkIGNvZGUuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGVsb2NrLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC90aW1lLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2Rpci5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfaW5vZGUuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi0vKlxuLSAqIE51bWJlciBvZiBWeEZTIGJsb2NrcyBwZXIgcGFnZS5cbi0gKi9cbi0jZGVmaW5lIFZYRlNfQkxPQ0tfUEVSX1BBR0Uoc2JwKSAgKChQQUdFX1NJWkUgLyAoc2JwKS1cdTAwM2VzX2Jsb2Nrc2l6ZSkpXG4tXG4tXG4tc3RhdGljIHN0cnVjdCBkZW50cnkgKlx0dnhmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTtcbi1zdGF0aWMgaW50XHRcdHZ4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKik7XG4tXG4tY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0ge1xuLVx0Lmxvb2t1cCA9XHRcdHZ4ZnNfbG9va3VwLFxuLX07XG4tXG4tY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2eGZzX2Rpcl9vcGVyYXRpb25zID0ge1xuLVx0Lmxsc2VlayA9XHRcdGdlbmVyaWNfZmlsZV9sbHNlZWssXG4tXHQucmVhZCA9XHRcdFx0Z2VuZXJpY19yZWFkX2Rpcixcbi1cdC5pdGVyYXRlX3NoYXJlZCA9XHR2eGZzX3JlYWRkaXIsXG4tXHQuc2V0bGVhc2UgPVx0XHRnZW5lcmljX3NldGxlYXNlLFxuLX07XG4tXG4tXG4tLyoqXG4tICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeVxuLSAqIEBpcDpcdFx0ZGlyZWN0b3J5IGlub2RlXG4tICogQGRwOlx0XHRkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdFxuLSAqIEBwcHA6XHRnZXRzIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4gdmFsdWUgc2l0cyBpblxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2ZpbmRfZW50cnkgZmluZHMgYSBcdTAwMjZzdHJ1Y3Qgdnhmc19kaXJlY3QgZm9yIHRoZSBWRlMgZGlyZWN0b3J5XG4tICogICBjYWNoZSBlbnRyeSBAZHAuICBAcHBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBhZ2UgdGhlIHJldHVyblxuLSAqICAgdmFsdWUgcmVzaWRlcyBpbi5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLlxuLSAqL1xuLXN0YXRpYyBzdHJ1Y3Qgdnhmc19kaXJlY3QgKlxuLXZ4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApXG4te1xuLVx0dV9sb25nIGJzaXplID0gaXAtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNvbnN0IGNoYXIgKm5hbWUgPSBkcC1cdTAwM2VkX25hbWUubmFtZTtcbi1cdGludCBuYW1lbGVuID0gZHAtXHUwMDNlZF9uYW1lLmxlbjtcbi1cdGxvZmZfdCBsaW1pdCA9IFZYRlNfRElSUk9VTkQoaXAtXHUwMDNlaV9zaXplKTtcbi1cdHN0cnVjdCB2eGZzX2RpcmVjdCAqZGVfZXhpdCA9IE5VTEw7XG4tXHRsb2ZmX3QgcG9zID0gMDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKnNiaSA9IFZYRlNfU0JJKGlwLVx1MDAzZWlfc2IpO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICsgKHBvcyBcdTAwMjYgflBBR0VfTUFTSykpO1xuLVx0XHRcdFx0aW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7XG4tXG4tXHRcdFx0XHRwb3MgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XG4tXG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX3JlY2xlbikge1xuLVx0XHRcdFx0cG9zICs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9pbm8pXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRpZiAobmFtZWxlbiAhPSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfbmFtZWxlbikpXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cdFx0XHRpZiAoIW1lbWNtcChuYW1lLCBkZS1cdTAwM2VkX25hbWUsIG5hbWVsZW4pKSB7XG4tXHRcdFx0XHQqcHBwID0gcHA7XG4tXHRcdFx0XHRkZV9leGl0ID0gZGU7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4tXHRcdH1cbi1cdFx0aWYgKCFkZV9leGl0KVxuLVx0XHRcdHZ4ZnNfcHV0X3BhZ2UocHApO1xuLVx0XHRlbHNlXG4tXHRcdFx0YnJlYWs7XG4tXHR9XG4tXG4tXHRyZXR1cm4gZGVfZXhpdDtcbi19XG4tXG4tLyoqXG4tICogdnhmc19pbm9kZV9ieV9uYW1lIC0gZmluZCBpbm9kZSBudW1iZXIgZm9yIGRlbnRyeVxuLSAqIEBkaXA6XHRkaXJlY3RvcnkgdG8gc2VhcmNoIGluXG4tICogQGRwOlx0XHRkZW50cnkgd2Ugc2VhcmNoIGZvclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2lub2RlX2J5X25hbWUgZmluZHMgb3V0IHRoZSBpbm9kZSBudW1iZXIgb2Zcbi0gKiAgIHRoZSBwYXRoIGNvbXBvbmVudCBkZXNjcmliZWQgYnkgQGRwIGluIEBkaXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHdhbnRlZCBpbm9kZSBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqL1xuLXN0YXRpYyBpbm9fdFxuLXZ4ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHApXG4te1xuLVx0c3RydWN0IHZ4ZnNfZGlyZWN0XHRcdCpkZTtcbi1cdHN0cnVjdCBwYWdlXHRcdFx0KnBwO1xuLVx0aW5vX3RcdFx0XHRcdGlubyA9IDA7XG4tXG4tXHRkZSA9IHZ4ZnNfZmluZF9lbnRyeShkaXAsIGRwLCBcdTAwMjZwcCk7XG4tXHRpZiAoZGUpIHtcbi1cdFx0aW5vID0gZnMzMl90b19jcHUoVlhGU19TQkkoZGlwLVx1MDAzZWlfc2IpLCBkZS1cdTAwM2VkX2lubyk7XG4tXHRcdGt1bm1hcChwcCk7XG4tXHRcdHB1dF9wYWdlKHBwKTtcbi1cdH1cbi1cdFxuLVx0cmV0dXJuIChpbm8pO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2xvb2t1cCAtIGxvb2t1cCBwYXRobmFtZSBjb21wb25lbnRcbi0gKiBAZGlwOlx0ZGlyIGluIHdoaWNoIHdlIGxvb2t1cFxuLSAqIEBkcDpcdFx0ZGVudHJ5IHdlIGxvb2t1cFxuLSAqIEBmbGFnczpcdGxvb2t1cCBmbGFnc1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2xvb2t1cCB0cmllcyB0byBsb29rdXAgdGhlIHBhdGhuYW1lIGNvbXBvbmVudCBkZXNjcmliZWRcbi0gKiAgIGJ5IEBkcCBpbiBAZGlwLlxuLSAqXG4tICogUmV0dXJuczpcbi0gKiAgIEEgTlVMTC1wb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWRcbi0gKiAgIGluIHRoZSByZXR1cm4gcG9pbnRlci5cbi0gKi9cbi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqXG4tdnhmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRwLCB1bnNpZ25lZCBpbnQgZmxhZ3MpXG4te1xuLVx0c3RydWN0IGlub2RlXHRcdCppcCA9IE5VTEw7XG4tXHRpbm9fdFx0XHRcdGlubztcbi1cdFx0XHQgXG4tXHRpZiAoZHAtXHUwMDNlZF9uYW1lLmxlbiBcdTAwM2UgVlhGU19OQU1FTEVOKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTtcbi1cdFx0XHRcdCBcbi1cdGlubyA9IHZ4ZnNfaW5vZGVfYnlfbmFtZShkaXAsIGRwKTtcbi1cdGlmIChpbm8pXG4tXHRcdGlwID0gdnhmc19pZ2V0KGRpcC1cdTAwM2VpX3NiLCBpbm8pO1xuLVx0cmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkcCk7XG4tfVxuLVxuLS8qKlxuLSAqIHZ4ZnNfcmVhZGRpciAtIHJlYWQgYSBkaXJlY3Rvcnlcbi0gKiBAZnA6XHRcdHRoZSBkaXJlY3RvcnkgdG8gcmVhZFxuLSAqIEBjdHg6XHRkaXJfY29udGV4dCBmb3IgZmlsbGRpci9yZWFkZGlyXG4tICpcbi0gKiBEZXNjcmlwdGlvbjpcbi0gKiAgIHZ4ZnNfcmVhZGRpciBmaWxscyBAcmV0cCB3aXRoIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gQGZwXG4tICogICB1c2luZyB0aGUgVkZTIHN1cHBsaWVkIGNhbGxiYWNrIEBmaWxsZXIuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVyby5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4te1xuLVx0c3RydWN0IGlub2RlXHRcdCppcCA9IGZpbGVfaW5vZGUoZnApO1xuLVx0c3RydWN0IHN1cGVyX2Jsb2NrXHQqc2JwID0gaXAtXHUwMDNlaV9zYjtcbi1cdHVfbG9uZ1x0XHRcdGJzaXplID0gc2JwLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0bG9mZl90XHRcdFx0cG9zLCBsaW1pdDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm9cdCpzYmkgPSBWWEZTX1NCSShzYnApO1xuLVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMCkge1xuLVx0XHRpZiAoIWRpcl9lbWl0X2RvdChmcCwgY3R4KSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y3R4LVx1MDAzZXBvcysrO1xuLVx0fVxuLVx0aWYgKGN0eC1cdTAwM2Vwb3MgPT0gMSkge1xuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgXCIuLlwiLCAyLCBWWEZTX0lOTyhpcCktXHUwMDNldmlpX2RvdGRvdCwgRFRfRElSKSlcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0Y3R4LVx1MDAzZXBvcysrO1xuLVx0fVxuLVxuLVx0bGltaXQgPSBWWEZTX0RJUlJPVU5EKGlwLVx1MDAzZWlfc2l6ZSk7XG4tXHRpZiAoY3R4LVx1MDAzZXBvcyBcdTAwM2UgbGltaXQpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0cG9zID0gY3R4LVx1MDAzZXBvcyBcdTAwMjYgfjNMO1xuLVxuLVx0d2hpbGUgKHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0c3RydWN0IHBhZ2UgKnBwO1xuLVx0XHRjaGFyICprYWRkcjtcbi1cdFx0aW50IHBnX29mcyA9IHBvcyBcdTAwMjYgflBBR0VfTUFTSztcbi1cdFx0aW50IHJjID0gMDtcbi1cbi1cdFx0cHAgPSB2eGZzX2dldF9wYWdlKGlwLVx1MDAzZWlfbWFwcGluZywgcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbi1cdFx0aWYgKElTX0VSUihwcCkpXG4tXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4tXG4tXHRcdGthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApO1xuLVxuLVx0XHR3aGlsZSAocGdfb2ZzIFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IHBvcyBcdTAwM2MgbGltaXQpIHtcbi1cdFx0XHRzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlO1xuLVxuLVx0XHRcdGlmICgocG9zIFx1MDAyNiAoYnNpemUgLSAxKSkgXHUwMDNjIDQpIHtcbi1cdFx0XHRcdHN0cnVjdCB2eGZzX2RpcmJsayAqZGJwID1cbi1cdFx0XHRcdFx0KHN0cnVjdCB2eGZzX2RpcmJsayAqKVxuLVx0XHRcdFx0XHQgKGthZGRyICsgKHBvcyBcdTAwMjYgflBBR0VfTUFTSykpO1xuLVx0XHRcdFx0aW50IG92ZXJoZWFkID0gVlhGU19ESVJCTEtPVihzYmksIGRicCk7XG4tXG4tXHRcdFx0XHRwb3MgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0XHRwZ19vZnMgKz0gb3ZlcmhlYWQ7XG4tXHRcdFx0fVxuLVx0XHRcdGRlID0gKHN0cnVjdCB2eGZzX2RpcmVjdCAqKShrYWRkciArIHBnX29mcyk7XG4tXG4tXHRcdFx0aWYgKCFkZS1cdTAwM2VkX3JlY2xlbikge1xuLVx0XHRcdFx0cG9zICs9IGJzaXplIC0gMTtcbi1cdFx0XHRcdHBvcyBcdTAwMjY9IH4oYnNpemUgLSAxKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRwZ19vZnMgKz0gZnMxNl90b19jcHUoc2JpLCBkZS1cdTAwM2VkX3JlY2xlbik7XG4tXHRcdFx0cG9zICs9IGZzMTZfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9yZWNsZW4pO1xuLVx0XHRcdGlmICghZGUtXHUwMDNlZF9pbm8pXG4tXHRcdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0XHRyYyA9IGRpcl9lbWl0KGN0eCwgZGUtXHUwMDNlZF9uYW1lLFxuLVx0XHRcdFx0XHRmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfbmFtZWxlbiksXG4tXHRcdFx0XHRcdGZzMzJfdG9fY3B1KHNiaSwgZGUtXHUwMDNlZF9pbm8pLFxuLVx0XHRcdFx0XHREVF9VTktOT1dOKTtcbi1cdFx0XHRpZiAoIXJjKSB7XG4tXHRcdFx0XHQvKiB0aGUgZGlyIGVudHJ5IHdhcyBub3QgcmVhZCwgZml4IHBvcy4gKi9cbi1cdFx0XHRcdHBvcyAtPSBmczE2X3RvX2NwdShzYmksIGRlLVx1MDAzZWRfcmVjbGVuKTtcbi1cdFx0XHRcdGJyZWFrO1xuLVx0XHRcdH1cbi1cdFx0fVxuLVx0XHR2eGZzX3B1dF9wYWdlKHBwKTtcbi1cdFx0aWYgKCFyYylcbi1cdFx0XHRicmVhaztcbi1cdH1cbi1cbi1cdGN0eC1cdTAwM2Vwb3MgPSBwb3MgfCAyO1xuLVxuLW91dDpcbi1cdHJldHVybiAwO1xuLX1cbmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAyM2YzNTE4N2MyODk2Li4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX29sdC5jXG4rKysgL2Rldi9udWxsXG5AQCAtMSwxMDUgKzAsMCBAQFxuLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbi0vKlxuLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLlxuLSAqL1xuLVxuLS8qIFxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC5cbi0gKi9cbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXCJ2eGZzLmhcIlxuLSNpbmNsdWRlIFwidnhmc19vbHQuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9mc2hlYWQoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICpmc2hwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9mc2hpbm8pO1xuLVx0aW5mcC1cdTAwM2V2c2lfZnNoaW5vID0gZnMzMl90b19jcHUoaW5mcCwgZnNocC1cdTAwM2VvbHRfZnNpbm9bMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHZvaWRcbi12eGZzX2dldF9pbGlzdChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqaWxpc3RwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKVxuLXtcbi1cdEJVR19PTihpbmZwLVx1MDAzZXZzaV9pZXh0KTtcbi1cdGluZnAtXHUwMDNldnNpX2lleHQgPSBmczMyX3RvX2NwdShpbmZwLCBpbGlzdHAtXHUwMDNlb2x0X2lleHRbMF0pO1xuLX1cbi1cbi1zdGF0aWMgaW5saW5lIHVfbG9uZ1xuLXZ4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0QlVHX09OKHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSAlIGJzaXplKTtcbi1cdHJldHVybiAoYmxvY2sgKiAoc2JwLVx1MDAzZXNfYmxvY2tzaXplIC8gYnNpemUpKTtcbi19XG4tXG4tXG4tLyoqXG4tICogdnhmc19yZWFkX29sdCAtIHJlYWQgb2x0XG4tICogQHNicDpcdHN1cGVyYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKiBAYnNpemU6XHRibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW1cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwXG4tICogICBpbnRvIG1haW4gbWVtb3J5IGFuZCBkb2VzIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS5cbi0gKi9cbi1pbnRcbi12eGZzX3JlYWRfb2x0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1X2xvbmcgYnNpemUpXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0KmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0c3RydWN0IGJ1ZmZlcl9oZWFkXHQqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19vbHRcdFx0Km9wO1xuLVx0Y2hhclx0XHRcdCpvYWRkciwgKmVhZGRyO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC1cdTAwM2V2c2lfb2x0ZXh0LCBic2l6ZSkpO1xuLVx0aWYgKCFicCB8fCAhYnAtXHUwMDNlYl9kYXRhKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHRvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC1cdTAwM2ViX2RhdGE7XG4tXHRpZiAoZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X21hZ2ljKSAhPSBWWEZTX09MVF9NQUdJQykge1xuLVx0XHRwcmludGsoS0VSTl9OT1RJQ0UgXCJ2eGZzOiBpdmFsaWQgb2x0IG1hZ2ljIG51bWJlclxcblwiKTtcbi1cdFx0Z290byBmYWlsO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIEl0IGlzIGluIHRoZW9yeSBwb3NzaWJsZSB0aGF0IHZzaV9vbHRzaXplIGlzIFx1MDAzZSAxLlxuLVx0ICogSSd2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSdtIGxhenkuLiAgLS1oY2hcbi1cdCAqL1xuLVx0aWYgKGluZnAtXHUwMDNldnNpX29sdHNpemUgXHUwMDNlIDEpIHtcbi1cdFx0cHJpbnRrKEtFUk5fTk9USUNFIFwidnhmczogb2x0c2l6ZSBcdTAwM2UgMSBkZXRlY3RlZC5cXG5cIik7XG4tXHRcdHByaW50ayhLRVJOX05PVElDRSBcInZ4ZnM6IHBsZWFzZSBub3RpZnkgaGNoQGluZnJhZGVhZC5vcmdcXG5cIik7XG4tXHRcdGdvdG8gZmFpbDtcbi1cdH1cbi1cbi1cdG9hZGRyID0gYnAtXHUwMDNlYl9kYXRhICsgZnMzMl90b19jcHUoaW5mcCwgb3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0ZWFkZHIgPSBicC1cdTAwM2ViX2RhdGEgKyAoaW5mcC1cdTAwM2V2c2lfb2x0c2l6ZSAqIHNicC1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4tXG4tXHR3aGlsZSAob2FkZHIgXHUwMDNjIGVhZGRyKSB7XG4tXHRcdHN0cnVjdCB2eGZzX29sdGNvbW1vblx0Km9jcCA9XG4tXHRcdFx0KHN0cnVjdCB2eGZzX29sdGNvbW1vbiAqKW9hZGRyO1xuLVx0XHRcbi1cdFx0c3dpdGNoIChmczMyX3RvX2NwdShpbmZwLCBvY3AtXHUwMDNlb2x0X3R5cGUpKSB7XG4tXHRcdGNhc2UgVlhGU19PTFRfRlNIRUFEOlxuLVx0XHRcdHZ4ZnNfZ2V0X2ZzaGVhZCgoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICopb2FkZHIsIGluZnApO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHRjYXNlIFZYRlNfT0xUX0lMSVNUOlxuLVx0XHRcdHZ4ZnNfZ2V0X2lsaXN0KChzdHJ1Y3Qgdnhmc19vbHRpbGlzdCAqKW9hZGRyLCBpbmZwKTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVxuLVx0XHRvYWRkciArPSBmczMyX3RvX2NwdShpbmZwLCBvY3AtXHUwMDNlb2x0X3NpemUpO1xuLVx0fVxuLVxuLVx0YnJlbHNlKGJwKTtcbi1cdHJldHVybiAoaW5mcC1cdTAwM2V2c2lfZnNoaW5vIFx1MDAyNlx1MDAyNiBpbmZwLVx1MDAzZXZzaV9pZXh0KSA/IDAgOiAtRUlOVkFMO1xuLVxuLWZhaWw6XG4tXHRicmVsc2UoYnApO1xuLVx0cmV0dXJuIC1FSU5WQUw7XG4tfVxuZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmggYi9mcy9mcmVldnhmcy92eGZzX29sdC5oXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDUzYWZiYTA4ZDYxN2YuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmhcbisrKyAvZGV2L251bGxcbkBAIC0xLDEyMCArMCwwIEBAXG4tLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuLS8qXG4tICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuXG4tICovXG4tI2lmbmRlZiBfVlhGU19PTFRfSF9cbi0jZGVmaW5lIF9WWEZTX09MVF9IX1xuLVxuLS8qXG4tICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIE9iamVjdCBMb2NhdGlvbiBUYWJsZSBkYXRhIHN0cnVjdHVyZXMuXG4tICpcbi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZFxuLSAqIGJ5IHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0gdmVyc2lvbiAyIGFuZCBuZXdlci5cbi0gKi9cbi1cbi1cbi0vKlxuLSAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LVx1MDAzZW9sdF9tYWdpYykuXG4tICovXG4tI2RlZmluZSBWWEZTX09MVF9NQUdJQ1x0XHQweGE1MDRGQ0Y1XG4tXG4tLypcbi0gKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy5cbi0gKi9cbi1lbnVtIHtcbi1cdFZYRlNfT0xUX0ZSRUVcdD0gMSxcbi1cdFZYRlNfT0xUX0ZTSEVBRFx0PSAyLFxuLVx0VlhGU19PTFRfQ1VUXHQ9IDMsXG4tXHRWWEZTX09MVF9JTElTVFx0PSA0LFxuLVx0VlhGU19PTFRfREVWXHQ9IDUsXG4tXHRWWEZTX09MVF9TQlx0PSA2XG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgT0xUIGhlYWRlci5cbi0gKlxuLSAqIFRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgaGVhZGVyIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2hcbi0gKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuXG4tICogdGhlIGluaXRpYWwgaW5vZGUgbGlzdCwgdGhlIGZpbGVzZXQgaGVhZGVyIG9yIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi5cbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHQge1xuLVx0X19mczMyXHRcdG9sdF9tYWdpYztcdC8qIG1hZ2ljIG51bWJlclx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgZW50cnlcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfY2hlY2tzdW07XHQvKiBjaGVja3N1bSBvZiBleHRlbnRcdFx0Ki9cbi1cdF9fdTMyXHRcdF9fdW51c2VkMTtcdC8qID8/P1x0XHRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXRpbWU7XHQvKiB0aW1lIG9mIGxhc3QgbW9kLiAoc2VjKVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfbXV0aW1lO1x0LyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpXHQqL1xuLVx0X19mczMyXHRcdG9sdF90b3RmcmVlO1x0LyogZnJlZSBzcGFjZSBpbiBPTFQgZXh0ZW50XHQqL1xuLVx0X19mczMyXHRcdG9sdF9leHRlbnRzWzJdO1x0LyogYWRkciBvZiB0aGlzIGV4dGVudCwgcmVwbGljYVx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfZXNpemU7XHQvKiBzaXplIG9mIHRoaXMgZXh0ZW50XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25leHRbMl07ICAgIC8qIGFkZHIgb2YgbmV4dCBleHRlbnQsIHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X25zaXplO1x0Lyogc2l6ZSBvZiBuZXh0IGV4dGVudFx0XHQqL1xuLVx0X191MzJcdFx0X191bnVzZWQyO1x0LyogYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5XHQqL1xuLX07XG4tXG4tLypcbi0gKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGNvbW1vbiB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tfTtcbi1cbi0vKlxuLSAqIFZ4RlMgZnJlZSBPTFQgZW50cnkgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGZyZWUge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyBmcmVlIHJlY29yZFx0Ki9cbi19O1xuLVxuLS8qXG4tICogVnhGUyBpbml0aWFsLWlub2RlIGxpc3QgKG9uIGRpc2spLlxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGlsaXN0IHtcbi1cdF9fZnMzMlx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9pZXh0WzJdO1x0LyogaW5pdGlhbCBpbm9kZSBsaXN0LCByZXBsaWNhXHQqL1xuLX07XG4tXG4tLypcbi0gKiBDdXJyZW50IFVzYWdlIFRhYmxlIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdGN1dCB7XG4tXHRfX2ZzMzJcdFx0b2x0X3R5cGU7XHQvKiB0eXBlIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X3NpemU7XHQvKiBzaXplIG9mIHRoaXMgcmVjb3JkXHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2N1dGlubztcdC8qIGlub2RlIG9mIGN1cnJlbnQgdXNhZ2UgdGFibGVcdCovXG4tXHRfX3U4XHRcdF9fcGFkO1x0XHQvKiB1bnVzZWQsIDggYnl0ZSBhbGlnblx0XHQqL1xuLX07XG4tXG4tLypcbi0gKiBJbm9kZXMgY29udGFpbmluZyBTdXBlcmJsb2NrLCBJbnRlbnQgbG9nIGFuZCBPTFRzIFxuLSAqL1xuLXN0cnVjdCB2eGZzX29sdHNiIHtcbi1cdF9fZnMzMlx0XHRvbHRfdHlwZTtcdC8qIHR5cGUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2l6ZTtcdC8qIHNpemUgb2YgdGhpcyByZWNvcmRcdFx0Ki9cbi1cdF9fZnMzMlx0XHRvbHRfc2Jpbm87XHQvKiBpbm9kZSBvZiBzdXBlcmJsb2NrIGZpbGVcdCovXG4tXHRfX3UzMlx0XHRfX3VudXNlZDE7XHQvKiA/Pz9cdFx0XHRcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X2xvZ2lub1syXTtcdC8qIGlub2RlIG9mIGxvZyBmaWxlLHJlcGxpY2FcdCovXG4tXHRfX2ZzMzJcdFx0b2x0X29sdGlub1syXTtcdC8qIGlub2RlIG9mIE9MVCwgcmVwbGljYVx0Ki9cbi19O1xuLVxuLS8qXG4tICogSW5vZGUgY29udGFpbmluZyBkZXZpY2UgY29uZmlndXJhdGlvbiArIGl0J3MgcmVwbGljYSBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHRkZXYge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9kZXZpbm9bMl07XHQvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzXHQqL1xuLX07XG4tXG4tLypcbi0gKiBGaWxlc2V0IGhlYWRlciBcbi0gKi9cbi1zdHJ1Y3Qgdnhmc19vbHRmc2hlYWQge1xuLVx0X19mczMyXHRcdG9sdF90eXBlO1x0LyogdHlwZSBudW1iZXJcdFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9zaXplO1x0Lyogc2l6ZSBvZiB0aGlzIHJlY29yZFx0XHQqL1xuLVx0X19mczMyXHRcdG9sdF9mc2lub1syXTsgICAvKiBpbm9kZXMgb2YgZmlsZXNldCBoZWFkZXJcdCovXG4tfTtcbi1cbi0jZW5kaWYgLyogX1ZYRlNfT0xUX0hfICovXG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xuZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCBmNDM5ODc3ZWE2ZTgwLi4wMDAwMDAwMDAwMDAwXG4tLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMTUyICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKi9cbi1cbi0vKlxuLSAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzaGFyZWQgc3Vicm91dGluZXMuXG4tICovXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1ZmZlcl9oZWFkLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFx1MDAzZVxuLVxuLSNpbmNsdWRlIFwidnhmc19leHRlcm4uaFwiXG4tXG4tXG4tc3RhdGljIGludFx0XHR2eGZzX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKiwgc3RydWN0IGZvbGlvICopO1xuLXN0YXRpYyBzZWN0b3JfdFx0XHR2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QpO1xuLVxuLWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0ge1xuLVx0LnJlYWRfZm9saW8gPVx0XHR2eGZzX3JlYWRfZm9saW8sXG4tXHQuYm1hcCA9XHRcdFx0dnhmc19ibWFwLFxuLX07XG4tXG4taW5saW5lIHZvaWRcbi12eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwcClcbi17XG4tXHRrdW5tYXAocHApO1xuLVx0cHV0X3BhZ2UocHApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2dldF9wYWdlIC0gcmVhZCBhIHBhZ2UgaW50byBtZW1vcnkuXG4tICogQG1hcHBpbmc6XHRtYXBwaW5nIHRvIHJlYWQgZnJvbVxuLSAqIEBuOlx0XHRwYWdlIG51bWJlclxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuXG4tICovXG4tc3RydWN0IHBhZ2UgKlxuLXZ4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKVxuLXtcbi1cdHN0cnVjdCBwYWdlICpcdFx0XHRwcDtcbi1cbi1cdHBwID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7XG4tXG4tXHRpZiAoIUlTX0VSUihwcCkpIHtcbi1cdFx0a21hcChwcCk7XG4tXHRcdC8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovXG4tXHRcdFx0LyoqIHZ4ZnNfY2hlY2tfcGFnZShwcCk7ICoqL1xuLVx0fVxuLVx0XG4tXHRyZXR1cm4gKHBwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19icmVhZCAtIHJlYWQgYnVmZmVyIGZvciBhIGdpdmUgaW5vZGUsYmxvY2sgdHVwbGVcbi0gKiBAaXA6XHRcdGlub2RlXG4tICogQGJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mXG4tICogICBAaXAgaW50byB0aGUgYnVmZmVyY2FjaGUuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHJlc3VsdGluZyBcdTAwMjZzdHJ1Y3QgYnVmZmVyX2hlYWQuXG4tICovXG4tc3RydWN0IGJ1ZmZlcl9oZWFkICpcbi12eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaylcbi17XG4tXHRzdHJ1Y3QgYnVmZmVyX2hlYWRcdCpicDtcbi1cdGRhZGRyX3RcdFx0XHRwYmxvY2s7XG4tXG4tXHRwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7XG4tXHRicCA9IHNiX2JyZWFkKGlwLVx1MDAzZWlfc2IsIHBibG9jayk7XG4tXG4tXHRyZXR1cm4gKGJwKTtcbi19XG4tXG4tLyoqXG4tICogdnhmc19nZXRibGsgLSBsb2NhdGUgYnVmZmVyIGZvciBnaXZlbiBpbm9kZSxibG9jayB0dXBsZVxuLSAqIEBpcDpcdFx0aW5vZGVcbi0gKiBAaWJsb2NrOlx0bG9naWNhbCBibG9ja1xuLSAqIEBicDpcdFx0YnVmZmVyIHNrZWxldG9uXG4tICogQGNyZWF0ZTpcdCVUUlVFIGlmIGJsb2NrcyBtYXkgYmUgbmV3bHkgYWxsb2NhdGVkLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19nZXRibGsgZnVuY3Rpb24gZmlsbHMgQGJwIHdpdGggdGhlIHJpZ2h0IHBoeXNpY2FsXG4tICogICBibG9jayBhbmQgZGV2aWNlIG51bWJlciB0byBwZXJmb3JtIGEgbG93bGV2ZWwgcmVhZC93cml0ZSBvblxuLSAqICAgaXQuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdiBlcnJvciBjb2RlICgtRUlPKS5cbi0gKi9cbi1zdGF0aWMgaW50XG4tdnhmc19nZXRibGsoc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgaWJsb2NrLFxuLVx0ICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYnAsIGludCBjcmVhdGUpXG4te1xuLVx0ZGFkZHJfdFx0XHRcdHBibG9jaztcbi1cbi1cdHBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGlibG9jayk7XG4tXHRpZiAocGJsb2NrICE9IDApIHtcbi1cdFx0bWFwX2JoKGJwLCBpcC1cdTAwM2VpX3NiLCBwYmxvY2spO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbi1cbi1cdHJldHVybiAtRUlPO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3JlYWRfZm9saW8gLSByZWFkIG9uZSBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUgcGFnZWNhY2hlXG4tICogQGZpbGU6XHRmaWxlIGNvbnRleHQgKHVudXNlZClcbi0gKiBAZm9saW86XHRmb2xpbyB0byBmaWxsIGluLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBUaGUgdnhmc19yZWFkX2ZvbGlvIHJvdXRpbmUgcmVhZHMgQGZvbGlvIHN5bmNocm9ub3VzbHkgaW50byB0aGVcbi0gKiAgIHBhZ2VjYWNoZS5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLlxuLSAqXG4tICogTG9ja2luZyBzdGF0dXM6XG4tICogICBAZm9saW8gaXMgbG9ja2VkIGFuZCB3aWxsIGJlIHVubG9ja2VkLlxuLSAqL1xuLXN0YXRpYyBpbnQgdnhmc19yZWFkX2ZvbGlvKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLXtcbi1cdHJldHVybiBibG9ja19yZWFkX2Z1bGxfZm9saW8oZm9saW8sIHZ4ZnNfZ2V0YmxrKTtcbi19XG4tIFxuLS8qKlxuLSAqIHZ4ZnNfYm1hcCAtIHBlcmZvcm0gbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBtYXBwaW5nXG4tICogQG1hcHBpbmc6XHRsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlXG4tICogQGJsb2NrOlx0bG9naWNhbCBibG9jayAocmVsYXRpdmUgdG8gQG1hcHBpbmcpLlxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBWeGZzX2JtYXAgZmluZCBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgcGhzaWNhbCBibG9jayB0byB0aGVcbi0gKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci5cbi0gKlxuLSAqIFJldHVybnM6XG4tICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLlxuLSAqXG4tICogTG9ja2luZyBzdGF0dXM6XG4tICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC5cbi0gKi9cbi1zdGF0aWMgc2VjdG9yX3Rcbi12eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKVxuLXtcbi1cdHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTtcbi19XG5kaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jXG5kZWxldGVkIGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IGQ3ZDg0N2Q3NWMzZDUuLjAwMDAwMDAwMDAwMDBcbi0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuY1xuKysrIC9kZXYvbnVsbFxuQEAgLTEsMzQ3ICswLDAgQEBcbi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4tLypcbi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy5cbi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgS3J6eXN6dG9mIEJsYXN6a293c2tpXG4tICovXG4tXG4tLypcbi0gKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLlxuLSAqL1xuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2luaXQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYmxrZGV2LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvYnVmZmVyX2hlYWQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc3RhdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvdmZzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi1cbi0jaW5jbHVkZSBcInZ4ZnMuaFwiXG4tI2luY2x1ZGUgXCJ2eGZzX2V4dGVybi5oXCJcbi0jaW5jbHVkZSBcInZ4ZnNfZGlyLmhcIlxuLSNpbmNsdWRlIFwidnhmc19pbm9kZS5oXCJcbi1cbi1cbi1NT0RVTEVfQVVUSE9SKFwiQ2hyaXN0b3BoIEhlbGx3aWcsIEtyenlzenRvZiBCbGFzemtvd3NraVwiKTtcbi1NT0RVTEVfREVTQ1JJUFRJT04oXCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlclwiKTtcbi1NT0RVTEVfTElDRU5TRShcIkR1YWwgQlNEL0dQTFwiKTtcbi1cbi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZ4ZnNfaW5vZGVfY2FjaGVwO1xuLVxuLS8qKlxuLSAqIHZ4ZnNfcHV0X3N1cGVyIC0gZnJlZSBzdXBlcmJsb2NrIHJlc291cmNlc1xuLSAqIEBzYnA6XHRWRlMgc3VwZXJibG9jay5cbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19wdXRfc3VwZXIgZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIEBzYnBcbi0gKiAgIGFmdGVyIHRoZSBsYXN0IGluc3RhbmNlIG9mIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC5cbi0gKi9cbi1cbi1zdGF0aWMgdm9pZFxuLXZ4ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwKVxuLXtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm9cdCppbmZwID0gVlhGU19TQkkoc2JwKTtcbi1cbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLVxuLVx0YnJlbHNlKGluZnAtXHUwMDNldnNpX2JwKTtcbi1cdGtmcmVlKGluZnApO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX3N0YXRmcyAtIGdldCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uXG4tICogQGRlbnRyeTpcdFZGUyBkZW50cnkgdG8gbG9jYXRlIHN1cGVyYmxvY2tcbi0gKiBAYnVmcDpcdG91dHB1dCBidWZmZXJcbi0gKlxuLSAqIERlc2NyaXB0aW9uOlxuLSAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvblxuLSAqICAgYWJvdXQgdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IEBkZW50cnkuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgWmVyby5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBObyBsb2NrcyBoZWxkLlxuLSAqXG4tICogTm90ZXM6XG4tICogICBUaGlzIGlzIGV2ZXJ5dGhpbmcgYnV0IGNvbXBsZXRlLi4uXG4tICovXG4tc3RhdGljIGludFxuLXZ4ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZnApXG4te1xuLVx0c3RydWN0IHZ4ZnNfc2JfaW5mb1x0XHQqaW5mcCA9IFZYRlNfU0JJKGRlbnRyeS1cdTAwM2VkX3NiKTtcbi1cdHN0cnVjdCB2eGZzX3NiICpyYXdfc2IgPSBpbmZwLVx1MDAzZXZzaV9yYXc7XG4tXHR1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoZGVudHJ5LVx1MDAzZWRfc2ItXHUwMDNlc19iZGV2LVx1MDAzZWJkX2Rldik7XG4tXG4tXHRidWZwLVx1MDAzZWZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7XG4tXHRidWZwLVx1MDAzZWZfYnNpemUgPSBkZW50cnktXHUwMDNlZF9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGJ1ZnAtXHUwMDNlZl9ibG9ja3MgPSBmczMyX3RvX2NwdShpbmZwLCByYXdfc2ItXHUwMDNldnNfZHNpemUpO1xuLVx0YnVmcC1cdTAwM2VmX2JmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVx1MDAzZXZzX2ZyZWUpO1xuLVx0YnVmcC1cdTAwM2VmX2JhdmFpbCA9IDA7XG4tXHRidWZwLVx1MDAzZWZfZmlsZXMgPSAwO1xuLVx0YnVmcC1cdTAwM2VmX2ZmcmVlID0gZnMzMl90b19jcHUoaW5mcCwgcmF3X3NiLVx1MDAzZXZzX2lmcmVlKTtcbi1cdGJ1ZnAtXHUwMDNlZl9mc2lkID0gdTY0X3RvX2ZzaWQoaWQpO1xuLVx0YnVmcC1cdTAwM2VmX25hbWVsZW4gPSBWWEZTX05BTUVMRU47XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIGludCB2eGZzX3JlY29uZmlndXJlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzeW5jX2ZpbGVzeXN0ZW0oZmMtXHUwMDNlcm9vdC1cdTAwM2VkX3NiKTtcbi1cdGZjLVx1MDAzZXNiX2ZsYWdzIHw9IFNCX1JET05MWTtcbi1cdHJldHVybiAwO1xuLX1cbi1cbi1zdGF0aWMgc3RydWN0IGlub2RlICp2eGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4te1xuLVx0c3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmk7XG4tXG4tXHR2aSA9IGFsbG9jX2lub2RlX3NiKHNiLCB2eGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXZpKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cdGlub2RlX2luaXRfb25jZShcdTAwMjZ2aS1cdTAwM2V2ZnNfaW5vZGUpO1xuLVx0cmV0dXJuIFx1MDAyNnZpLVx1MDAzZXZmc19pbm9kZTtcbi19XG4tXG4tc3RhdGljIHZvaWQgdnhmc19mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4te1xuLVx0a21lbV9jYWNoZV9mcmVlKHZ4ZnNfaW5vZGVfY2FjaGVwLCBWWEZTX0lOTyhpbm9kZSkpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdnhmc19zdXBlcl9vcHMgPSB7XG4tXHQuYWxsb2NfaW5vZGVcdFx0PSB2eGZzX2FsbG9jX2lub2RlLFxuLVx0LmZyZWVfaW5vZGVcdFx0PSB2eGZzX2ZyZWVfaW5vZGUsXG4tXHQuZXZpY3RfaW5vZGVcdFx0PSB2eGZzX2V2aWN0X2lub2RlLFxuLVx0LnB1dF9zdXBlclx0XHQ9IHZ4ZnNfcHV0X3N1cGVyLFxuLVx0LnN0YXRmc1x0XHRcdD0gdnhmc19zdGF0ZnMsXG4tfTtcbi1cbi1zdGF0aWMgaW50IHZ4ZnNfdHJ5X3NiX21hZ2ljKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXG4tXHRcdHVuc2lnbmVkIGJsaywgX19mczMyIG1hZ2ljKVxuLXtcbi1cdHN0cnVjdCBidWZmZXJfaGVhZCAqYnA7XG4tXHRzdHJ1Y3Qgdnhmc19zYiAqcnNicDtcbi1cdHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnAgPSBWWEZTX1NCSShzYnApO1xuLVx0aW50IHNpbGVudCA9IGZjLVx1MDAzZXNiX2ZsYWdzIFx1MDAyNiBTQl9TSUxFTlQ7XG4tXHRpbnQgcmMgPSAtRU5PTUVNO1xuLVxuLVx0YnAgPSBzYl9icmVhZChzYnAsIGJsayk7XG4tXHRkbyB7XG4tXHRcdGlmICghYnAgfHwgIWJ1ZmZlcl9tYXBwZWQoYnApKSB7XG4tXHRcdFx0aWYgKCFzaWxlbnQpIHtcbi1cdFx0XHRcdHdhcm5mKGZjLFxuLVx0XHRcdFx0ICAgICAgXCJ2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2sgYXQgJXVcIixcbi1cdFx0XHRcdCAgICAgIGJsayk7XG4tXHRcdFx0fVxuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXG4tXHRcdHJjID0gLUVJTlZBTDtcbi1cdFx0cnNicCA9IChzdHJ1Y3Qgdnhmc19zYiAqKWJwLVx1MDAzZWJfZGF0YTtcbi1cdFx0aWYgKHJzYnAtXHUwMDNldnNfbWFnaWMgIT0gbWFnaWMpIHtcbi1cdFx0XHRpZiAoIXNpbGVudClcbi1cdFx0XHRcdGluZm9mKGZjLFxuLVx0XHRcdFx0ICAgICAgXCJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljICUwOHggYXQgJXVcIixcbi1cdFx0XHRcdCAgICAgIHJzYnAtXHUwMDNldnNfbWFnaWMsIGJsayk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cbi1cdFx0cmMgPSAwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9yYXcgPSByc2JwO1xuLVx0XHRpbmZwLVx1MDAzZXZzaV9icCA9IGJwO1xuLVx0fSB3aGlsZSAoMCk7XG4tXG4tXHRpZiAocmMpIHtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfcmF3ID0gTlVMTDtcbi1cdFx0aW5mcC1cdTAwM2V2c2lfYnAgPSBOVUxMO1xuLVx0XHRicmVsc2UoYnApO1xuLVx0fVxuLVxuLVx0cmV0dXJuIHJjO1xuLX1cbi1cbi0vKipcbi0gKiB2eGZzX2ZpbGxfc3VwZXIgLSByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGluaXRpYWxpemUgZmlsZXN5c3RlbVxuLSAqIEBzYnA6XHRcdFZGUyBzdXBlcmJsb2NrICh0byBmaWxsKVxuLSAqIEBmYzpcdFx0XHRmaWxlc3l0ZW0gY29udGV4dFxuLSAqXG4tICogRGVzY3JpcHRpb246XG4tICogICBXZSBhcmUgY2FsbGVkIG9uIHRoZSBmaXJzdCBtb3VudCBvZiBhIGZpbGVzeXN0ZW0gdG8gcmVhZCB0aGVcbi0gKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuXG4tICpcbi0gKiBSZXR1cm5zOlxuLSAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC5cbi0gKlxuLSAqIExvY2tpbmc6XG4tICogICBXZSBhcmUgdW5kZXIgQHNicC1cdTAwM2VzX2xvY2suXG4tICovXG4tc3RhdGljIGludCB2eGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbi17XG4tXHRzdHJ1Y3Qgdnhmc19zYl9pbmZvXHQqaW5mcDtcbi1cdHN0cnVjdCB2eGZzX3NiXHRcdCpyc2JwO1xuLVx0dV9sb25nXHRcdFx0YnNpemU7XG4tXHRzdHJ1Y3QgaW5vZGUgKnJvb3Q7XG4tXHRpbnQgcmV0ID0gLUVJTlZBTDtcbi1cdGludCBzaWxlbnQgPSBmYy1cdTAwM2VzYl9mbGFncyBcdTAwMjYgU0JfU0lMRU5UO1xuLVx0dTMyIGo7XG4tXG4tXHRzYnAtXHUwMDNlc19mbGFncyB8PSBTQl9SRE9OTFk7XG4tXG4tXHRpbmZwID0ga3phbGxvY19vYmooKmluZnApO1xuLVx0aWYgKCFpbmZwKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbmNvcmUgc3VwZXJibG9ja1wiKTtcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHR9XG4tXG4tXHRic2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2JwLCBCTE9DS19TSVpFKTtcbi1cdGlmICghYnNpemUpIHtcbi1cdFx0d2FybmYoZmMsIFwidnhmczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcIik7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0c2JwLVx1MDAzZXNfb3AgPSBcdTAwMjZ2eGZzX3N1cGVyX29wcztcbi1cdHNicC1cdTAwM2VzX2ZzX2luZm8gPSBpbmZwO1xuLVx0c2JwLVx1MDAzZXNfdGltZV9taW4gPSAwO1xuLVx0c2JwLVx1MDAzZXNfdGltZV9tYXggPSBVMzJfTUFYO1xuLVxuLVx0aWYgKCF2eGZzX3RyeV9zYl9tYWdpYyhzYnAsIGZjLCAxLFxuLVx0XHRcdChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fbGUzMihWWEZTX1NVUEVSX01BR0lDKSkpIHtcbi1cdFx0LyogVW5peHdhcmUsIHg4NiAqL1xuLVx0XHRpbmZwLVx1MDAzZWJ5dGVfb3JkZXIgPSBWWEZTX0JPX0xFO1xuLVx0fSBlbHNlIGlmICghdnhmc190cnlfc2JfbWFnaWMoc2JwLCBmYywgOCxcbi1cdFx0XHQoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2JlMzIoVlhGU19TVVBFUl9NQUdJQykpKSB7XG4tXHRcdC8qIEhQLVVYLCBwYXJpc2MgKi9cbi1cdFx0aW5mcC1cdTAwM2VieXRlX29yZGVyID0gVlhGU19CT19CRTtcbi1cdH0gZWxzZSB7XG4tXHRcdGlmICghc2lsZW50KVxuLVx0XHRcdGluZm9mKGZjLCBcInZ4ZnM6IGNhbid0IGZpbmQgc3VwZXJibG9jay5cIik7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVxuLVx0cnNicCA9IGluZnAtXHUwMDNldnNpX3Jhdztcbi1cdGogPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX3ZlcnNpb24pO1xuLVx0aWYgKChqIFx1MDAzYyAyIHx8IGogXHUwMDNlIDQpIFx1MDAyNlx1MDAyNiAhc2lsZW50KSB7XG4tXHRcdGluZm9mKGZjLCBcInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXCIsIGopO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi0jaWZkZWYgRElBR05PU1RJQ1xuLVx0cHJpbnRrKEtFUk5fREVCVUcgXCJ2eGZzOiBzdXBwb3J0ZWQgVnhGUyB2ZXJzaW9uICglZClcXG5cIiwgaik7XG4tXHRwcmludGsoS0VSTl9ERUJVRyBcInZ4ZnM6IGJsb2Nrc2l6ZTogJWRcXG5cIixcbi1cdFx0ZnMzMl90b19jcHUoaW5mcCwgcnNicC1cdTAwM2V2c19ic2l6ZSkpO1xuLSNlbmRpZlxuLVxuLVx0c2JwLVx1MDAzZXNfbWFnaWMgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX21hZ2ljKTtcbi1cbi1cdGluZnAtXHUwMDNldnNpX29sdGV4dCA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfb2x0ZXh0WzBdKTtcbi1cdGluZnAtXHUwMDNldnNpX29sdHNpemUgPSBmczMyX3RvX2NwdShpbmZwLCByc2JwLVx1MDAzZXZzX29sdHNpemUpO1xuLVxuLVx0aiA9IGZzMzJfdG9fY3B1KGluZnAsIHJzYnAtXHUwMDNldnNfYnNpemUpO1xuLVx0aWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgaikpIHtcbi1cdFx0d2FybmYoZmMsIFwidnhmczogdW5hYmxlIHRvIHNldCBmaW5hbCBibG9jayBzaXplXCIpO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbi1cbi1cdGlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIG9sdFwiKTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRpZiAodnhmc19yZWFkX2ZzaGVhZChzYnApKSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byByZWFkIGZzaGVhZFwiKTtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4tXG4tXHRyb290ID0gdnhmc19pZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7XG4tXHRpZiAoSVNfRVJSKHJvb3QpKSB7XG4tXHRcdHJldCA9IFBUUl9FUlIocm9vdCk7XG4tXHRcdGdvdG8gb3V0O1xuLVx0fVxuLVx0c2JwLVx1MDAzZXNfcm9vdCA9IGRfbWFrZV9yb290KHJvb3QpO1xuLVx0aWYgKCFzYnAtXHUwMDNlc19yb290KSB7XG4tXHRcdHdhcm5mKGZjLCBcInZ4ZnM6IHVuYWJsZSB0byBnZXQgcm9vdCBkZW50cnkuXCIpO1xuLVx0XHRnb3RvIG91dF9mcmVlX2lsaXN0O1xuLVx0fVxuLVxuLVx0cmV0dXJuIDA7XG4tXHRcbi1vdXRfZnJlZV9pbGlzdDpcbi1cdGlwdXQoaW5mcC1cdTAwM2V2c2lfZnNoaXApO1xuLVx0aXB1dChpbmZwLVx1MDAzZXZzaV9pbGlzdCk7XG4tXHRpcHV0KGluZnAtXHUwMDNldnNpX3N0aWxpc3QpO1xuLW91dDpcbi1cdGJyZWxzZShpbmZwLVx1MDAzZXZzaV9icCk7XG4tXHRrZnJlZShpbmZwKTtcbi1cdHJldHVybiByZXQ7XG4tfVxuLVxuLS8qXG4tICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi5cbi0gKi9cbi1zdGF0aWMgaW50IHZ4ZnNfZ2V0X3RyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdHJldHVybiBnZXRfdHJlZV9iZGV2KGZjLCB2eGZzX2ZpbGxfc3VwZXIpO1xuLX1cbi1cbi1zdGF0aWMgY29uc3Qgc3RydWN0IGZzX2NvbnRleHRfb3BlcmF0aW9ucyB2eGZzX2NvbnRleHRfb3BzID0ge1xuLVx0LmdldF90cmVlXHQ9IHZ4ZnNfZ2V0X3RyZWUsXG4tXHQucmVjb25maWd1cmVcdD0gdnhmc19yZWNvbmZpZ3VyZSxcbi19O1xuLVxuLXN0YXRpYyBpbnQgdnhmc19pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuLXtcbi1cdGZjLVx1MDAzZW9wcyA9IFx1MDAyNnZ4ZnNfY29udGV4dF9vcHM7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZ4ZnNfZnNfdHlwZSA9IHtcbi1cdC5vd25lclx0XHQ9IFRISVNfTU9EVUxFLFxuLVx0Lm5hbWVcdFx0PSBcInZ4ZnNcIixcbi1cdC5raWxsX3NiXHQ9IGtpbGxfYmxvY2tfc3VwZXIsXG4tXHQuZnNfZmxhZ3NcdD0gRlNfUkVRVUlSRVNfREVWLFxuLVx0LmluaXRfZnNfY29udGV4dCA9IHZ4ZnNfaW5pdF9mc19jb250ZXh0LFxuLX07XG4tTU9EVUxFX0FMSUFTX0ZTKFwidnhmc1wiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovXG4tTU9EVUxFX0FMSUFTKFwidnhmc1wiKTtcbi1cbi1zdGF0aWMgaW50IF9faW5pdFxuLXZ4ZnNfaW5pdCh2b2lkKVxuLXtcbi1cdGludCBydjtcbi1cbi1cdHZ4ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNvcHkoXCJ2eGZzX2lub2RlXCIsXG4tXHRcdFx0c2l6ZW9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8pLCAwLFxuLVx0XHRcdFNMQUJfUkVDTEFJTV9BQ0NPVU5ULFxuLVx0XHRcdG9mZnNldG9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sIHZpaV9pbW1lZC52aV9pbW1lZCksXG4tXHRcdFx0c2l6ZW9mX2ZpZWxkKHN0cnVjdCB2eGZzX2lub2RlX2luZm8sXG4tXHRcdFx0XHR2aWlfaW1tZWQudmlfaW1tZWQpLFxuLVx0XHRcdE5VTEwpO1xuLVx0aWYgKCF2eGZzX2lub2RlX2NhY2hlcClcbi1cdFx0cmV0dXJuIC1FTk9NRU07XG4tXHRydiA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oXHUwMDI2dnhmc19mc190eXBlKTtcbi1cdGlmIChydiBcdTAwM2MgMClcbi1cdFx0a21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTtcbi1cdHJldHVybiBydjtcbi19XG4tXG4tc3RhdGljIHZvaWQgX19leGl0XG4tdnhmc19jbGVhbnVwKHZvaWQpXG4te1xuLVx0dW5yZWdpc3Rlcl9maWxlc3lzdGVtKFx1MDAyNnZ4ZnNfZnNfdHlwZSk7XG4tXHQvKlxuLVx0ICogTWFrZSBzdXJlIGFsbCBkZWxheWVkIHJjdSBmcmVlIGlub2RlcyBhcmUgZmx1c2hlZCBiZWZvcmUgd2Vcbi1cdCAqIGRlc3Ryb3kgY2FjaGUuXG4tXHQgKi9cbi1cdHJjdV9iYXJyaWVyKCk7XG4tXHRrbWVtX2NhY2hlX2Rlc3Ryb3kodnhmc19pbm9kZV9jYWNoZXApO1xuLX1cbi1cbi1tb2R1bGVfaW5pdCh2eGZzX2luaXQpO1xuLW1vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0zMFQxODo0MDoxMC43MTI4NjY3NzJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NjcyNzczMTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhpcyBwYXRjaCB0aGF0IGVzc2VudGlhbGx5IG51a2VzIHRoZSBgZnJlZXZ4ZnNgIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBJdCdzIGEgY29tcGxldGUgcmVtb3ZhbDsgdGhlIGVudGlyZSBgZnMvZnJlZXZ4ZnMvYCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgYXJlIGdvbmUuIE5hdHVyYWxseSwgdGhlIGFzc29jaWF0ZWQgZW50cmllcyBpbiBgZnMvS2NvbmZpZ2AsIGBmcy9NYWtlZmlsZWAsIGFuZCBgTUFJTlRBSU5FUlNgIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIHdlbGwuXG5cblRoZSBpbW1lZGlhdGUgdGhvdWdodCBpczogU2luY2Ugd2UncmUgKnJlbW92aW5nKiBjb2RlLCB0aGVyZSdzIG5vdGhpbmcgKm5ldyogdG8gZnV6ei4gTm8gbmV3IGF0dGFjayBzdXJmYWNlIGludHJvZHVjZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5CdXQsIGFzIGFsd2F5cywgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBMZXQncyBzZWUuLi4gdGhlIHByb21wdCByZW1pbmRzIG1lIHRoYXQgY2VydGFpbiB0eXBlcyBvZiBjaGFuZ2VzIGRvbid0IHdhcnJhbnQgZnV6emluZy4gVGhpbmdzIGxpa2UgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLCBLY29uZmlnIHR3ZWFrcywgb3IgY29tbWVudCBjaGFuZ2VzIGFyZSBleGNsdWRlZC4gQWxzbyBkZWNvcmF0aXZlIGxvZ2dpbmcsIHVucmVhY2hhYmxlIGNvZGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCBzcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYSAqcmVtb3ZhbCogb2YgdGhlIGNvZGUuXG5cbkFscmlnaHQsIGxldCdzIGNvbmZpcm0gdGhlIHNjb3BlIG9mIHRoaXMgcGF0Y2guIFRoZSBkaWZmIHNob3dzLi4uIHllYWgsIGl0J3MgYSB3aG9sZXNhbGUgZGVsZXRpb24uIFRoZSBNQUlOVEFJTkVSUywgS2NvbmZpZywgTWFrZWZpbGUgYW5kIGFsbCB0aGUgZmlsZXMgaW5zaWRlIHRoZSBkaXJlY3RvcnksIGFsbCBkZWxldGVkOiBgdnhmcy5oYCwgYHZ4ZnNfYm1hcC5jYCwgYHZ4ZnNfZGlyLmhgLCBgdnhmc19leHRlcm4uaGAsIGFuZCBvbiBhbmQgb24uLi5hbGwgZGVsZXRlZC5cblxuU28sIHRoZXJlJ3Mgbm8gbmV3IGNvZGUgaW50cm9kdWNlZCwganVzdCBjb2RlIHJlbW92ZWQuIE5vIG5lZWQgdG8gZnV6eiBhbnl0aGluZyBoZXJlLlxuXG5Pa2F5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCB0YWtlIG9uZSBsYXN0IGxvb2sgdGhyb3VnaCB0aGUgZGlmZiB0byBtYWtlIHN1cmUgbm90aGluZyBlbHNlIHNsaXBwZWQgaW4uIE5vLCB0aGF0J3MgaXQuIEl0J3MgcHVyZWx5IGEgZGVsZXRpb24gb2YgdGhlIGBmcmVldnhmc2AgZmlsZXN5c3RlbS5cblxuVGhlcmVmb3JlLCBteSBmaW5hbCBhc3Nlc3NtZW50IGlzIGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTc0NCwiT3V0cHV0VG9rZW5zIjo1OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTMwVDE4OjQwOjE5LjM4NTY0MjcyMloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc1MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY29tcGxldGVseSByZW1vdmVzIHRoZSBmcmVldnhmcyBmaWxlc3lzdGVtIGZyb20gdGhlIGtlcm5lbC4gVGhlcmUgaXMgbm8gbmV3IG9yIG1vZGlmaWVkIGNvZGUgdG8gZnV6eiwgb25seSBkZWxldGVkIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIGZyZWV2eGZzIGZpbGVzeXN0ZW0gZnJvbSB0aGUga2VybmVsLiBUaGVyZSBpcyBubyBuZXcgb3IgbW9kaWZpZWQgY29kZSB0byBmdXp6LCBvbmx5IGRlbGV0ZWQgY29kZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowrtmws[1] Phase: Running StartedAt: 2026-07-30 18:40:30 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowrtmws[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-07-30 18:40:30 +0000 UTC FinishedAt: 2026-07-30 18:40:35 +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,}