Name: series-workflow69p46 Phase: Succeeded StartedAt: 2026-08-18 04:30:47 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[0] Phase: Succeeded StartedAt: 2026-08-18 04:30:47 +0000 UTC FinishedAt: 2026-08-18 05:14:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[0].run-triage Phase: Succeeded StartedAt: 2026-08-18 04:30:47 +0000 UTC FinishedAt: 2026-08-18 05:14:54 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "kvm-x86", "tree_url": "https://github.com/kvm-x86/linux.git", "commit_hash": "1b731e5ded480bd1e5546aed35584238661ce72e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "VHOST_NET", "VHOST_VSOCK", "VSOCKETS", "EVENTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "kvm-x86", "tree_url": "https://github.com/kvm-x86/linux.git", "commit_hash": "1b731e5ded480bd1e5546aed35584238661ce72e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "VHOST_NET", "VHOST_VSOCK", "VSOCKETS", "EVENTFD" ], "series_id": "0108ef0a-73bd-4f6d-b806-48ec9c5c5f84" }, "track": "KASAN", "fuzz": { "focus": [ "kvm", "net" ], "focus_symbols": [ "vhost_net_ioctl", "vhost_vsock_dev_ioctl", "vhost_clear_device_iotlb", "vhost_init_device_iotlb", "vq_meta_prefetch", "vhost_net_set_features", "vhost_vsock_set_features" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1ZIT1NUX05FVCYjMzQ7LAogICAgJiMzNDtWSE9TVF9WU09DSyYjMzQ7LAogICAgJiMzNDtWU09DS0VUUyYjMzQ7LAogICAgJiMzNDtFVkVOVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dmhvc3RfbmV0X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X3Zzb2NrX2Rldl9pb2N0bCYjMzQ7LAogICAgJiMzNDt2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGImIzM0OywKICAgICYjMzQ7dmhvc3RfaW5pdF9kZXZpY2VfaW90bGImIzM0OywKICAgICYjMzQ7dnFfbWV0YV9wcmVmZXRjaCYjMzQ7LAogICAgJiMzNDt2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzJiMzNDssCiAgICAmIzM0O3Zob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHJlc3NlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSB2aG9zdCBkZXZpY2UgSU9UTEIgYW5kIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgKGB2cS1cdTAwM2VkZXNjYCwgYHZxLVx1MDAzZWF2YWlsYCwgYHZxLVx1MDAzZXVzZWRgKS4gSXQgZW5zdXJlcyB0aGF0IHdoZW4gdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgaXMgY2xlYXJlZCwgdGhlIElPVExCIGlzIHByb3Blcmx5IGZyZWVkIGFuZCB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgaW52YWxpZGF0ZWQgKHNldCB0byBOVUxMKS4gSXQgYWxzbyBhZGRzIGEgY2hlY2sgaW4gYHZxX21ldGFfcHJlZmV0Y2hgIHRvIHByZXZlbnQgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiB0aGUgYWNjZXNzIHBvaW50ZXJzIGFyZSBub3Qgc2V0LiBUaGVzZSBjaGFuZ2VzIGZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXRpZXMsIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgY2F1c2VkIGJ5IHN0YWxlIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gbmV3IHN0cnVjdHVyZXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBjb3BpZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgaXMgdGhlcmUgYW55IGxvZ2ljIHRoYXQgZXhwb3NlcyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFN0YW5kYXJkIEtBU0FOICh3aGljaCBkZXRlY3RzIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzKSBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcgKHdoaWNoIGNhdGNoZXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcykgYXJlIGZ1bGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZSBidWdzIHRoaXMgcGF0Y2ggYWltcyB0byBmaXguIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDkyYTJhYThmNGUzNzYxNGJhMzExNzJlZmMyM2MzOWQ3MmNjOWY4MDZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuaW5kZXggNzdiNTlmNDliZGRiMy4uNjQ2NzFjZjc3YTM1ZSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcbkBAIC0xNjczLDYgJiM0MzsxNjczLDcgQEAgc3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXG4gc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4ge1xuIFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbiYjNDM7XHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcbkBAIC0xNzAxLDggJiM0MzsxNzAyLDExIEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4gXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4tXHRcdGlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldikpXG4mIzQzO1x0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4mIzQzO1x0XHRpZiAocmV0KVxuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbiBcdH1cbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG5AQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFxuIG91dF91bmxvY2s6XG4gXHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuLVx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jXG5AQCAtMzQ0LDYgJiM0MzszNDQsMTcgQEAgc3RhdGljIHZvaWQgX192aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIFx0XHR2cS1cdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcbiB9XG4gXG4mIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4mIzQzO3tcbiYjNDM7XHR2cS1cdTAwM2VkZXNjID0gTlVMTDtcbiYjNDM7XHR2cS1cdTAwM2VhdmFpbCA9IE5VTEw7XG4mIzQzO1x0dnEtXHUwMDNldXNlZCA9IE5VTEw7XG4mIzQzO1x0dnEtXHUwMDNlbG9nX3VzZWQgPSBmYWxzZTtcbiYjNDM7XHR2cS1cdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xuJiM0MztcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdGludCBpO1xuQEAgLTE5MTEsNiAmIzQzOzE5MjIsOSBAQCBpbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbiB7XG4gXHR1bnNpZ25lZCBpbnQgbnVtID0gdnEtXHUwMDNlbnVtO1xuIFxuJiM0MztcdGlmICghdnEtXHUwMDNlZGVzYyB8fCAhdnEtXHUwMDNlYXZhaWwgfHwgIXZxLVx1MDAzZXVzZWQpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHRpZiAoIXZxLVx1MDAzZWlvdGxiKVxuIFx0XHRyZXR1cm4gMTtcbiBcbkBAIC0yMjcwLDExICYjNDM7MjI4NCw0OCBAQCBsb25nIHZob3N0X3ZyaW5nX2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7XG4gXG4mIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIGRldmljZSBtdXRleC4gKi9cbiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbiYjNDM7XHRpZiAoIWlvdGxiKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIGRldmljZS13aWRlIHZpZXcgZmlyc3QuICBFYWNoIFZRIHRoZW4gZHJvcHMgaXRzXG4mIzQzO1x0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cbiYjNDM7XHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4mIzQzO1x0ICogaGFuZG9mZiwgc2luY2UgYSB3b3JrZXIgbWF5IHN0aWxsIGJlIHVzaW5nIGl0IHdoaWxlIHdhaXRpbmdcbiYjNDM7XHQgKiBmb3IgaXRzIFZRIG11dGV4LlxuJiM0MztcdCAqL1xuJiM0MztcdGQtXHUwMDNlaW90bGIgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXHUwMDNldnFzW2ldO1xuJiM0MztcbiYjNDM7XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuJiM0MztcdFx0dnEtXHUwMDNlaW90bGIgPSBOVUxMO1xuJiM0MztcdFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xuJiM0MztcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHZob3N0X2NsZWFyX21zZyhkKTtcbiYjNDM7XHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcbiYjNDM7XHR3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbChcdTAwMjZkLVx1MDAzZXdhaXQsIEVQT0xMSU4gfCBFUE9MTFJETk9STSk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcbiYjNDM7XG4gaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXG4ge1xuIFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHRpZiAoZC1cdTAwM2Vpb3RsYilcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XG4gXHRpZiAoIW5pb3RsYilcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5AQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIFxuIFx0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdFx0dnEtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4tXHRcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4mIzQzO1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5oIGIvZHJpdmVycy92aG9zdC92aG9zdC5oXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbkBAIC0yNzcsNiAmIzQzOzI3Nyw3IEBAIHNzaXplX3Qgdmhvc3RfY2hyX3JlYWRfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsIHN0cnVjdCBpb3ZfaXRlciAqdG8sXG4gXHRcdFx0ICAgIGludCBub2Jsb2NrKTtcbiBzc2l6ZV90IHZob3N0X2Nocl93cml0ZV9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldixcbiBcdFx0XHQgICAgIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSk7XG4mIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpO1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBcbiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5pbmRleCA5YWFhYjZiYjgwNjFjLi43N2E1YTY3NzVjODZmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcbkBAIC04NTQsNiAmIzQzOzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxuIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbiYjNDM7XHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aWYgKGZlYXR1cmVzIFx1MDAyNiB+VkhPU1RfVlNPQ0tfRkVBVFVSRVMpXG5AQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFx0XHRnb3RvIGVycjtcbiBcdH1cbiBcbi1cdGlmICgoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSkge1xuLVx0XHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KSlcbiYjNDM7XHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4mIzQzO1x0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZ2c29jay1cdTAwM2VkZXYpO1xuJiM0MztcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIGVycjtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4gXHR9XG4gXG4gXHR2c29jay1cdTAwM2VzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIFZJUlRJT19WU09DS19GX1NFUVBBQ0tFVCk7XG5AQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXG4gXG4gZXJyOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgbG9uZyB2aG9zdF92c29ja19kZXZfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VkhPU1RfTkVUJiMzNDssCiAgICAmIzM0O1ZIT1NUX1ZTT0NLJiMzNDssCiAgICAmIzM0O1ZTT0NLRVRTJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2aG9zdF9uZXRfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X2NsZWFyX2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2aG9zdF9pbml0X2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2cV9tZXRhX3ByZWZldGNoJiMzNDssCiAgICAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTE2NzMsNiAmIzQzOzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogewogCXNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47CiYjNDM7CWludCByZXQgPSAtRUZBVUxUOwogCWludCBpOwogCiAJaGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHwKQEAgLTE3MDEsOCAmIzQzOzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHsKLQkJaWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KSkKJiM0MzsJCXJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoJmFtcDtuLSZndDtkZXYpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBWSE9TVF9ORVRfVlFfTUFYOyAmIzQzOyYjNDM7aSkgewpAQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogCiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYW1wO24tJmd0O2Rldi5tdXRleCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwppbmRleCA0YzUyNWIzZTE2ZWFkLi45Zjc0NTM3YjFjMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jCkBAIC0zNDQsNiAmIzQzOzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiAJCXZxLSZndDttZXRhX2lvdGxiW2pdID0gTlVMTDsKIH0KIAomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi8KJiM0MztzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKJiM0Mzt7CiYjNDM7CXZxLSZndDtkZXNjID0gTlVMTDsKJiM0MzsJdnEtJmd0O2F2YWlsID0gTlVMTDsKJiM0MzsJdnEtJmd0O3VzZWQgPSBOVUxMOwomIzQzOwl2cS0mZ3Q7bG9nX3VzZWQgPSBmYWxzZTsKJiM0MzsJdnEtJmd0O2xvZ19hZGRyID0gLTF1bGw7CiYjNDM7CV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCWludCBpOwpAQCAtMTkxMSw2ICYjNDM7MTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCXVuc2lnbmVkIGludCBudW0gPSB2cS0mZ3Q7bnVtOwogCiYjNDM7CWlmICghdnEtJmd0O2Rlc2MgfHwgIXZxLSZndDthdmFpbCB8fCAhdnEtJmd0O3VzZWQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlpZiAoIXZxLSZndDtpb3RsYikKIAkJcmV0dXJuIDE7CiAKQEAgLTIyNzAsMTEgJiM0MzsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7CiAKJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovCiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpb3RsYiA9IGQtJmd0O2lvdGxiOwomIzQzOwlpZiAoIWlvdGxiKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0cwomIzQzOwkgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LgomIzQzOwkgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzCiYjNDM7CSAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nCiYjNDM7CSAqIGZvciBpdHMgVlEgbXV0ZXguCiYjNDM7CSAqLwomIzQzOwlkLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkLSZndDtudnFzOyAmIzQzOyYjNDM7aSkgewomIzQzOwkJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLSZndDt2cXNbaV07CiYjNDM7CiYjNDM7CQltdXRleF9sb2NrKCZhbXA7dnEtJmd0O211dGV4KTsKJiM0MzsJCXZxLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZob3N0X2NsZWFyX21zZyhkKTsKJiM0MzsJdmhvc3RfaW90bGJfZnJlZShpb3RsYik7CiYjNDM7CXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZhbXA7ZC0mZ3Q7d2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTsKJiM0MzsKIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCXN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiOwogCWludCBpOwogCiYjNDM7CWlmIChkLSZndDtpb3RsYikKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCW5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7CiAJaWYgKCFuaW90bGIpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogCiAJCW11dGV4X2xvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwogCQl2cS0mZ3Q7aW90bGIgPSBuaW90bGI7Ci0JCV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiAJCW11dGV4X3VubG9jaygmYW1wO3ZxLSZndDttdXRleCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKaW5kZXggMDE5MmFkZTZlNzQ5MS4uM2M3NWU4MDg5MzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaApAQCAtMjc3LDYgJiM0MzsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLAogCQkJICAgIGludCBub2Jsb2NrKTsKIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pOwomIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogCiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMKaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suYwpAQCAtODU0LDYgJiM0Mzs4NTQsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9jaWQoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGd1ZXN0X2NpZCkKIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKJiM0MzsJaW50IHJldCA9IC1FRkFVTFQ7CiAJaW50IGk7CiAKIAlpZiAoZmVhdHVyZXMgJmFtcDsgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKQpAQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKQogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAoKGZlYXR1cmVzICZhbXA7ICgxVUxMICZsdDsmbHQ7IFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpKSB7Ci0JCWlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpKQomIzQzOwlpZiAoZmVhdHVyZXMgJmFtcDsgKDFVTEwgJmx0OyZsdDsgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkgewomIzQzOwkJcmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoJmFtcDt2c29jay0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXZob3N0X2NsZWFyX2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpOwogCX0KIAogCXZzb2NrLSZndDtzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpOwpAQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpCiAKIGVycjoKIAltdXRleF91bmxvY2soJmFtcDt2c29jay0mZ3Q7ZGV2Lm11dGV4KTsKLQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwNDEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBUaG91Z2h0cyBvbiBUaGlzIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIGhlcmUsIGFuZCBpdCYjMzk7cyB0b3VjaGluZyBzZXZlcmFsIGZpbGVzIHdpdGhpbiB0aGUgYGRyaXZlcnMvdmhvc3RgIGRpcmVjdG9yeTogYG5ldC5jYCwgYHZob3N0LmNgLCBgdmhvc3QuaGAsIGFuZCBgdnNvY2suY2AuIFRoZSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCYjMzk7cyBkZWFsaW5nIHdpdGggc29tZSBpbnRlcmFjdGlvbiBvZiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC4gSXQgbG9va3MgbGlrZSB0aGVyZSYjMzk7cyBhbiBpc3N1ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGV2ZW4gd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3QgZW5hYmxlZCwgd2hpY2ggaXMgYSBiaXQgY29uY2VybmluZywgYmVjYXVzZSBpdCBpbXBsaWVzIHNvbWV0aGluZyBtaWdodCBiZSBnZXR0aW5nIGNsZWFyZWQgdGhhdCBzaG91bGRuJiMzOTt0IGJlLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCB0byBhZGRyZXNzIHRoaXMuCgpIb3dldmVyLCBhIG1vcmUgZ2xhcmluZyBpc3N1ZSBzdGFuZHMgb3V0LiBUaGUgcGF0Y2ggbWVudGlvbnMgYSByZXR1cm4gdmFsdWUgYnVnIGluIGJvdGggYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gSXQgY2xhaW1zIHRoZXkgd2VyZSBhbHdheXMgcmV0dXJuaW5nIGAtRUZBVUxUYCBvbiBzdWNjZXNzLi4uIFRoYXQmIzM5O3MgYSBodWdlIHJlZCBmbGFnLiBgLUVGQVVMVGAgaW5kaWNhdGVzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIG5vdCBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBzbyB0aGlzIHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkgYnJva2VuIHRoZSBmdW5jdGlvbmFsaXR5LiBIb3cgZGlkICp0aGF0KiBldmVyIHdvcms/CgpJJiMzOTttIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgZGlmZiBmb3IgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIHRvIGNvbmZpcm0uIEhlcmUgaXQgaXMuLi4gSXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBkaWQgaW5kZWVkIGhhdmUgYHJldHVybiAtRUZBVUxUO2AgYXQgdGhlIGVuZCEgVGhhdOKAmXMgaW5jcmVkaWJseSBzdHJhbmdlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgdGhpcyB3YXNuJiMzOTt0IGNhdWdodCBlYXJsaWVyLCBhbmQgd2hhdCBpbXBhY3QgdGhpcyBidWcgaGFkIGluIHByYWN0aWNlLiBUaGlzIGNvdWxkIGJlIGEgc2lnbmlmaWNhbnQgb3ZlcnNpZ2h0LiBMZXQgbWUgc2VlIGhvdyB0aGUgZnVuY3Rpb24gd29ya2VkLCBpbiB0aGUgZmlyc3QgcGxhY2UuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jPTE2NDM9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjcyLVxuZHJpdmVycy92aG9zdC9uZXQuYzoxNjczOnN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjc0LXtcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jPTE3NDk9c3RhdGljIGxvbmcgdmhvc3RfbmV0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzc3LVx0XHR2aXJ0aW9fZmVhdHVyZXNfZnJvbV91NjQoYWxsX2ZlYXR1cmVzLCBmZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jOjE3Nzg6XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzktXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFU19BUlJBWTpcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MTktXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4MjA6XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MjEtXHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwOTQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24sIGFzIGEgc2Vhc29uZWQgbmV0d29yayB2aXJ0dWFsaXphdGlvbiBleHBlcnQ6CgoqKkRpdmluZyBpbnRvIHZob3N0X25ldF9zZXRfZmVhdHVyZXMqKgoKT2theSwgbGV0JiMzOTtzIHB1bGwgdXAgYGRyaXZlcnMvdmhvc3QvbmV0LmNgIGFuZCBzcGVjaWZpY2FsbHksIHRoYXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBJbW1lZGlhdGVseSwgbXkgbWluZCBzdGFydHMgc2lmdGluZyB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMuIFRoaXMgZnVuY3Rpb24gKmhhcyogdG8gYmUgdGhlIGNyaXRpY2FsIHBvaW50IHdoZXJlIHdlIG5lZ290aWF0ZSBhbmQgYXBwbHkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdmlydGlvIG5ldCBkZXZpY2Ugd2l0aGluIGEgdmhvc3QgZW52aXJvbm1lbnQsIHJpZ2h0PyBJJiMzOTttIGFudGljaXBhdGluZyB3ZSYjMzk7bGwgYmUgZGVhbGluZyB3aXRoIHRoZSB1c3VhbCBzdXNwZWN0czogZmVhdHVyZSBuZWdvdGlhdGlvbiwgZHJpdmVyLXNwZWNpZmljIGNhcGFiaWxpdGllcywgbWF5YmUgc29tZSBmZWF0dXJlIG1hc2tpbmcsIGFuZCBkZWZpbml0ZWx5IHNvbWUgY3J1Y2lhbCBjaGVja3MgdG8gZW5zdXJlIHRoZSBob3N0IGFuZCBndWVzdCBhbGlnbiBvbiB3aGF0JiMzOTtzIHN1cHBvcnRlZC4KCkkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzLCBwcm9iYWJseSB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIGFuZCBpdHMgcmVsYXRlZCBmaWVsZHMuIFdlJiMzOTtyZSBnb2luZyB0byBzZWUgaG93IHRoZSBuZWdvdGlhdGVkIGZlYXR1cmVzIGFyZSBzdG9yZWQsIGFuZCBob3cgdGhhdCBhZmZlY3RzIHBhY2tldCBwcm9jZXNzaW5nIGRvd25zdHJlYW0uIERvZXMgaXQgdXNlIGEgYml0bWFwIHRvIHJlcHJlc2VudCBlbmFibGVkIGZlYXR1cmVzPyBIb3cgYXJlIGNvbmZsaWN0aW5nIGZlYXR1cmVzIGhhbmRsZWQ/IEkmIzM5O20gaG9waW5nIHRvIHNlZSBlbGVnYW50IGFuZCBlZmZpY2llbnQgYml0d2lzZSBvcGVyYXRpb25zIGhlcmUsIGdpdmVuIHRoZSBwZXJmb3JtYW5jZSBzZW5zaXRpdml0eSBvZiBuZXR3b3JrIHZpcnR1YWxpemF0aW9uLgoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIFdoYXQgaGFwcGVucyBpZiB0aGUgZ3Vlc3QgYXR0ZW1wdHMgdG8gZW5hYmxlIGEgZmVhdHVyZSB0aGUgaG9zdCBkb2VzbiYjMzk7dCBzdXBwb3J0PyBJcyB0aGVyZSBhIGdyYWNlZnVsIGZhbGxiYWNrIG1lY2hhbmlzbSwgb3IgZG9lcyBpdCB0cmlnZ2VyIGFuIGVycm9yPyBUaGUgZXJyb3IgcGF0aHMgYXJlIGp1c3QgYXMgaW1wb3J0YW50IGFzIHRoZSBoYXBweSBwYXRoLiBJJiMzOTttIGxvb2tpbmcgZm9yIHJvYnVzdCBlcnJvciBjaGVja2luZywgcGFydGljdWxhcmx5IGFyb3VuZCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgbWlnaHQgYXJpc2UgZHVyaW5nIGZlYXR1cmUgbmVnb3RpYXRpb24uCgpGaW5hbGx5LCBJJiMzOTtsbCBiZSByZWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBkYXRhcGF0aC4gSSYjMzk7bSBpbWFnaW5pbmcgaXQgd2lsbCB1cGRhdGUgcmVsZXZhbnQgcGFyYW1ldGVycyBvbiB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIG9yIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ6IGhvdyBkb2VzIGZlYXR1cmUgbmVnb3RpYXRpb24gYWN0dWFsbHkgYWZmZWN0IHBhY2tldCBmb3J3YXJkaW5nLCBjaGVja3N1bSBvZmZsb2FkLCBvciBhbnkgb3RoZXIgYWNjZWxlcmF0ZWQgZnVuY3Rpb25hbGl0eT8gSSBleHBlY3QgdG8gc2VlIGNhbGxiYWNrcyB0byBvdGhlciBmdW5jdGlvbnMgb3Igc3Vic3lzdGVtcyB0byBhY3R1YWxseSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZmVhdHVyZXMuIE9rYXksIHRpbWUgdG8gc2VlIGlmIG15IGludHVpdGlvbnMgYXJlIG9uIHRoZSBtb25leS4gTGV0JiMzOTtzIGRpZyBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNjczLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjczOlx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4xNjc0Olx0e1xuMTY3NTpcdFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbjE2NzY6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuMTY3NzpcdFx0aW50IGk7XG4xNjc4Olx0XG4xNjc5Olx0XHRoZHJfbGVuID0gdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSB8fFxuMTY4MDpcdFx0XHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XG4xNjgxOlx0XHRcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcbjE2ODI6XHRcdFx0ICBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyKTtcbjE2ODM6XHRcbjE2ODQ6XHRcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXG4xNjg1Olx0XHRcdFx0XHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxuMTY4NjpcdFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcbjE2ODc6XHRcdFx0XHRcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcbjE2ODg6XHRcdFx0aGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfdjFfaGFzaF90dW5uZWwpO1xuMTY4OTpcdFxuMTY5MDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XG4xNjkxOlx0XHRcdC8qIHZob3N0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjkyOlx0XHRcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xuMTY5MzpcdFx0XHRzb2NrX2hsZW4gPSAwO1xuMTY5NDpcdFx0fSBlbHNlIHtcbjE2OTU6XHRcdFx0Lyogc29ja2V0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjk2Olx0XHRcdHZob3N0X2hsZW4gPSAwO1xuMTY5NzpcdFx0XHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xuMTY5ODpcdFx0fVxuMTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuMTcyMzpcdG91dF91bmxvY2s6XG4xNzI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTcyNTpcdFx0cmV0dXJuIHJldDtcbjE3MjY6XHR9XG4xNzI3Olx0XG4xNzI4Olx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuMTcyOTpcdHtcbjE3MzA6XHRcdGludCByO1xuMTczMTpcdFxuMTczMjpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzMzOlx0XHRpZiAodmhvc3RfZGV2X2hhc19vd25lcihcdTAwMjZuLVx1MDAzZWRldikpIHtcbjE3MzQ6XHRcdFx0ciA9IC1FQlVTWTtcbjE3MzU6XHRcdFx0Z290byBvdXQ7XG4xNzM2Olx0XHR9XG4xNzM3Olx0XHRyID0gdmhvc3RfbmV0X3NldF91YnVmX2luZm8obik7XG4xNzM4Olx0XHRpZiAocilcbjE3Mzk6XHRcdFx0Z290byBvdXQ7XG4xNzQwOlx0XHRyID0gdmhvc3RfZGV2X3NldF9vd25lcihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzQxOlx0XHRpZiAocilcbjE3NDI6XHRcdFx0dmhvc3RfbmV0X2NsZWFyX3VidWZfaW5mbyhuKTtcbjE3NDM6XHRcdHZob3N0X25ldF9mbHVzaChuKTtcbjE3NDQ6XHRvdXQ6XG4xNzQ1Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTc0NjpcdFx0cmV0dXJuIHI7XG4xNzQ3Olx0fVxuMTc0ODpcdFxuMTc0OTpcdHN0YXRpYyBsb25nIHZob3N0X25ldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuMTc1MDpcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFyZylcbjE3NTE6XHR7XG4xNzUyOlx0XHRjb25zdCBERUZJTkVfVkhPU1RfRkVBVFVSRVNfQVJSQVkodmhvc3RfbmV0X2ZlYXR1cmVzLCB2aG9zdF9uZXRfYml0cyk7XG4xNzUzOlx0XHR1NjQgYWxsX2ZlYXR1cmVzW1ZJUlRJT19GRUFUVVJFU19VNjRTXTtcbjE3NTQ6XHRcdHN0cnVjdCB2aG9zdF9uZXQgKm4gPSBmLVx1MDAzZXByaXZhdGVfZGF0YTtcbjE3NTU6XHRcdHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnO1xuMTc1NjpcdFx0dTY0IF9fdXNlciAqZmVhdHVyZXAgPSBhcmdwO1xuMTc1NzpcdFx0c3RydWN0IHZob3N0X3ZyaW5nX2ZpbGUgYmFja2VuZDtcbjE3NTg6XHRcdHU2NCBmZWF0dXJlcywgY291bnQsIGNvcGllZDtcbjE3NTk6XHRcdGludCByLCBpO1xuMTc2MDpcdFxuMTc2MTpcdFx0c3dpdGNoIChpb2N0bCkge1xuMTc2MjpcdFx0Y2FzZSBWSE9TVF9ORVRfU0VUX0JBQ0tFTkQ6XG4xNzYzOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZiYWNrZW5kLCBhcmdwLCBzaXplb2YgYmFja2VuZCkpXG4xNzY0Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4xNzY1Olx0XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2JhY2tlbmQobiwgYmFja2VuZC5pbmRleCwgYmFja2VuZC5mZCk7XG4xNzY2Olx0XHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcbjE3Njc6XHRcdFx0ZmVhdHVyZXMgPSB2aG9zdF9uZXRfZmVhdHVyZXNbMF07XG4xNzY4Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoZmVhdHVyZXAsIFx1MDAyNmZlYXR1cmVzLCBzaXplb2YgZmVhdHVyZXMpKVxuMTc2OTpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuMTc3MDpcdFx0XHRyZXR1cm4gMDtcbjE3NzE6XHRcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxuMTc3MjpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2ZmVhdHVyZXMsIGZlYXR1cmVwLCBzaXplb2YgZmVhdHVyZXMpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcyNjQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA2MDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2aG9zdCBGZWF0dXJlIFNldHRpbmcgQ2hhbmdlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBkaWZmIGFuZCBpbW1lZGlhdGVseSByZWNvZ25pemUgYSBjb3JyZWN0aW9uIGluIHRoZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24uIEl0IHNlZW1zIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIHN0cmFuZ2UgYHJldHVybiAwO2AgYmVmb3JlIHRoZSBgb3V0X3VubG9jazpgIGxhYmVsLCB3aGljaCB3b3VsZCYjMzk7dmUgYnlwYXNzZWQgdGhlIGludGVuZGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgY2hhbmdlIGNsZWFybHkgZml4ZXMgdGhpcyBieSByZXBsYWNpbmcgYHJldHVybiAtRUZBVUxUO2Agd2l0aCBgcmV0dXJuIHJldDtgLCB3aGljaCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2Ugc2luY2UgaXQgcHJlc2VydmVzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgbGlrZWx5IGluZGljYXRpbmcgaWYgZmVhdHVyZSBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gVGhpcyBjaGFuZ2Uga2VlcHMgdGhlIHByb3BlciByZXR1cm4gcGF0aC4KCkZ1cnRoZXJtb3JlLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgcmVsYXRlZCB0byBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYC4gSSBzZWUgdGhhdCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIG5vdyBjYWxsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIHdoZW4gdGhpcyBmZWF0dXJlIGlzICpub3QqIHNldC4gVGhlIG5ldyBmdW5jdGlvbiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBhcmUgYmVpbmcgYWRkZWQgdG8gYGRyaXZlcnMvdmhvc3Qvdmhvc3QuY2AsIGltcGx5aW5nIEkvTyBUcmFuc2xhdGlvbiBMb29rYXNpZGUgQnVmZmVyIChJT1RMQikgaW52YWxpZGF0aW9uIGxvZ2ljLgoKR2l2ZW4gdGhlc2UgYWRkaXRpb25zIGFuZCBtb2RpZmljYXRpb25zLCBJJiMzOTtkIHNheSB0aGUgZm9jdXMgb2YgZnV6emluZyBlZmZvcnRzIHNob3VsZCBjZW50ZXIgb24gdGhlIG5ldyBmdW5jdGlvbnMgYWxvbmdzaWRlIHRoZSBleGlzdGluZyBpb2N0bCBoYW5kbGVycy4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBuZWVkIHRvIHRhcmdldCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCwgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AuIEFsdGhvdWdoIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCBteSB0ZXN0IHdpbGwgc3RpbGwgbmVlZCB0byBleGVyY2lzZSB0aGlzIGZ1bmN0aW9uLCBldmVuIGlmIGl0IGlzIGluZGlyZWN0bHkgdmlhIGl0cyBjYWxsIHNpdGVzLiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgbWFraW5nIGl0IGFjY2Vzc2libGUgYXMgd2VsbC4gU2luY2UgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCBhcmUgc3RhdGljLCBJIGNhbiBhY2Nlc3MgdGhlbSB0aHJvdWdoIHRoZWlyIGlvY3RsIGVudHJ5IHBvaW50cywgbmFtZWx5IGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgcmVzcGVjdGl2ZWx5LgoKTm93LCBJJiMzOTtsbCBleGFtaW5lIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGluIGBkcml2ZXJzL3Zob3N0L3Zzb2NrLmNgIHRvIHNlZSBob3cgaXQgYWxpZ25zIHdpdGggdGhlIGNoYW5nZXMgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGltcGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvdnNvY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDg1NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDg1NDpcdHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiA4NTU6XHR7XG4gODU2Olx0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbiA4NTc6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuIDg1ODpcdFx0aW50IGk7XG4gODU5Olx0XG4gODYwOlx0XHRpZiAoZmVhdHVyZXMgXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcbiA4NjE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDg2MjpcdFxuIDg2MzpcdFx0bXV0ZXhfbG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuIDg2NDpcdFx0aWYgKChmZWF0dXJlcyBcdTAwMjYgKDEgXHUwMDNjXHUwMDNjIFZIT1NUX0ZfTE9HX0FMTCkpIFx1MDAyNlx1MDAyNlxuIDg2NTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNnZzb2NrLVx1MDAzZWRldikpIHtcbiA4NjY6XHRcdFx0Z290byBlcnI7XG4gODY3Olx0XHR9XG4gODY4Olx0XG4gODY5Olx0XHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4gODcwOlx0XHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4gODcxOlx0XHRcdGlmIChyZXQpXG4gODcyOlx0XHRcdFx0Z290byBlcnI7XG4gODczOlx0XHR9IGVsc2Uge1xuIDg3NDpcdFx0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbiA4NzU6XHRcdH1cbiA4NzY6XHRcbiA4Nzc6XHRcdHZzb2NrLVx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcbiA4Nzg6XHRcbiA4Nzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUodnNvY2stXHUwMDNldnFzKTsgaSYjNDM7JiM0MzspIHtcbiA4ODA6XHRcdFx0dnEgPSBcdTAwMjZ2c29jay1cdTAwM2V2cXNbaV07XG4gODgxOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuIDg4MjpcdFx0XHR2cS1cdTAwM2VhY2tlZF9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuIDg4MzpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuIDg4NDpcdFx0fVxuIDg4NTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4gODg2Olx0XHRyZXR1cm4gMDtcbiA4ODc6XHRcbiA4ODg6XHRlcnI6XG4gODg5Olx0XHRtdXRleF91bmxvY2soXHUwMDI2dnNvY2stXHUwMDNlZGV2Lm11dGV4KTtcbiA4OTA6XHRcdHJldHVybiByZXQ7XG4gODkxOlx0fVxuIDg5MjpcdFxuIDg5MzpcdHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuIDg5NDpcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFyZylcbiA4OTU6XHR7XG4gODk2Olx0XHRzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrID0gZi1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gODk3Olx0XHR2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZztcbiA4OTg6XHRcdHU2NCBndWVzdF9jaWQ7XG4gODk5Olx0XHR1NjQgZmVhdHVyZXM7XG4gOTAwOlx0XHRpbnQgc3RhcnQ7XG4gOTAxOlx0XHRpbnQgcjtcbiA5MDI6XHRcbiA5MDM6XHRcdHN3aXRjaCAoaW9jdGwpIHtcbiA5MDQ6XHRcdGNhc2UgVkhPU1RfVlNPQ0tfU0VUX0dVRVNUX0NJRDpcbiA5MDU6XHRcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1ZXN0X2NpZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X2NpZCkpKVxuIDkwNjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkwNzpcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc2V0X2NpZCh2c29jaywgZ3Vlc3RfY2lkKTtcbiA5MDg6XHRcdGNhc2UgVkhPU1RfVlNPQ0tfU0VUX1JVTk5JTkc6XG4gOTA5Olx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZzdGFydCwgYXJncCwgc2l6ZW9mKHN0YXJ0KSkpXG4gOTEwOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gOTExOlx0XHRcdGlmIChzdGFydClcbiA5MTI6XHRcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc3RhcnQodnNvY2spO1xuIDkxMzpcdFx0XHRlbHNlXG4gOTE0Olx0XHRcdFx0cmV0dXJuIHZob3N0X3Zzb2NrX3N0b3AodnNvY2ssIHRydWUpO1xuIDkxNTpcdFx0Y2FzZSBWSE9TVF9HRVRfRkVBVFVSRVM6XG4gOTE2Olx0XHRcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfRkVBVFVSRVM7XG4gOTE3Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXHUwMDI2ZmVhdHVyZXMsIHNpemVvZihmZWF0dXJlcykpKVxuIDkxODpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkxOTpcdFx0XHRyZXR1cm4gMDtcbiA5MjA6XHRcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxuIDkyMTpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2ZmVhdHVyZXMsIGFyZ3AsIHNpemVvZihmZWF0dXJlcykpKVxuIDkyMjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkyMzpcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHZzb2NrLCBmZWF0dXJlcyk7XG4gOTI0Olx0XHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxuIDkyNTpcdFx0XHRmZWF0dXJlcyA9IFZIT1NUX1ZTT0NLX0JBQ0tFTkRfRkVBVFVSRVM7XG4gOTI2Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXHUwMDI2ZmVhdHVyZXMsIHNpemVvZihmZWF0dXJlcykpKVxuIDkyNzpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkyODpcdFx0XHRyZXR1cm4gMDtcbiA5Mjk6XHRcdGNhc2UgVkhPU1RfU0VUX0JBQ0tFTkRfRkVBVFVSRVM6XG4gOTMwOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZmZWF0dXJlcywgYXJncCwgc2l6ZW9mKGZlYXR1cmVzKSkpXG4gOTMxOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gOTMyOlx0XHRcdGlmIChmZWF0dXJlcyBcdTAwMjYgflZIT1NUX1ZTT0NLX0JBQ0tFTkRfRkVBVFVSRVMpXG4gOTMzOlx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDkzNDpcdFx0XHR2aG9zdF9zZXRfYmFja2VuZF9mZWF0dXJlcyhcdTAwMjZ2c29jay1cdTAwM2VkZXYsIGZlYXR1cmVzKTtcbiA5MzU6XHRcdFx0cmV0dXJuIDA7XG4gOTM2Olx0XHRkZWZhdWx0OlxuIDkzNzpcdFx0XHRtdXRleF9sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4gOTM4Olx0XHRcdHIgPSB2aG9zdF9kZXZfaW9jdGwoXHUwMDI2dnNvY2stXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XG4gOTM5Olx0XHRcdGlmIChyID09IC1FTk9JT0NUTENNRClcbiA5NDA6XHRcdFx0XHRyID0gdmhvc3RfdnJpbmdfaW9jdGwoXHUwMDI2dnNvY2stXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XG4gOTQxOlx0XHRcdGVsc2VcbiA5NDI6XHRcdFx0XHR2aG9zdF92c29ja19mbHVzaCh2c29jayk7XG4gOTQzOlx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuIDk0NDpcdFx0XHRyZXR1cm4gcjtcbiA5NDU6XHRcdH1cbiA5NDY6XHR9XG4gOTQ3Olx0XG4gOTQ4Olx0c3RhdGljIHNzaXplX3Qgdmhvc3RfdnNvY2tfY2hyX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pXG4gOTQ5Olx0e1xuIDk1MDpcdFx0c3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLVx1MDAzZWtpX2ZpbHA7XG4gOTUxOlx0XHRzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gOTUyOlx0XHRzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYgPSBcdTAwMjZ2c29jay1cdTAwM2VkZXY7XG4gOTUzOlx0XHRpbnQgbm9ibG9jayA9IGZpbGUtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19OT05CTE9DSztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDAxNwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgdG8gYmVzdCBmdXp6IHRoZSBgdmhvc3QtbmV0YCBhbmQgYHZob3N0LXZzb2NrYCBjb2RlLiBUaGUgZW50cnkgcG9pbnRzIHNlZW0gdG8gYmUgcmVhY2hhYmxlIHRocm91Z2ggYFZIT1NUX1NFVF9GRUFUVVJFU2AgaW9jdGxzIG9uIGAvZGV2L3Zob3N0LW5ldGAgYW5kIGAvZGV2L3Zob3N0LXZzb2NrYC4gSSBzaG91bGQgdGFyZ2V0IGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYW5kIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFzIG15IHByaW1hcnkgZnV6emluZyB0YXJnZXRzLgoKU3BlY2lmaWNhbGx5LCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICppb2N0bCBoYW5kbGVycyouIFRoYXQmIzM5O3MgZ3JlYXQ7IHRob3NlIGFyZSBpZGVhbCBlbnRyeSBwb2ludHMuICBJIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHNwZWNpZmljIHVuZGVybHlpbmcgZnVuY3Rpb25zIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGlzIGNvbnRleHQsIHdoaWNoIGFyZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBhbmQgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAuCgpUaGUgcHJvbXB0IHRlbGxzIG1lIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMsIGJ1dCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGFyZSBzdGF0aWMuIFNob3VsZCBJIHN0aWxsIGxpc3QgdGhlbT8gSG1tLCB0aGUgcHJvbXB0ICpkb2VzKiBzYXkgdG8gcHJlZmVyIG5vbi1zdGF0aWMgb25lcyBidXQgZG9lc24mIzM5O3QgZm9yYmlkIHN0YXRpYyBvbmVzLCBhbmQgaXQgZG9lcyBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGF0aWMgYW5kIGlubGluZWQuIFNpbmNlIHRoZXkgYXJlbiYjMzk7dCAqdGlueSogZnVuY3Rpb25zLCB0aGV5IG1pZ2h0IG5vdCBiZSBpbmxpbmVkLiBCdXQgdGhlbiBhZ2FpbiwgYHZob3N0X25ldF9pb2N0bGAgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgIGFyZSAqYWxzbyogc3RhdGljISBVZ2guIFNvIEkgc2hvdWxkIGxpc3QgdGhlbSBhbnl3YXk/CgpXYWl0LCBnb29kIG5ld3MhIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCB3aXRoIGBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpYC4gVGhhdCBtYWtlcyB0aGluZ3MgZWFzaWVyLgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGUgZW50cnkgcG9pbnRzLiBJIHNob3VsZCBjaGVjayBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgaW4gdGhlaXIgc291cmNlIGZpbGVzIHRvIHNlZSBob3cgdGhleSYjMzk7cmUgdXNlZC4gQWhhISBUaGV5IGFyZSBhc3NpZ25lZCB0byBgZmlsZV9vcGVyYXRpb25zLnVubG9ja2VkX2lvY3RsYC4gUGVyZmVjdCwgdGhhdCYjMzk7cyB3aGF0IEkgbmVlZGVkIHRvIHNlZS4gVGhleSBhcmUgaW5kZWVkIGVudHJ5IHBvaW50cy4KCkZpbmFsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgcmVxdWlyZWQga2VybmVsIGNvbmZpZ3VyYXRpb25zIGZvciBgdmhvc3RfbmV0YCBhbmQgYHZob3N0X3Zzb2NrYCB0byBtYWtlIHN1cmUgdGhlIGZ1enppbmcgc2V0dXAgaXMgY29ycmVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFZIT1NUX05FVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L0tjb25maWc9MzI9aWYgVkhPU1RfTUVOVVxuZHJpdmVycy92aG9zdC9LY29uZmlnLTMzLVxuZHJpdmVycy92aG9zdC9LY29uZmlnOjM0OmNvbmZpZyBWSE9TVF9ORVRcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zNS1cdHRyaXN0YXRlIFwmIzM0O0hvc3Qga2VybmVsIGFjY2VsZXJhdG9yIGZvciB2aXJ0aW8gbmV0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDk3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKktjb25maWcgRGl2ZSBmb3IgVkhPU1QgU3VwcG9ydCoqCgpPa2F5LCB0aW1lIHRvIGdldCB0aGlzIHNvcnRlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVmaW5lZC4gVGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQgaXMgd2l0aGluIHRoZSByZWxldmFudCBkcml2ZXIgY29uZmlndXJhdGlvbi4gR2l2ZW4gdGhhdCB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB2aXJ0dWFsIGhvc3QgbmV0d29yayBmdW5jdGlvbmFsaXR5LCB0aGUgYGRyaXZlcnMvdmhvc3RgIGRpcmVjdG9yeSBpcyB0aGUgb2J2aW91cyBzdGFydGluZyBwb2ludC4gSSYjMzk7bGwgbmVlZCB0byBvcGVuIGFuZCBleGFtaW5lIHRoZSBgS2NvbmZpZ2AgZmlsZSB3aXRoaW4gdGhhdCBkaXJlY3RvcnkgKGBkcml2ZXJzL3Zob3N0L0tjb25maWdgKSBhbmQgc2VlIGhvdyB0aG9zZSB0d28gc3BlY2lmaWMgb3B0aW9ucyBhcmUgZGVjbGFyZWQuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljLCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHZhbHVlcyB3aWxsIHJlc2lkZSwgd2hpY2ggaXMgZXNzZW50aWFsIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgVkhPU1RfSU9UTEJcbiAgIDM6XHRcdHRyaXN0YXRlXG4gICA0Olx0XHRoZWxwXG4gICA1Olx0XHQgIEdlbmVyaWMgSU9UTEIgaW1wbGVtZW50YXRpb24gZm9yIHZob3N0IGFuZCB2cmluZ2guXG4gICA2Olx0XHQgIFRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGFueSBkcml2ZXIgd2hpY2ggbmVlZHMgdG8gc3VwcG9ydFxuICAgNzpcdFx0ICBhbiBJT01NVSBpbiBzb2Z0d2FyZS5cbiAgIDg6XHRcbiAgIDk6XHRjb25maWcgVkhPU1RfUklOR1xuICAxMDpcdFx0dHJpc3RhdGVcbiAgMTE6XHRcdHNlbGVjdCBWSE9TVF9JT1RMQlxuICAxMjpcdFx0aGVscFxuICAxMzpcdFx0ICBUaGlzIG9wdGlvbiBpcyBzZWxlY3RlZCBieSBhbnkgZHJpdmVyIHdoaWNoIG5lZWRzIHRvIGFjY2Vzc1xuICAxNDpcdFx0ICB0aGUgaG9zdCBzaWRlIG9mIGEgdmlydGlvIHJpbmcuXG4gIDE1Olx0XG4gIDE2Olx0Y29uZmlnIFZIT1NUX1RBU0tcbiAgMTc6XHRcdGJvb2xcbiAgMTg6XHRcdGRlZmF1bHQgblxuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBWSE9TVFxuICAyMTpcdFx0dHJpc3RhdGVcbiAgMjI6XHRcdHNlbGVjdCBWSE9TVF9JT1RMQlxuICAyMzpcdFx0c2VsZWN0IFZIT1NUX1RBU0tcbiAgMjQ6XHRcdGhlbHBcbiAgMjU6XHRcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcbiAgMjY6XHRcdCAgdGhlIGNvcmUgb2Ygdmhvc3QuXG4gIDI3Olx0XG4gIDI4Olx0bWVudWNvbmZpZyBWSE9TVF9NRU5VXG4gIDI5Olx0XHRib29sIFwmIzM0O1ZIT1NUIGRyaXZlcnNcJiMzNDtcbiAgMzA6XHRcdGRlZmF1bHQgeVxuICAzMTpcdFxuICAzMjpcdGlmIFZIT1NUX01FTlVcbiAgMzM6XHRcbiAgMzQ6XHRjb25maWcgVkhPU1RfTkVUXG4gIDM1Olx0XHR0cmlzdGF0ZSBcJiMzNDtIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldFwmIzM0O1xuICAzNjpcdFx0ZGVwZW5kcyBvbiBORVQgXHUwMDI2XHUwMDI2IEVWRU5URkQgXHUwMDI2XHUwMDI2IChUVU4gfHwgIVRVTikgXHUwMDI2XHUwMDI2IChUQVAgfHwgIVRBUClcbiAgMzc6XHRcdHNlbGVjdCBWSE9TVFxuICAzODpcdFx0aGVscFxuICAzOTpcdFx0ICBUaGlzIGtlcm5lbCBtb2R1bGUgY2FuIGJlIGxvYWRlZCBpbiBob3N0IGtlcm5lbCB0byBhY2NlbGVyYXRlXG4gIDQwOlx0XHQgIGd1ZXN0IG5ldHdvcmtpbmcgd2l0aCB2aXJ0aW9fbmV0LiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCB2aXJ0aW9fbmV0XG4gIDQxOlx0XHQgIG1vZHVsZSBpdHNlbGYgd2hpY2ggbmVlZHMgdG8gYmUgbG9hZGVkIGluIGd1ZXN0IGtlcm5lbC5cbiAgNDI6XHRcbiAgNDM6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsXG4gIDQ0Olx0XHQgIGJlIGNhbGxlZCB2aG9zdF9uZXQuXG4gIDQ1Olx0XG4gIDQ2Olx0Y29uZmlnIFZIT1NUX1NDU0lcbiAgNDc6XHRcdHRyaXN0YXRlIFwmIzM0O1ZIT1NUX1NDU0kgVENNIGZhYnJpYyBkcml2ZXJcJiMzNDtcbiAgNDg6XHRcdGRlcGVuZHMgb24gVEFSR0VUX0NPUkUgXHUwMDI2XHUwMDI2IEVWRU5URkRcbiAgNDk6XHRcdHNlbGVjdCBWSE9TVFxuICA1MDpcdFx0c2VsZWN0IFNHX1BPT0xcbiAgNTE6XHRcdGRlZmF1bHQgblxuICA1MjpcdFx0aGVscFxuICA1MzpcdFx0U2F5IE0gaGVyZSB0byBlbmFibGUgdGhlIHZob3N0X3Njc2kgVENNIGZhYnJpYyBtb2R1bGVcbiAgNTQ6XHRcdGZvciB1c2Ugd2l0aCB2aXJ0aW8tc2NzaSBndWVzdHNcbiAgNTU6XHRcbiAgNTY6XHRjb25maWcgVkhPU1RfVlNPQ0tcbiAgNTc6XHRcdHRyaXN0YXRlIFwmIzM0O3Zob3N0IHZpcnRpby12c29jayBkcml2ZXJcJiMzNDtcbiAgNTg6XHRcdGRlcGVuZHMgb24gVlNPQ0tFVFMgXHUwMDI2XHUwMDI2IEVWRU5URkRcbiAgNTk6XHRcdHNlbGVjdCBWSE9TVFxuICA2MDpcdFx0c2VsZWN0IFZJUlRJT19WU09DS0VUU19DT01NT05cbiAgNjE6XHRcdGRlZmF1bHQgblxuICA2MjpcdFx0aGVscFxuICA2MzpcdFx0VGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gdGhlIGhvc3Qga2VybmVsIHRvIHByb3ZpZGUgQUZfVlNPQ0tcbiAgNjQ6XHRcdHNvY2tldHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBndWVzdHMuICBUaGUgZ3Vlc3RzIG11c3QgaGF2ZSB0aGVcbiAgNjU6XHRcdHZpcnRpb190cmFuc3BvcnQua28gZHJpdmVyIGxvYWRlZCB0byB1c2UgdGhlIHZpcnRpby12c29jayBkZXZpY2UuXG4gIDY2Olx0XG4gIDY3Olx0XHRUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkXG4gIDY4Olx0XHR2aG9zdF92c29jay5cbiAgNjk6XHRcbiAgNzA6XHRjb25maWcgVkhPU1RfVkRQQVxuICA3MTpcdFx0dHJpc3RhdGUgXCYjMzQ7Vmhvc3QgZHJpdmVyIGZvciB2RFBBLWJhc2VkIGJhY2tlbmRcJiMzNDtcbiAgNzI6XHRcdGRlcGVuZHMgb24gRVZFTlRGRFxuICA3MzpcdFx0c2VsZWN0IFZIT1NUXG4gIDc0Olx0XHRzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSXG4gIDc1Olx0XHRkZXBlbmRzIG9uIFZEUEFcbiAgNzY6XHRcdGhlbHBcbiAgNzc6XHRcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxuICA3ODpcdFx0ICBndWVzdCB2aXJ0aW8gZGV2aWNlcyB3aXRoIHRoZSB2RFBBLWJhc2VkIGJhY2tlbmRzLlxuICA3OTpcdFxuICA4MDpcdFx0ICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlXG4gIDgxOlx0XHQgIHdpbGwgYmUgY2FsbGVkIHZob3N0X3ZkcGEuXG4gIDgyOlx0XG4gIDgzOlx0Y29uZmlnIFZIT1NUX0NST1NTX0VORElBTl9MRUdBQ1lcbiAgODQ6XHRcdGJvb2wgXCYjMzQ7Q3Jvc3MtZW5kaWFuIHN1cHBvcnQgZm9yIHZob3N0XCYjMzQ7XG4gIDg1Olx0XHRkZWZhdWx0IG5cbiAgODY6XHRcdGhlbHBcbiAgODc6XHRcdCAgVGhpcyBvcHRpb24gYWxsb3dzIHZob3N0IHRvIHN1cHBvcnQgZ3Vlc3RzIHdpdGggYSBkaWZmZXJlbnQgYnl0ZVxuICA4ODpcdFx0ICBvcmRlcmluZyBmcm9tIGhvc3Qgd2hpbGUgdXNpbmcgbGVnYWN5IHZpcnRpby5cbiAgODk6XHRcbiAgOTA6XHRcdCAgVXNlcnNwYWNlIHByb2dyYW1zIGNhbiBjb250cm9sIHRoZSBmZWF0dXJlIHVzaW5nIHRoZVxuICA5MTpcdFx0ICBWSE9TVF9TRVRfVlJJTkdfRU5ESUFOIGFuZCBWSE9TVF9HRVRfVlJJTkdfRU5ESUFOIGlvY3Rscy5cbiAgOTI6XHRcbiAgOTM6XHRcdCAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBhIGZldyBwbGF0Zm9ybXMgKHBwYzY0IGFuZCBhcm02NCkuIFNpbmNlIGl0XG4gIDk0Olx0XHQgIGFkZHMgc29tZSBvdmVyaGVhZCwgaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgOTU6XHRcbiAgOTY6XHRcdCAgSWYgdW5zdXJlLCBzYXkgXCYjMzQ7TlwmIzM0Oy5cbiAgOTc6XHRcbiAgOTg6XHRjb25maWcgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxuICA5OTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFwmIzM0O1xuIDEwMDpcdFx0ZGVmYXVsdCB5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjAyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMzEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBWSE9TVCBNb2R1bGUgRGVwZW5kZW5jaWVzIGFuZCBBUEkgRGVzaWduKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSB2aG9zdCBtb2R1bGVzLiBJIG5lZWQgYm90aCBgVkhPU1RfTkVUYCBhbmQgYFZIT1NUX1ZTT0NLYCB0byBiZSBlbmFibGVkLiBJIHNlZSB0aGF0IGBWSE9TVF9ORVRgIHJlbGllcyBvbiBhIGZldyBvdGhlcnM6IGBORVRgLCBgRVZFTlRGRGAsIGFuZCBgVFVOYC9gVEFQYC4gVGhhdCBgKFRVTiB8fCAhVFVOKSAmYW1wOyZhbXA7IChUQVAgfHwgIVRBUClgIGNvbnN0cnVjdCBpcyBpbnRlcmVzdGluZywgaXQgaW1wbGllcyB0aGF0IGl0IGRvZXNuJiMzOTt0ICpzdHJpY3RseSogZGVwZW5kIG9uIGVpdGhlciwgYnV0IGlmIGVpdGhlciBgVFVOYCBvciBgVEFQYCBhcmUgY29tcGlsZWQgYXMgbW9kdWxlcywgdGhlbiBgVkhPU1RfTkVUYCBhbHNvICptdXN0KiBiZSBhIG1vZHVsZS4gR29vZCB0byBrZWVwIGluIG1pbmQuIFRoZW4gdGhlcmUmIzM5O3MgYFZIT1NUX1ZTT0NLYCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC4gU3RyYWlnaHRmb3J3YXJkIGVub3VnaCBzbyBmYXIuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhIGJpdCBkZWVwZXIgYXQgc29tZSBpbnRlcm5hbCBmdW5jdGlvbnMuIExldCYjMzk7cyBzZWUsIHdoYXQgYWJvdXQgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2A/IEFoLCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgdGhhdCYjMzk7cyBnb29kLiBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIGlzIHN0YXRpYy4gSG1tLCB3aGF0IGFib3V0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGB2aG9zdF9uZXRfaW9jdGxgLCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGA/IFRoZXkmIzM5O3JlIGFsbCBtYXJrZWQgc3RhdGljLgoKV2FpdCBhIHNlY29uZCwgdGhlIHByb21wdCBpcyByZW1pbmRpbmcgbWUgYWJvdXQgYSBwb3RlbnRpYWwgaXNzdWUgaGVyZS4gSXQgc2F5cyB0byBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMsIGJlY2F1c2UgdGhlIHN0YXRpYyBmdW5jdGlvbnMgYXJlIHByb25lIHRvIGJlaW5nIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCB0aGVyZWZvcmUgZG9uJiMzOTt0IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcy4gU28sIGV2ZW4gdGhvdWdoIGB2aG9zdF9uZXRfaW9jdGxgIGlzIHN0YXRpYywgaXQgKm1pZ2h0KiBub3QgYmUgaW5saW5lZCBpZiBpdCYjMzk7cyBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGBmaWxlX29wZXJhdGlvbnNgIHN0cnVjdHVyZS4gVGhhdCYjMzk7cyBhIGtleSBkaXN0aW5jdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgYGRyaXZlcnMvdmhvc3QvbmV0LmNgIGZpbGUgYW5kIHNlZSBob3cgYHZob3N0X25ldF9pb2N0bGAgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCB3aWxsIGNsYXJpZnkgd2hldGhlciBpdCYjMzk7cyB0cnVseSBhbiBBUEkgZW50cnlwb2ludC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmhvc3RfbmV0X2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jPTE3Mjg9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc0OC1cbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc0OTpzdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc1MC1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYz0xODc3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZob3N0X25ldF9mb3BzID0ge1xuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4Mi1cdC5wb2xsICAgICAgICAgICA9IHZob3N0X25ldF9jaHJfcG9sbCxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTg4MzpcdC51bmxvY2tlZF9pb2N0bCA9IHZob3N0X25ldF9pb2N0bCxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4NC1cdC5jb21wYXRfaW9jdGwgICA9IGNvbXBhdF9wdHJfaW9jdGwsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQ2CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgc2l0dWF0aW9uOgoKKipSZXZpZXdpbmcgdGhlIHZob3N0IElvY3RsIEltcGxlbWVudGF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCBhcmUgaGFuZGxlZCwgYW5kIHRoZSBrZXkgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGV5JiMzOTtyZSBib3RoIGFzc2lnbmVkIHRvIHRoZSBgdW5sb2NrZWRfaW9jdGxgIGZpZWxkIHdpdGhpbiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGV5JiMzOTtyZSBub3QgaW5saW5lZC4gVGhhdCYjMzk7cyBnb29kIHRvIGtub3c7IGl0IGNvbmZpcm1zIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGFyY2hpdGVjdHVyZS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8ga2VlcCB0aGlzIGZhY3QgaW4gbWluZCB3aGVuIEkgYW0gbG9va2luZyBmb3IgdGhlIG1haW4gY29udHJvbCBmbG93LCBhcyB0aGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBJIHdhbnQgdG8gZm9jdXMgb24gdG8gZnVydGhlciB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92c29jay5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvdnNvY2suYz04NTQ9c3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuLS1cbmRyaXZlcnMvdmhvc3QvdnNvY2suYy04OTItXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6ODkzOnN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuZHJpdmVycy92aG9zdC92c29jay5jLTg5NC1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZHJpdmVycy92aG9zdC92c29jay5jPTk3Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aG9zdF92c29ja19mb3BzID0ge1xuLS1cbmRyaXZlcnMvdmhvc3QvdnNvY2suYy05ODAtXHQubGxzZWVrXHRcdD0gbm9vcF9sbHNlZWssXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6OTgxOlx0LnVubG9ja2VkX2lvY3RsID0gdmhvc3RfdnNvY2tfZGV2X2lvY3RsLFxuZHJpdmVycy92aG9zdC92c29jay5jLTk4Mi1cdC5jb21wYXRfaW9jdGwgICA9IGNvbXBhdF9wdHJfaW9jdGwsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MTIzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogOTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUsIG15IGluaXRpYWwgYXNzZXNzbWVudCBzdWdnZXN0cyB0aGF0IGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYW5kIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhcmUgcHJvbWlzaW5nIGNhbmRpZGF0ZXMgZm9yIGluY2x1c2lvbiBpbiB0aGUgYEZvY3VzU3ltYm9sc2AgbGlzdC4KCk5vdywgbGV0JiMzOTtzIGJyb2FkZW4gdGhlIHNjb3BlLiBJJiMzOTtsbCBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlIGhhdmVuJiMzOTt0IG92ZXJsb29rZWQgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucy4gRGlnZ2luZyBpbnRvIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBJIHNlZSBhIGNvdXBsZSBvZiB0aGluZ3Mgb2YgaW50ZXJlc3QuIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCB3aGljaCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoZW4gYHZxX21ldGFfcHJlZmV0Y2hgIGlzIGFsc28gc2hvd2luZyBhcyBtb2RpZmllZCwgd2hpY2ggSSB3aWxsIG5lZWQgdG8gY29uc2lkZXIgYXMgd2VsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dnFfbWV0YV9wcmVmZXRjaCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L3Zob3N0LmM9MTg4Nz1zdGF0aWMgYm9vbCBpb3RsYl9hY2Nlc3Nfb2soc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsXG4tLVxuZHJpdmVycy92aG9zdC92aG9zdC5jLTE5MjAtXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkyMTppbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIyLXtcbi0tXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMTkzOC19XG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkzOTpFWFBPUlRfU1lNQk9MX0dQTCh2cV9tZXRhX3ByZWZldGNoKTtcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTQwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU4NgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZToKCioqTXkgSW1tZWRpYXRlIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgKmB2cV9tZXRhX3ByZWZldGNoYCogaXMgZmluYWxseSBleHBvcnRlZCEgVGhhdCYjMzk7cyBleGNlbGxlbnQgbmV3cy4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCB0aGF0IGRlZmluaXRlbHkgbWVhbnMgd2UgbmVlZCB0byBpbW1lZGlhdGVseSBhZGQgaXQgdG8gYEZvY3VzU3ltYm9sc2AuIFRoYXQmIzM5O3MgYSBuby1icmFpbmVyLiBUaGlzIG9wZW5zIHVwIHNvbWUgaW50ZXJlc3RpbmcgcG9zc2liaWxpdGllcyBmb3Igb3B0aW1pemF0aW9uOyBJIHNob3VsZCBwcm9iYWJseSBrZWVwIGEgcnVubmluZyBsaXN0IG9mIHBvdGVudGlhbCBhcmVhcyBvZiBpbXByb3ZlbWVudCwgbm93IHRoYXQgdGhpcyBzeW1ib2wgaXMgYXZhaWxhYmxlIHRvIHVzLgoKTmV4dCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgKmhvdyogaXQmIzM5O3MgYmVpbmcgdXNlZC4gTGV0JiMzOTtzIHNoaWZ0IGdlYXJzIGFuZCBleGFtaW5lIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIEkmIzM5O20gY3VyaW91cyB0byBzZWUgaG93IHRoZSBJL08gdHJhbnNsYXRpb24gbGF5ZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIG5ldyBwcmVmZXRjaCBjYXBhYmlsaXR5LiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBtZXRhZGF0YSBwcmVmZXRjaCBjb3VsZCBzdHJlYW1saW5lIG9yIHBvdGVudGlhbGx5IGJvdHRsZW5lY2sgdGhlIEkvTyBvcGVyYXRpb25zIGZyb20gdmlydHVhbCBtYWNoaW5lcywgYW5kIHdoZXRoZXIgdGhpcyBoZWxwcyB3aXRoIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzY2VuYXJpb3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zIGFuZCB3aGV0aGVyIHRoZSBleGlzdGluZyBJT1RMQiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyBhcmUgYXdhcmUgb2YgdGhpcywgd2hpY2ggd291bGQgYmUgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlIGNoYW5nZSBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIHJpZ2h0IHBsYWNlcyBmb3IgcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zob3N0X2luaXRfZGV2aWNlX2lvdGxiJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92aG9zdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYz0yMzE5PUVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2NsZWFyX2RldmljZV9pb3RsYik7XG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMjMyMC1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzIxOmludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuZHJpdmVycy92aG9zdC92aG9zdC5jLTIzMjIte1xuLS1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzQ4LX1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzQ5OkVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzUwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTA4NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDQwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBSZWFzb25pbmcgZm9yIEZvY3VzaW5nIG9uIFRoZXNlIHZob3N0IFN5bWJvbHMqKgoKT2theSwgc28gSSYjMzk7bSBhbmFseXppbmcgdGhlIHZob3N0IGNvZGUgYW5kIGRldGVybWluaW5nIHRoZSBtb3N0IHJlbGV2YW50IHN5bWJvbHMgZm9yIGZ1enppbmcgb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHNvIEkmIzM5O20gbWFraW5nIGEgbWVudGFsIG5vdGUgb2YgdGhhdC4gQmFzZWQgb24gdGhhdCwgaGVyZSYjMzk7cyB3aGF0IEkmIzM5O20gdGhpbmtpbmcgYXJlIG15IHByaW1hcnkgdGFyZ2V0czoKCiogICBgdmhvc3RfbmV0X2lvY3RsYAoqICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAKKiAgIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgCiogICBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgCiogICBgdnFfbWV0YV9wcmVmZXRjaGAKCk5vdywgdGhlIHBhdGNoJiMzOTtzIGNvcmUgcmV2b2x2ZXMgYXJvdW5kIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkgbmVlZCB0byBjaGVjayBpZiB0aGVzZSBhcmUgZXhwb3J0ZWQgc3ltYm9scywgb3IgaWYgdGhleSBhcmUgc3RhdGljLiBBaCwgdGhleSBhcmUgc3RhdGljLiBCdXQsIGV2ZW4gdGhvdWdoIHRoZSBndWlkYW5jZSBwcmVmZXJzIG5vbi1zdGF0aWMgZW50cnlwb2ludHMsIGlmIHRoZXkgYXJlIG5vdCBpbmxpbmVkLCBzeXprYWxsZXIgKmNhbiogcmVzb2x2ZSBzdGF0aWMgZnVuY3Rpb25zLiBTbywgd2hpbGUgSSYjMzk7bSBiZWluZyBtaW5kZnVsIG9mIHRoZSBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucywgdGhlIHF1ZXN0aW9uIGJlY29tZXMsIGlzIGl0IGJldHRlciB0byBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiBhbmQgaW5jbHVkZSB0aGVtPwoKV2FpdCBhIG1pbnV0ZSwgdGhlIHByb21wdCAqc3BlY2lmaWNhbGx5KiBzYXlzIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMhIE9rYXksIGxldCBtZSB0cmltIHRoZSBsaXN0IGJhc2VkIG9uIHRoYXQuCgoqICAgYHZob3N0X25ldF9pb2N0bGAKKiAgIGB2aG9zdF92c29ja19kZXZfaW9jdGxgCiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYAoqICAgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYAoqICAgYHZxX21ldGFfcHJlZmV0Y2hgCgpOb3csIGxldCYjMzk7cyBkb3VibGUgY2hlY2sgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gUmlnaHQsIHRoZXkgYXJlIGNhbGxlZCBmcm9tIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCByZXNwZWN0aXZlbHkuIFNpbmNlIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGlvY3RsIGVudHJ5cG9pbnRzLCBpbmNsdWRpbmcgdGhlIHNldFxfZmVhdHVyZXMgZnVuY3Rpb25zIG1ha2VzIHNlbnNlLiBJIGNhbiBhbHdheXMgcmVtb3ZlIHRoZW0gbGF0ZXIgaWYgdGhleSBhcmUgaW5saW5lZCwgYnV0IGl0IGRvZXNuJiMzOTt0IGh1cnQgdG8gaW5jbHVkZSB0aGVtIGZvciBub3cuCgpTbywgSSYjMzk7bGwgYWRkIHRoZW0gdG8gdGhlIGxpc3QsIHdpdGggdGhhdCBjYXZlYXQuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IHRoZSBrZXJuZWwgY29uZmlncyByZXF1aXJlZC4gSSBzZWUgdGhhdCB0aGVzZSBhcmUgdGhlIHJlbGV2YW50IGNvbmZpZ3M6IGBWSE9TVF9ORVRgLCBgVkhPU1RfVlNPQ0tgLCBgVkhPU1RgICh3aGljaCBpcyBzZWxlY3RlZCBieSB0aGUgYWJvdmUgdHdvKSwgYFZTT0NLRVRTYCAod2hpY2ggVkhPU1RfVlNPQ0sgZGVwZW5kcyBvbiksIGFuZCBgRVZFTlRGRGAgKHdoaWNoIGJvdGggZGVwZW5kIG9uKS4gSXQmIzM5O3Mgd29ydGggZGlnZ2luZyBhIGJpdCBpbnRvIHRoZSBgVlNPQ0tFVFNgIGNvbmZpZyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBWU09DS0VUUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC92bXdfdnNvY2svS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdm13X3Zzb2NrL0tjb25maWctNS1cbm5ldC92bXdfdnNvY2svS2NvbmZpZzo2OmNvbmZpZyBWU09DS0VUU1xubmV0L3Ztd192c29jay9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtWaXJ0dWFsIFNvY2tldCBwcm90b2NvbFwmIzM0O1xuLS1cbm5ldC92bXdfdnNvY2svS2NvbmZpZy0xOC1cbm5ldC92bXdfdnNvY2svS2NvbmZpZzoxOTpjb25maWcgVlNPQ0tFVFNfRElBR1xubmV0L3Ztd192c29jay9LY29uZmlnLTIwLVx0dHJpc3RhdGUgXCYjMzQ7VmlydHVhbCBTb2NrZXRzIG1vbml0b3JpbmcgaW50ZXJmYWNlXCYjMzQ7XG4tLVxubmV0L3Ztd192c29jay9LY29uZmlnLTI4LVxubmV0L3Ztd192c29jay9LY29uZmlnOjI5OmNvbmZpZyBWU09DS0VUU19MT09QQkFDS1xubmV0L3Ztd192c29jay9LY29uZmlnLTMwLVx0dHJpc3RhdGUgXCYjMzQ7VmlydHVhbCBTb2NrZXRzIGxvb3BiYWNrIHRyYW5zcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjI5NwoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkNoZWNraW5nIE15IEFzc3VtcHRpb25zKioKCkFscmlnaHQsIHNvIEkmIzM5O20gcHJldHR5IHN1cmUgYFZTT0NLRVRTYCBpcyB0aGUgcmlnaHQgZGlyZWN0aW9uIGhlcmUuIEhvd2V2ZXIsIGdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O3ZlIGxlYXJuZWQgdG8gYWx3YXlzIGRvdWJsZS1jaGVjayB0aGUgb2J2aW91cyBhc3N1bXB0aW9ucy4gSnVzdCBiZWNhdXNlIHNvbWV0aGluZyAqc2hvdWxkKiBiZSBkb2VzbiYjMzk7dCBtZWFuIGl0ICppcyouIFRpbWUgdG8gY29uZmlybSB0aGF0IGBFVkVOVEZEYCBpcyBhY3R1YWxseSBlbmFibGVkLiBJJiMzOTtkIHR5cGljYWxseSBleHBlY3QgaXQgdG8gYmUgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LCBlc3BlY2lhbGx5IHdoZW4gZGVidWdnaW5nLiBUaGlzIGNvbmZpcm1hdGlvbiBjb3VsZCBzYXZlIG1lIGZyb20gY2hhc2luZyBhIHJlZCBoZXJyaW5nIGxhdGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVZFTlRGRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTg3OD1jb25maWcgVElNRVJGRFxuLS1cbmluaXQvS2NvbmZpZy0xODg2LVxuaW5pdC9LY29uZmlnOjE4ODc6Y29uZmlnIEVWRU5URkRcbmluaXQvS2NvbmZpZy0xODg4LVx0Ym9vbCBcJiMzNDtFbmFibGUgZXZlbnRmZCgpIHN5c3RlbSBjYWxsXCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjU0MwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGgga2VybmVsIGNvbmZpZ3VyYXRpb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIERpZ3Jlc3Npb25zKioKCkFscmlnaHQsIHNvIGBFVkVOVEZEYCBpcyBkZWZpbml0ZWx5IGEgY29yZSBmZWF0dXJlIGFuZCBwYXJ0IG9mIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCB3aGljaCBpcyBleGFjdGx5IHdoZXJlIEkmIzM5O2QgZXhwZWN0IGl0IHRvIGJlLiBOb3csIGxldCYjMzk7cyBzZWUsIHdoYXQgd2FzIHRoYXQgb3RoZXIgY29uZmlnIHN5bWJvbC4uLiBBaCwgeWVzLCBgVklSVElPX1ZTT0NLRVRTX0NPTU1PTmAuIEkgcmVtZW1iZXIgdGhhdCYjMzk7cyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBgVkhPU1RfVlNPQ0tgIG1vZHVsZS4gSXQmIzM5O3Mgc2VsZWN0ZWQgd2hlbiBgVkhPU1RfVlNPQ0tgIGlzIGFjdGl2YXRlZCwgd2hpY2ggbWFrZXMgc2Vuc2UgYmVjYXVzZSBpdCBwcm92aWRlcyB0aGUgdW5kZXJseWluZywgY29tbW9uIHBpZWNlcyBuZWNlc3NhcnkgZm9yIHRoZSB2aG9zdC1iYXNlZCB2aXJ0aW8tdnNvY2sgaW1wbGVtZW50YXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBkZXBlbmRlbmN5IHdoZW4gSSYjMzk7bSB3b3JraW5nIHdpdGggdGhlIFZTT0NLIHN0YWNrLiBNYWtlcyBzZW5zZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdm13X3Zzb2NrL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Ztd192c29jay9LY29uZmlnPTUzPWNvbmZpZyBWSVJUSU9fVlNPQ0tFVFNcbi0tXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNjUtXG5uZXQvdm13X3Zzb2NrL0tjb25maWc6NjY6Y29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT05cbm5ldC92bXdfdnNvY2svS2NvbmZpZy02Ny1cdHRyaXN0YXRlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2ODk2CgkJCQkJCQlvdXRwdXQ6IDIyNgoJCQkJCQkJdGhvdWdodHM6IDUzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZob3N0IFN1YnN5c3RlbSBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBwYXRjaCBoZXJlIGFmZmVjdGluZyB0aGUgdmhvc3Qgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYHZob3N0LW5ldGAgYW5kIGB2aG9zdC12c29ja2AuIEkgc2VlIHRoYXQgc2luY2UgdGhlc2UgYXJlIHRoZSBzZWxlY3RlZCBjb21wb25lbnRzLCBJIGRvbiYjMzk7dCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGVpciBzZWxlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBwYXRjaCByZXF1aXJlcyB0aGF0IHRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZTT0NLRVRTYCwgYW5kIGBFVkVOVEZEYC4gSSBhbHNvIHNlZSB0aGF0IGBWSE9TVF9ORVRgIGltcGxpY2l0bHkgcmVsaWVzIG9uIGBORVRgLCB3aGljaCBpcyBzdGFuZGFyZCwgYW5kIHRoYXQgYFZIT1NUX1ZTT0NLYCBkZXBlbmRzIG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC4KCk5vdywgZGlnZ2luZyBpbnRvIHRoZSBjaGFuZ2VzLCBpdCBsb29rcyBsaWtlIHRoZXJlJiMzOTtzIGEgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIHdoZXJlIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIHdhcyBiZWluZyBjYWxsZWQgaW5hcHByb3ByaWF0ZWx5IHdoZW4gYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgd2FzbiYjMzk7dCBzZXQuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIHRvIGNvcnJlY3RseSBjbGVhciB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRlIHZpcnRxdWV1ZSBhY2Nlc3MuIFRoZXJlIGlzIGFsc28gYSByZXR1cm4gdmFsdWUgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBUaGVzZSBhcmUgZGVmaW5pdGVseSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0aW5nIHRoZSB2aG9zdCBzdWJzeXN0ZW0uIFRoZSBjb2RlIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gYC9kZXYvdmhvc3QtbmV0YCBhbmQgYC9kZXYvdmhvc3QtdnNvY2tgLCB3aGljaCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBmdXp6ZWQgdGhvcm91Z2hseS4KCkxvb2tpbmcgYXQgdGhlIGNvZGUgbG9jYXRpb25zIGZvciB0aGUga2V5IGZ1bmN0aW9ucywgSSBzZWUgdGhhdCBJJiMzOTtsbCBiZSBpbnRlcmVzdGVkIGluIGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAsIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAsIGB2cV9tZXRhX3ByZWZldGNoYCwgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgLCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCByZXNpZGVzIGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AgcmVzaWRlcyBpbiBgZHJpdmVycy92aG9zdC92c29jay5jYCwgc28gSSYjMzk7dmUgZ290IHRoZSBjb3JyZWN0IGxvY2F0aW9uLgoKVGhlIHBhdGNoIG1vZGlmaWVzIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBgZHJpdmVycy92aG9zdC9uZXQuY2AsIGFuZCBgZHJpdmVycy92aG9zdC92c29jay5jYC4gVGhlIGNoYW5nZXMgYXJlIHVuZG91YnRlZGx5IGZ1bmN0aW9uYWwgYW5kIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZS4gSSYjMzk7bSBzYXRpc2ZpZWQgdGhhdCB0aGlzIGlzIGEgd2VsbC1zY29wZWQgY2hhbmdlLgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtWSE9TVF9ORVQmIzM0OywKICAgICYjMzQ7VkhPU1RfVlNPQ0smIzM0OywKICAgICYjMzQ7VlNPQ0tFVFMmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Zob3N0X25ldF9pb2N0bCYjMzQ7LAogICAgJiMzNDt2aG9zdF92c29ja19kZXZfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiJiMzNDssCiAgICAmIzM0O3Zob3N0X2luaXRfZGV2aWNlX2lvdGxiJiMzNDssCiAgICAmIzM0O3ZxX21ldGFfcHJlZmV0Y2gmIzM0OywKICAgICYjMzQ7dmhvc3RfbmV0X3NldF9mZWF0dXJlcyYjMzQ7LAogICAgJiMzNDt2aG9zdF92c29ja19zZXRfZmVhdHVyZXMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VkhPU1RfTkVUJiMzNDssCiAgICAmIzM0O1ZIT1NUX1ZTT0NLJiMzNDssCiAgICAmIzM0O1ZTT0NLRVRTJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2aG9zdF9uZXRfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X2NsZWFyX2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2aG9zdF9pbml0X2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2cV9tZXRhX3ByZWZldGNoJiMzNDssCiAgICAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTE2NzMsNiAmIzQzOzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogewogCXNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47CiYjNDM7CWludCByZXQgPSAtRUZBVUxUOwogCWludCBpOwogCiAJaGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHwKQEAgLTE3MDEsOCAmIzQzOzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHsKLQkJaWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KSkKJiM0MzsJCXJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoJmFtcDtuLSZndDtkZXYpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBWSE9TVF9ORVRfVlFfTUFYOyAmIzQzOyYjNDM7aSkgewpAQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogCiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYW1wO24tJmd0O2Rldi5tdXRleCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwppbmRleCA0YzUyNWIzZTE2ZWFkLi45Zjc0NTM3YjFjMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jCkBAIC0zNDQsNiAmIzQzOzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiAJCXZxLSZndDttZXRhX2lvdGxiW2pdID0gTlVMTDsKIH0KIAomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi8KJiM0MztzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKJiM0Mzt7CiYjNDM7CXZxLSZndDtkZXNjID0gTlVMTDsKJiM0MzsJdnEtJmd0O2F2YWlsID0gTlVMTDsKJiM0MzsJdnEtJmd0O3VzZWQgPSBOVUxMOwomIzQzOwl2cS0mZ3Q7bG9nX3VzZWQgPSBmYWxzZTsKJiM0MzsJdnEtJmd0O2xvZ19hZGRyID0gLTF1bGw7CiYjNDM7CV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCWludCBpOwpAQCAtMTkxMSw2ICYjNDM7MTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCXVuc2lnbmVkIGludCBudW0gPSB2cS0mZ3Q7bnVtOwogCiYjNDM7CWlmICghdnEtJmd0O2Rlc2MgfHwgIXZxLSZndDthdmFpbCB8fCAhdnEtJmd0O3VzZWQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlpZiAoIXZxLSZndDtpb3RsYikKIAkJcmV0dXJuIDE7CiAKQEAgLTIyNzAsMTEgJiM0MzsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7CiAKJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovCiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpb3RsYiA9IGQtJmd0O2lvdGxiOwomIzQzOwlpZiAoIWlvdGxiKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0cwomIzQzOwkgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LgomIzQzOwkgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzCiYjNDM7CSAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nCiYjNDM7CSAqIGZvciBpdHMgVlEgbXV0ZXguCiYjNDM7CSAqLwomIzQzOwlkLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkLSZndDtudnFzOyAmIzQzOyYjNDM7aSkgewomIzQzOwkJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLSZndDt2cXNbaV07CiYjNDM7CiYjNDM7CQltdXRleF9sb2NrKCZhbXA7dnEtJmd0O211dGV4KTsKJiM0MzsJCXZxLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZob3N0X2NsZWFyX21zZyhkKTsKJiM0MzsJdmhvc3RfaW90bGJfZnJlZShpb3RsYik7CiYjNDM7CXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZhbXA7ZC0mZ3Q7d2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTsKJiM0MzsKIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCXN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiOwogCWludCBpOwogCiYjNDM7CWlmIChkLSZndDtpb3RsYikKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCW5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7CiAJaWYgKCFuaW90bGIpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogCiAJCW11dGV4X2xvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwogCQl2cS0mZ3Q7aW90bGIgPSBuaW90bGI7Ci0JCV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiAJCW11dGV4X3VubG9jaygmYW1wO3ZxLSZndDttdXRleCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKaW5kZXggMDE5MmFkZTZlNzQ5MS4uM2M3NWU4MDg5MzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaApAQCAtMjc3LDYgJiM0MzsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLAogCQkJICAgIGludCBub2Jsb2NrKTsKIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pOwomIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogCiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMKaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suYwpAQCAtODU0LDYgJiM0Mzs4NTQsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9jaWQoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGd1ZXN0X2NpZCkKIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKJiM0MzsJaW50IHJldCA9IC1FRkFVTFQ7CiAJaW50IGk7CiAKIAlpZiAoZmVhdHVyZXMgJmFtcDsgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKQpAQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKQogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAoKGZlYXR1cmVzICZhbXA7ICgxVUxMICZsdDsmbHQ7IFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpKSB7Ci0JCWlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpKQomIzQzOwlpZiAoZmVhdHVyZXMgJmFtcDsgKDFVTEwgJmx0OyZsdDsgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkgewomIzQzOwkJcmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoJmFtcDt2c29jay0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXZob3N0X2NsZWFyX2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpOwogCX0KIAogCXZzb2NrLSZndDtzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpOwpAQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpCiAKIGVycjoKIAltdXRleF91bmxvY2soJmFtcDt2c29jay0mZ3Q7ZGV2Lm11dGV4KTsKLQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDM4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFZob3N0IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHRvdWNoZXMgc2V2ZXJhbCBgdmhvc3RgIGZpbGVzOiBgbmV0LmNgLCBgdmhvc3QuY2AsIGB2aG9zdC5oYCwgYW5kIGB2c29jay5jYC4gVGhlIGNvcmUgb2YgdGhlIGNoYW5nZXMgc2VlbSB0byByZXZvbHZlIGFyb3VuZCBJT1RMQiBjbGVhcmluZyAoYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYigpYCkgYW5kIGludmFsaWRhdGluZyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIHdpdGhpbiBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3MoKWAuIFRoZSBmdW5jdGlvbiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAgbm93IGNvcnJlY3RseSByZXR1cm5zIDAgaWYgdGhlIElPVExCIGlzIGFscmVhZHkgc2V0LiBJdCYjMzk7cyBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWAgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3QgZW5hYmxlZC4gQW5kIGl0JiMzOTtzIGRvaW5nIHNvbWUgcG9pbnRlciBjbGVhcmluZyB3aXRoaW4gdGhlIHZpcnRxdWV1ZSBzdHJ1Y3RzIHRvIGF2b2lkIGFjY2Vzcy4KCk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgb2YgY291cnNlLiBXZSBoYXZlIGEgZmFpciBhbW91bnQgb2YgcG9pbnRlciBjbGVhcmluZyBoYXBwZW5pbmcsIHNwZWNpZmljYWxseSB3aXRoIHRoZSB2aXJ0cXVldWUmIzM5O3MgZGVzY3JpcHRvciAoYHZxLSZndDtkZXNjYCksIGF2YWlsYWJsZSByaW5nIChgdnEtJmd0O2F2YWlsYCksIHVzZWQgcmluZyAoYHZxLSZndDt1c2VkYCksIGFuZCBzb21lIGxvZ2dpbmctcmVsYXRlZCBmaWVsZHMuIFRoaXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gaW50cm9kdWNlIGlzc3VlcyBpZiB0aGUgY2xlYXJlZCBwb2ludGVycyBhcmUgdGhlbiByZWFkLiBUaGVuIGl0IG1vZGlmaWVzIGB2cV9tZXRhX3ByZWZldGNoKClgLCB3aGljaCByZXR1cm5zIDAgaWYgYW55IG9mIHRob3NlIGFyZW4mIzM5O3QgdmFsaWQuIEJ1dCwgdGhhdCYjMzk7cyBleHBlY3RlZC4KCkFsc28sIGl0IGxvb2tzIGxpa2UgYHZob3N0X25ldF9zZXRfZmVhdHVyZXMoKWAgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoKWAgd2VyZSByZXR1cm5pbmcgYC1FRkFVTFRgIHVuY29uZGl0aW9uYWxseS4gVGhhdCYjMzk7cyBhIGh1Z2UgcmVkIGZsYWchIFRoZSBwYXRjaCBhcHBlYXJzIHRvIGJlICpmaXhpbmcqIHRoYXQgYW5kIG5vdyByZXR1cm5zIGEgdmFyaWFibGUgYHJldGAgd2hpY2ggZGVmYXVsdHMgdG8gYC1FRkFVTFRgIGJ1dCB3aGljaCBjYW4gYmUgdXBkYXRlZCBieSBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAuIFdhaXQsIGRvZXMgdGhpcyBtZWFuIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHdlcmUgKmFsd2F5cyogcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gd2hlbiB0aGluZ3Mgd2VudCBjb3JyZWN0bHk/CgpMZXQgbWUgZG91YmxlLWNoZWNrIGBkcml2ZXJzL3Zob3N0L25ldC5jYC4gWWVzLCBpdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBgcmV0dXJuIC1FRkFVTFQ7YCB1bmNvbmRpdGlvbmFsbHkgYXQgdGhlIGVuZCBvZiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYC4gVGhhdCYjMzk7cyBhIG1ham9yIGJ1ZyEgSXQgbmVlZHMgdG8gYmUgcmV2aWV3ZWQgdG8gZW5zdXJlIHdlJiMzOTtyZSBub3QgbG9zaW5nIGltcG9ydGFudCBlcnJvciBpbmZvcm1hdGlvbi4gV2UgbmVlZCB0byBlbnN1cmUgdGhlIG9yaWdpbmFsIGNvZGUgY29ycmVjdGx5IGhhbmRsZWQgdGhlIHN1Y2Nlc3MgYW5kIGVycm9yIGNhc2VzLiBJdCBsb29rcyBsaWtlIGl0IHdhcyBwcm9iYWJseSBzdXBwb3NlZCB0byByZXR1cm4gMCBvbiBzdWNjZXNzLCBvciByZXR1cm4gYW55IGVycm9yIGNvZGUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgYnV0IGluc3RlYWQsIGl0IGFsd2F5cyByZXR1cm5lZCBhIGdlbmVyaWMgZXJyb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvbmV0LmM9MTY0Mz1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzItXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE2NzM6c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzQte1xuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmM9MTc0OT1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzctXHRcdHZpcnRpb19mZWF0dXJlc19mcm9tX3U2NChhbGxfZmVhdHVyZXMsIGZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc3ODpcdFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3OS1cdGNhc2UgVkhPU1RfR0VUX0ZFQVRVUkVTX0FSUkFZOlxuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgxOS1cbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTgyMDpcdFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgyMS1cdGNhc2UgVkhPU1RfR0VUX0JBQ0tFTkRfRkVBVFVSRVM6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0NTcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdW5kZXJzdGFuZGluZyB0aGlzIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbiB3aXRoaW4gYGRyaXZlcnMvdmhvc3QvbmV0LmNgLgoKKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKioKCkFscmlnaHQsIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZ3JvayB3aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBkb2VzLiBGcm9tIHRoZSBuYW1lIGFsb25lLCBJIGNhbiBpbmZlciBpdCBsaWtlbHkgZGVhbHMgd2l0aCBjb25maWd1cmluZyBvciBlbmFibGluZy9kaXNhYmxpbmcgY2VydGFpbiBmdW5jdGlvbmFsaXRpZXMsIG9yICYjMzQ7ZmVhdHVyZXMsJiMzNDsgc3BlY2lmaWMgdG8gdGhlIHZpcnR1YWwgaG9zdCBuZXR3b3JrIGludGVyZmFjZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0IHByb2JhYmx5IHNpdHMgaW4gdGhlIGNvbnRyb2wgcGF0aCwgY2FsbGVkIHdoZW4gdGhlIGd1ZXN0IG9wZXJhdGluZyBzeXN0ZW0gb3IgdGhlIGh5cGVydmlzb3Igd2FudHMgdG8gbW9kaWZ5IHRoZSBjYXBhYmlsaXRpZXMgdGhlIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UgcHJlc2VudHMuIFRoaXMgaXMgbGlrZWx5IGFuIGltcG9ydGFudCBwb2ludCBvZiBjb21tdW5pY2F0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIHNlZSBob3cgaXQgaGFuZGxlcyBmZWF0dXJlIG5lZ290aWF0aW9uIOKAkyBpZiBpdCBhbGxvd3MgdGhlIGd1ZXN0IHRvIHByb3Bvc2UgZmVhdHVyZXMsIG9yIGlmIHRoZSBoeXBlcnZpc29yIGRpY3RhdGVzIHRoZW0uIEkmIzM5O20ga2VlbiB0byBzZWUgaWYgdGhlcmUgaXMgZXJyb3IgaGFuZGxpbmcuIEkgaG9wZSB0byBmaW5kIHVzZWZ1bCBjb21tZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIG9yIGJsb2NrIG9mIGNvZGUuIFRoaXMgaXMgbGlrZWx5IGEgY3JpdGljYWwgc2VjdGlvbiBvZiBjb2RlIGFzIGl0IHdpbGwgdG91Y2ggbmV0d29ya2luZy4gSG9wZWZ1bGx5LCBpdHMgd2VsbCB3cml0dGVuLCBhbmQgc2FmZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY3MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjczOlx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4xNjc0Olx0e1xuMTY3NTpcdFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbjE2NzY6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuMTY3NzpcdFx0aW50IGk7XG4xNjc4Olx0XG4xNjc5Olx0XHRoZHJfbGVuID0gdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSB8fFxuMTY4MDpcdFx0XHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XG4xNjgxOlx0XHRcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcbjE2ODI6XHRcdFx0ICBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyKTtcbjE2ODM6XHRcbjE2ODQ6XHRcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXG4xNjg1Olx0XHRcdFx0XHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxuMTY4NjpcdFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcbjE2ODc6XHRcdFx0XHRcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcbjE2ODg6XHRcdFx0aGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfdjFfaGFzaF90dW5uZWwpO1xuMTY4OTpcdFxuMTY5MDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XG4xNjkxOlx0XHRcdC8qIHZob3N0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjkyOlx0XHRcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xuMTY5MzpcdFx0XHRzb2NrX2hsZW4gPSAwO1xuMTY5NDpcdFx0fSBlbHNlIHtcbjE2OTU6XHRcdFx0Lyogc29ja2V0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjk2Olx0XHRcdHZob3N0X2hsZW4gPSAwO1xuMTY5NzpcdFx0XHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xuMTY5ODpcdFx0fVxuMTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NjcwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogOTE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgdmhvc3QtbmV0IFBhdGNoOiBBIERlZXAgRGl2ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHZob3N0LW5ldGAsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhlIGNoYW5nZSBpbiB0aGUgZXJyb3IgcmV0dXJuIGF0IGBvdXRfdW5sb2NrOmAuICBJdCYjMzk7cyBzd2l0Y2hpbmcgZnJvbSBhIGhhcmRjb2RlZCBgLUVGQVVMVGAgdG8gYHJldGAsIGFuZCBgcmV0YCBpcyBpbml0aWFsaXplZCB0byBgLUVGQVVMVGAgYW5kIHVwZGF0ZWQgYnkgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgLiAgVGhpcyBzdWdnZXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgbm93IG1vcmUgbnVhbmNlZCwgcG9zc2libHkgcmVmbGVjdGluZyBmYWlsdXJlcyB3aXRoaW4gdGhlIElPVExCIGluaXRpYWxpemF0aW9uLiBUaGF0IGNoYW5nZSBhbG9uZSBpcyBpbnRlcmVzdGluZywgYnV0IGl0JiMzOTtzIHRoZSBhZGRpdGlvbiBvZiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTtgIHRoYXQmIzM5O3MgdGhlIGhlYXJ0IG9mIHRoaXMgcGF0Y2gsIGVzcGVjaWFsbHkgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3Qgc2V0LgoKV2hhdCB0aGlzIGlzIGRvaW5nIGlzIGNsZWFuaW5nIHVwIHRoZSBJT1RMQiBhbmQsIGNydWNpYWxseSwgaW52YWxpZGF0aW5nIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzOiBgdnEtJmd0O2Rlc2NgLCBgdnEtJmd0O2F2YWlsYCwgYW5kIGB2cS0mZ3Q7dXNlZGAuIFRoaXMgaXMgY2xlYXJseSBhIGZpeCBmb3IgYSBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZSwgYSB2dWxuZXJhYmlsaXR5IHRoYXQgd291bGQgYmUgcXVpdGUgbmFzdHkgaWYgZXhwbG9pdGVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQmIzM5O3MgaGFuZGxpbmcgYSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIHNpdHVhdGlvbi4KCkRpdmluZyBpbnRvIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGNvbmZpcm1zIHRoZSBtZW1vcnkgc2FmZXR5IGZvY3VzLiBJdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSB2aXJ0cXVldWVzLCBsb2NrcyB0aGVpciBtdXRleGVzLCBjbGVhcnMgdGhlIGBpb3RsYmAgcG9pbnRlciBpbiBlYWNoIHZpcnRxdWV1ZSAoYHZxLSZndDtpb3RsYiA9IE5VTEw7YCksIGludmFsaWRhdGVzIGFjY2VzcyBwb2ludGVycyB2aWEgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKWAsIHVubG9ja3MgdGhlIG11dGV4LCBhbmQgZmluYWxseSwgZnJlZXMgdGhlIGBpb3RsYmAgbWVtb3J5LiBUaGUga2V5IGhlcmUgaXMgdGhlIGludmFsaWRhdGlvbiBhbmQgdGhlIGZyZWVpbmcuIEl0JiMzOTtzIGRlc2lnbmVkIHRvIHByZXZlbnQgZGFuZ2xpbmcgcG9pbnRlcnMgZnJvbSBjYXVzaW5nIGlzc3VlcyBhZnRlciB0aGUgSU9UTEIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gU28gaWYgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgY2xlYXJlZCB0aGlzIGZyZWVzIElPVExCIGFuZCBpbnZhbGlkYXRlcyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzLgoKVGhpcyByZWFsbHkgaXMgYSBtZW1vcnkgY29ycnVwdGlvbiBidWcgZml4LCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSBzaXR1YXRpb24sIG9yIGFuIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSBvciBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBjYXRjaCB0aGVzZSBlcnJvcnMuIEkmIzM5O20gbm90IHNlZWluZyBhbnkgaW1tZWRpYXRlIHJlZCBmbGFncyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBkaXJlY3RseS4gVGhlIGZvY3VzIGlzIG9uICpjbGVhcmluZyogcG9pbnRlcnMgYW5kICpmcmVlaW5nKiBtZW1vcnksIG5vdCBvbiAqaW5pdGlhbGl6aW5nKiBhbmQgdGhlbiBsZWFraW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gS01TQU4sIHdoaWNoIGlzIHJlYWxseSBnb29kIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSwgaXNuJiMzOTt0IG5lZWRlZCBoZXJlLgoKTm93LCBiYWNrIHRvIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIEl0IGFsbG9jYXRlcyBhIG5ldyBgaW90bGJgIHVzaW5nIGBpb3RsYl9hbGxvYygpYC4gSXQgcmV0dXJucyB6ZXJvIGlmIHRoZSBkZXZpY2UgYWxyZWFkeSBoYWQgYW4gSU9UTEIgc2V0LiBTbywgdGhlIG9sZCBiZWhhdmlvdXIgd291bGQgaGF2ZSBqdXN0IGFsbG9jYXRlZCBhbmQgb3ZlcndyaXR0ZW4/IFRoaXMgcGF0Y2ggc2VlbXMgdG8gYmUgYWRkcmVzc2luZyB0aG9zZSBzY2VuYXJpb3Mgd2hlcmUgdGhlIElPVExCIHdhc24mIzM5O3QgcHJvcGVybHkgY2xlYXJlZCB3aGVuIGl0IHdhcyBubyBsb25nZXIgcmVxdWlyZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92aG9zdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjgwOlx0XG4yMjgxOlx0XHRpZiAocG9sbHN0b3AgXHUwMDI2XHUwMDI2IHZxLVx1MDAzZWhhbmRsZV9raWNrKVxuMjI4MjpcdFx0XHR2aG9zdF9kZXZfZmx1c2godnEtXHUwMDNlcG9sbC5kZXYpO1xuMjI4MzpcdFx0cmV0dXJuIHI7XG4yMjg0Olx0fVxuMjI4NTpcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X3ZyaW5nX2lvY3RsKTtcbjIyODY6XHRcbjIyODc6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXG4yMjg4Olx0dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbjIyODk6XHR7XG4yMjkwOlx0XHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiO1xuMjI5MTpcdFx0aW50IGk7XG4yMjkyOlx0XG4yMjkzOlx0XHRpb3RsYiA9IGQtXHUwMDNlaW90bGI7XG4yMjk0Olx0XHRpZiAoIWlvdGxiKVxuMjI5NTpcdFx0XHRyZXR1cm47XG4yMjk2Olx0XG4yMjk3Olx0XHQvKlxuMjI5ODpcdFx0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcbjIyOTk6XHRcdCAqIHBlci1WUSB2aWV3IGFuZCBpdHMgY2FjaGVkIHJpbmcgYWNjZXNzIHVuZGVyIGl0cyBvd24gbXV0ZXguXG4yMzAwOlx0XHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4yMzAxOlx0XHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xuMjMwMjpcdFx0ICogZm9yIGl0cyBWUSBtdXRleC5cbjIzMDM6XHRcdCAqL1xuMjMwNDpcdFx0ZC1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4yMzA1Olx0XG4yMzA2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4yMzA3Olx0XHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4yMzA4Olx0XG4yMzA5Olx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjMxMDpcdFx0XHR2cS1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4yMzExOlx0XHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbjIzMTI6XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbjIzMTM6XHRcdH1cbjIzMTQ6XHRcbjIzMTU6XHRcdHZob3N0X2NsZWFyX21zZyhkKTtcbjIzMTY6XHRcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xuMjMxNzpcdFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoXHUwMDI2ZC1cdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xuMjMxODpcdH1cbjIzMTk6XHRFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xuMjMyMDpcdFxuMjMyMTpcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuMjMyMjpcdHtcbjIzMjM6XHRcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuMjMyNDpcdFx0aW50IGk7XG4yMzI1Olx0XG4yMzI2Olx0XHRpZiAoZC1cdTAwM2Vpb3RsYilcbjIzMjc6XHRcdFx0cmV0dXJuIDA7XG4yMzI4Olx0XG4yMzI5Olx0XHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTYzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqQW5hbHl6aW5nIHRoZSBQb3N0LVBhdGNoIFN0YXRlKioKCk9rYXksIHdhaXQgYSBtaW51dGUuLi4gSSYjMzk7bSBsb29raW5nIGF0IHRoZSBmaWxlICphZnRlciogdGhlIHBhdGNoIGhhcyBiZWVuIGFwcGxpZWQuIFRoYXQmIzM5O3MgY3J1Y2lhbCBjb250ZXh0LiBJIG5lZWQgdG8ga2VlcCB0aGF0IGZpcm1seSBpbiBtaW5kIGFzIEkgaW50ZXJwcmV0IHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgcHJlLXBhdGNoIHN0YXRlIGlzbiYjMzk7dCByZWxldmFudCBoZXJlOyBJJiMzOTttIGRlYWxpbmcgd2l0aCB0aGUgcmVzdWx0cy4KCkFscmlnaHQsIGxldCYjMzk7cyByZWZvY3VzLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAgZnVuY3Rpb24uIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvcmUgaW5pdGlhbGl6YXRpb24gbG9naWMgbGllcywgYW5kIGl0JiMzOTtzIGxpa2VseSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNoYW5nZXMgYW5kIHRoZWlyIGltcGFjdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggaXQsIGdpdmVuIHRoZSB1cGRhdGVkIGZpbGUmIzM5O3MgY3VycmVudCBzdGF0ZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBJL08gdHJhbnNsYXRpb24gaXMgYmVpbmcgaGFuZGxlZC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgaGFwcGVucywgc28gbGV0JiMzOTtzIGdldCB0byB0aGUgYm90dG9tIG9mIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzMjEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjMyMTpcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuMjMyMjpcdHtcbjIzMjM6XHRcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuMjMyNDpcdFx0aW50IGk7XG4yMzI1Olx0XG4yMzI2Olx0XHRpZiAoZC1cdTAwM2Vpb3RsYilcbjIzMjc6XHRcdFx0cmV0dXJuIDA7XG4yMzI4Olx0XG4yMzI5Olx0XHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuMjMzMDpcdFx0aWYgKCFuaW90bGIpXG4yMzMxOlx0XHRcdHJldHVybiAtRU5PTUVNO1xuMjMzMjpcdFxuMjMzMzpcdFx0b2lvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbjIzMzQ6XHRcdGQtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4yMzM1Olx0XG4yMzM2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4yMzM3Olx0XHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4yMzM4Olx0XG4yMzM5Olx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjM0MDpcdFx0XHR2cS1cdTAwM2Vpb3RsYiA9IG5pb3RsYjtcbjIzNDE6XHRcdFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xuMjM0MjpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjM0MzpcdFx0fVxuMjM0NDpcdFxuMjM0NTpcdFx0dmhvc3RfaW90bGJfZnJlZShvaW90bGIpO1xuMjM0NjpcdFxuMjM0NzpcdFx0cmV0dXJuIDA7XG4yMzQ4Olx0fVxuMjM0OTpcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcbjIzNTA6XHRcbjIzNTE6XHQvKiBDYWxsZXIgbXVzdCBoYXZlIGRldmljZSBtdXRleCAqL1xuMjM1MjpcdGxvbmcgdmhvc3RfZGV2X2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ3ApXG4yMzUzOlx0e1xuMjM1NDpcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4yMzU1Olx0XHR1NjQgcDtcbjIzNTY6XHRcdGxvbmcgcjtcbjIzNTc6XHRcdGludCBpLCBmZDtcbjIzNTg6XHRcbjIzNTk6XHRcdC8qIElmIHlvdSBhcmUgbm90IHRoZSBvd25lciwgeW91IGNhbiBiZWNvbWUgb25lICovXG4yMzYwOlx0XHRpZiAoaW9jdGwgPT0gVkhPU1RfU0VUX09XTkVSKSB7XG4yMzYxOlx0XHRcdHIgPSB2aG9zdF9kZXZfc2V0X293bmVyKGQpO1xuMjM2MjpcdFx0XHRnb3RvIGRvbmU7XG4yMzYzOlx0XHR9XG4yMzY0Olx0XG4yMzY1Olx0I2lmZGVmIENPTkZJR19WSE9TVF9FTkFCTEVfRk9SS19PV05FUl9DT05UUk9MXG4yMzY2Olx0XHRpZiAoaW9jdGwgPT0gVkhPU1RfU0VUX0ZPUktfRlJPTV9PV05FUikge1xuMjM2NzpcdFx0XHQvKiBPbmx5IGFsbG93IG1vZGlmaWNhdGlvbiBiZWZvcmUgb3duZXIgaXMgc2V0ICovXG4yMzY4Olx0XHRcdGlmICh2aG9zdF9kZXZfaGFzX293bmVyKGQpKSB7XG4yMzY5Olx0XHRcdFx0ciA9IC1FQlVTWTtcbjIzNzA6XHRcdFx0XHRnb3RvIGRvbmU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk5NjIKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMTk3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSU9UTEIgTGlmZWN5Y2xlIGFuZCBWaXJ0cXVldWUgQWNjZXNzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBmdW5jdGlvbiB3YXMgZmxhd2VkLiBJdCB3YXNuJiMzOTt0IGNoZWNraW5nIGlmIGFuIElPVExCIGFscmVhZHkgZXhpc3RlZCwgbGVhZGluZyB0byBhIHBvdGVudGlhbCBmb3IgY2xlYXJpbmcgdGhlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgdHJhbnNsYXRpb25zLCBhbmQgcG90ZW50aWFsbHkgbGVhdmluZyB0aGUgc3lzdGVtIGluIGEgY29uZnVzZWQgc3RhdGUgaWYgdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgd2FzIHRvZ2dsZWQuIFRoaXMgcGF0Y2ggYWRkcmVzc2VzIHRoYXQgYnkgaW5pdGlhbGl6aW5nIHRoZSBJT1RMQiBvbmx5IHdoZW4gdGhlIGZlYXR1cmUgaXMgKnNldCogYW5kIGNsZWFyaW5nIGl0IHdoZW4gdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLiAgVGhpcyBzZWVtcyB0byBmaXggYSBzY2VuYXJpbyB3aGVyZSB0aGUgSU9UTEIgY291bGQgYmUgdW5leHBlY3RlZGx5IGNsZWFyZWQsIHBlcmhhcHMgcmVzdWx0aW5nIGluIG1lbW9yeSBjb3JydXB0aW9uIG9yIHVzZS1hZnRlci1mcmVlLCBvciBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MuIEhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgYSBsaWZlY3ljbGUgbWFuYWdlbWVudCBpc3N1ZSwgcmF0aGVyIHRoYW4gYSBkaXJlY3QgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtBU0FOIGlzIHBlcmZlY3RseSBzdWl0YWJsZSBmb3IgY2F0Y2hpbmcgYW55IHJlc3VsdGluZyBhY2Nlc3MgZXJyb3JzIGR1ZSB0byBzdGFsZSBwb2ludGVycy4gV2UgZG9uJiMzOTt0IG5lZWQgS01TQU4gaGVyZS4KCk5vdywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHBhdGNoJiMzOTtzIGNoYW5nZXMsIHN0YXJ0aW5nIHdpdGggYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYC4gIE9rYXksIHRoYXQgZnVuY3Rpb24gc2ltcGx5IG51bGxzIG91dCBwb2ludGVycyAoYHZxLSZndDtkZXNjYCwgYHZxLSZndDthdmFpbGAsIGB2cS0mZ3Q7dXNlZGApIGFuZCByZXNldHMgc3RhdGUsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSYjMzk7ZCBleHBlY3QgaW4gdGhpcyBzY2VuYXJpby4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLgoKTmV4dCB1cCwgYHZxX21ldGFfcHJlZmV0Y2hgLiBBaCwgZ29vZC4gVGhlIGFkZGVkIGNoZWNrIG5vdyBwcmV2ZW50cyBwcmVmZXRjaGluZyBpZiBhbnkgb2YgdGhvc2Ugdml0YWwgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBUaGlzIGlzIGEgY3J1Y2lhbCBkZWZlbnNlIGFnYWluc3QgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIHdoaWNoIGFyZSBlYXN5IHRvIGNhdGNoIHdpdGggc3RhbmRhcmQgdGVzdGluZyB0aGF0IEtBU0FOIHNob3VsZCBlYXNpbHkgZGV0ZWN0LgoKRmluYWxseSwgdGhlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbi4gVGhpcyBvbmUgaXMgbW9yZSBzdWJ0bGUuICBJIHNlZSBhIGJ1ZyBpbiB0aGUgY29kZSB0aGF0IHRoZSBwYXRjaCBmaXhlcy4gIEluaXRpYWxseSwgaXQgaW5pdGlhbGl6ZXMgdGhlIGByZXRgIHZhcmlhYmxlIHRvIGAtRUZBVUxUYC4gVGhlIGxvZ2ljIGlzIHN1Y2ggdGhhdCBpZiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpcyBzZXQsIGFuZCB0aGUgSU9UTEIgaW5pdGlhbGl6YXRpb24gZmFpbHMsIGl0IGdvZXMgdG8gYG91dF91bmxvY2tgIGFuZCByZXR1cm5zIHRoZSBlcnJvciBjb2RlLCB3aGljaCBpcyBjb3JyZWN0LiBJZiB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZHMsIGByZXRgIGlzIG5vdCB1cGRhdGVkLCBidXQgc2hvdWxkIGJlIHplcm8uIElmIHRoZSBmZWF0dXJlIGlzICpjbGVhcmVkKiwgaXQmIzM5O3Mgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIElPVExCLCB3aGljaCBtYXkgaGF2ZSBzdWNjZWVkZWQsIGJ1dCB0aGUgYHJldGAgcmVtYWlucyBgLUVGQVVMVGAuIFRoZSBwYXRjaCBub3cgY29ycmVjdGx5IHNldHMgYHJldGAgdG8gemVybyBhZnRlciBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLiAgVGhpcyBsb29rcyBsaWtlIGEgc2ltcGxlIGJ1dCBjcml0aWNhbCBlcnJvciBpbiB0aGUgb3JpZ2luYWwgY29kZSYjMzk7cyBlcnJvciBoYW5kbGluZyBhbmQgcmV0dXJuIHZhbHVlIGxvZ2ljLCBlbnN1cmluZyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG1lYW5pbmdmdWwgZXJyb3IgY29kZSBiYXNlZCBvbiB0aGUgSU9UTEIgb3BlcmF0aW9uJiMzOTtzIHN1Y2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2OTksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuMTcyMzpcdG91dF91bmxvY2s6XG4xNzI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTcyNTpcdFx0cmV0dXJuIHJldDtcbjE3MjY6XHR9XG4xNzI3Olx0XG4xNzI4Olx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjI1NAoJCQkJCQkJb3V0cHV0OiAyMzYKCQkJCQkJCXRob3VnaHRzOiA2MzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2aG9zdCBuZXQvdnNvY2sgRmVhdHVyZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGF0IGRpZmYgc3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBhYm91dCBhIG1vcmUgcHJlY2lzZSBlcnJvciBjb2RlIHJldHVybiBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJIHNlZSwgaXQgcmVwbGFjZXMgdGhlIGhhcmRjb2RlZCBgLUVGQVVMVGAgd2l0aCBgcmV0YCwgd2hpY2ggcmVmbGVjdHMgdGhlIGFjdHVhbCBlcnJvciBmcm9tIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIE11Y2ggYmV0dGVyIQoKVGhlIHBhdGNoIGl0c2VsZiBpcyBtdWx0aWZhY2V0ZWQuIEl0JiMzOTtzIG5vdCBqdXN0IGEgc2luZ2xlIGZpeDsgaXQgdG91Y2hlcyBvbiBhIGZldyBrZXkgYXJlYXMgd2l0aGluIHRoZSB2aG9zdCBpbmZyYXN0cnVjdHVyZS4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgY2xlYXJpbmcgdGhlIGRldmljZSBJT1RMQiBhbmQgaW52YWxpZGF0aW5nIFZRIGFjY2VzcyB3aGVuIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGlzIGRpc2FibGVkLiBDbGV2ZXIuIEFuZCB0aGVyZSYjMzk7cyBhbHNvIGEgY2hlY2sgdG8gcHJldmVudCBwcmVmZXRjaGluZyB3aGVuIHRob3NlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIE5VTEwuIEdvb2QgZGVmZW5zaXZlIHByb2dyYW1taW5nLiBGaW5hbGx5LCBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIG5vdyBhIG5vLW9wIGlmIGl0JiMzOTtzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHdoaWNoIHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBvcHRpbWl6YXRpb24uCgpTbywgdGhlIGNydXggb2YgaXQgaXMgYWRkcmVzc2luZyBwb3RlbnRpYWwgaXNzdWVzIHJlbGF0ZWQgdG8gcG9pbnRlciBsaWZlY3ljbGUsIG1lbW9yeSBsZWFrcywgYW5kIHByZXZlbnRpbmcgaW52YWxpZCBtZW1vcnkgYWNjZXNzZXMuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhvc2UgcG9pbnRlciYjMzk7cyBsaWZlY3ljbGU6IGB2cS0mZ3Q7ZGVzY2AsIGB2cS0mZ3Q7YXZhaWxgLCBhbmQgYHZxLSZndDt1c2VkYC4gSXQmIzM5O3MgYWxsIGFib3V0IGVuc3VyaW5nIHRoYXQgdGhvc2UgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgcHJvcGVybHkgbWFuYWdlZCwgcGFydGljdWxhcmx5IHdoZW4gdGhhdCBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGdldHMgdG9nZ2xlZC4gVGhlIElPVExCIG5lZWRzIHRvIGJlIGZyZWVkLCBhbmQgdGhlIHBvaW50ZXJzIGhhdmUgdG8gYmUgbnVsbGlmaWVkLiBNYWtlcyBzZW5zZSB0byBhdm9pZCBkYW5nbGluZyBwb2ludGVycyBhbmQgdGhlIGhlYWRhY2hlcyB0aGV5IGJyaW5nLgoKTXkgYXNzZXNzbWVudD8gVGhlcmUgYXJlIG5vIG5ldyBhbGxvY2F0aW9ucyBvciBjb3BpZXMgb2Ygc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBhcmUgdGhlcmUgYW55IHBvdGVudGlhbCBsZWFrcyBvZiB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFRoZSBjaGFuZ2VzIGhlcmUgYXJlIGFib3V0IGhhbmRsaW5nIHBvaW50ZXIgc3RhdGUgY29ycmVjdGx5IGFuZCBndWFyZGluZyBhZ2FpbnN0IG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMuIFN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nIGFuZCBLQVNBTiDigJMgdGhlIGtlcm5lbCBhZGRyZXNzIHNhbml0aXplciDigJMgc2hvdWxkIGJlIHBlcmZlY3RseSBhZGVxdWF0ZSB0byBjYXRjaCBhbnkgYnVncyBpbiB0aGlzIHNwYWNlLCBlc3BlY2lhbGx5IHRob3NlIHJlbGF0ZWQgdG8gdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMuIEEgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGxpa2VseSB1bm5lY2Vzc2FyeS4gVGhhdCBsZXZlbCBvZiBkZWRpY2F0ZWQgZnV6emluZyBpcyBub3QgcmVxdWlyZWQgaGVyZS4gS0FTQU4gaXMgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoZXNlIHBhcnRpY3VsYXIgaXNzdWVzLiBXZSYjMzk7cmUgZ29vZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMjo0MC41MDEyMDI2MzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjkyMjEzOTg4MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVkhPU1RfTkVUXCIsXG4gICAgXCJWSE9TVF9WU09DS1wiLFxuICAgIFwiVlNPQ0tFVFNcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2aG9zdF9uZXRfaW9jdGxcIixcbiAgICBcInZob3N0X3Zzb2NrX2Rldl9pb2N0bFwiLFxuICAgIFwidmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiXCIsXG4gICAgXCJ2aG9zdF9pbml0X2RldmljZV9pb3RsYlwiLFxuICAgIFwidnFfbWV0YV9wcmVmZXRjaFwiLFxuICAgIFwidmhvc3RfbmV0X3NldF9mZWF0dXJlc1wiLFxuICAgIFwidmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgdmhvc3QgZGV2aWNlIElPVExCIGFuZCB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIChgdnEtXFx1MDAzZWRlc2NgLCBgdnEtXFx1MDAzZWF2YWlsYCwgYHZxLVxcdTAwM2V1c2VkYCkuIEl0IGVuc3VyZXMgdGhhdCB3aGVuIHRoZSBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGlzIGNsZWFyZWQsIHRoZSBJT1RMQiBpcyBwcm9wZXJseSBmcmVlZCBhbmQgdGhlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIGludmFsaWRhdGVkIChzZXQgdG8gTlVMTCkuIEl0IGFsc28gYWRkcyBhIGNoZWNrIGluIGB2cV9tZXRhX3ByZWZldGNoYCB0byBwcmV2ZW50IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgaWYgdGhlIGFjY2VzcyBwb2ludGVycyBhcmUgbm90IHNldC4gVGhlc2UgY2hhbmdlcyBmaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0aWVzLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGNhdXNlZCBieSBzdGFsZSBwb2ludGVycy4gVGhlcmUgYXJlIG5vIG5ldyBzdHJ1Y3R1cmVzIGJlaW5nIGFsbG9jYXRlZCBhbmQgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbiwgbm9yIGlzIHRoZXJlIGFueSBsb2dpYyB0aGF0IGV4cG9zZXMgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBTdGFuZGFyZCBLQVNBTiAod2hpY2ggZGV0ZWN0cyB1c2UtYWZ0ZXItZnJlZSBhbmQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcykgYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nICh3aGljaCBjYXRjaGVzIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMpIGFyZSBmdWxseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGUgYnVncyB0aGlzIHBhdGNoIGFpbXMgdG8gZml4LiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDAuNTAxMjA3Nzg1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDEwNzgxOTgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOTJhMmFhOGY0ZTM3NjE0YmEzMTE3MmVmYzIzYzM5ZDcyY2M5ZjgwNlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xcbmluZGV4IDc3YjU5ZjQ5YmRkYjMuLjY0NjcxY2Y3N2EzNWUgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy92aG9zdC9uZXQuY1xcbisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcXG5AQCAtMTY3Myw2ICsxNjczLDcgQEAgc3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbiB7XFxuIFxcdHNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47XFxuK1xcdGludCByZXQgPSAtRUZBVUxUO1xcbiBcXHRpbnQgaTtcXG4gXFxuIFxcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XFxuQEAgLTE3MDEsOCArMTcwMiwxMSBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiBcXG4gXFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbi1cXHRcXHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldikpXFxuK1xcdFxcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbitcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4gXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICsraSkge1xcbkBAIC0xNzE4LDcgKzE3MjIsNyBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcXG4gXFxuIG91dF91bmxvY2s6XFxuIFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4tXFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5jIGIvZHJpdmVycy92aG9zdC92aG9zdC5jXFxuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcXG5AQCAtMzQ0LDYgKzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXFxuIFxcdFxcdHZxLVxcdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcXG4gfVxcbiBcXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgdmlydHF1ZXVlIG11dGV4LiAqL1xcbitzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcXG4re1xcbitcXHR2cS1cXHUwMDNlZGVzYyA9IE5VTEw7XFxuK1xcdHZxLVxcdTAwM2VhdmFpbCA9IE5VTEw7XFxuK1xcdHZxLVxcdTAwM2V1c2VkID0gTlVMTDtcXG4rXFx0dnEtXFx1MDAzZWxvZ191c2VkID0gZmFsc2U7XFxuK1xcdHZxLVxcdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xcbitcXHRfX3Zob3N0X3ZxX21ldGFfcmVzZXQodnEpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCB2aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIHtcXG4gXFx0aW50IGk7XFxuQEAgLTE5MTEsNiArMTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGludCBudW0gPSB2cS1cXHUwMDNlbnVtO1xcbiBcXG4rXFx0aWYgKCF2cS1cXHUwMDNlZGVzYyB8fCAhdnEtXFx1MDAzZWF2YWlsIHx8ICF2cS1cXHUwMDNldXNlZClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbiBcXHRpZiAoIXZxLVxcdTAwM2Vpb3RsYilcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcbkBAIC0yMjcwLDExICsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnXFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xcbiBcXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgZGV2aWNlIG11dGV4LiAqL1xcbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbit7XFxuK1xcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aW90bGIgPSBkLVxcdTAwM2Vpb3RsYjtcXG4rXFx0aWYgKCFpb3RsYilcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcXG4rXFx0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cXG4rXFx0ICogS2VlcCB0aGUgb2xkIHRhYmxlIGFsaXZlIHVudGlsIGV2ZXJ5IFZRIGhhcyBjb21wbGV0ZWQgdGhpc1xcbitcXHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xcbitcXHQgKiBmb3IgaXRzIFZRIG11dGV4LlxcbitcXHQgKi9cXG4rXFx0ZC1cXHUwMDNlaW90bGIgPSBOVUxMO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGQtXFx1MDAzZW52cXM7ICsraSkge1xcbitcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXFx1MDAzZXZxc1tpXTtcXG4rXFxuK1xcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuK1xcdFxcdHZxLVxcdTAwM2Vpb3RsYiA9IE5VTEw7XFxuK1xcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbitcXHR9XFxuK1xcbitcXHR2aG9zdF9jbGVhcl9tc2coZCk7XFxuK1xcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xcbitcXHR3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbChcXHUwMDI2ZC1cXHUwMDNld2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xcbitcXG4gaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIHtcXG4gXFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XFxuIFxcdGludCBpO1xcbiBcXG4rXFx0aWYgKGQtXFx1MDAzZWlvdGxiKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuIFxcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XFxuIFxcdGlmICghbmlvdGxiKVxcbiBcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG5AQCAtMjI4Nyw3ICsyMzM4LDcgQEAgaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIFxcbiBcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbiBcXHRcXHR2cS1cXHUwMDNlaW90bGIgPSBuaW90bGI7XFxuLVxcdFxcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XFxuK1xcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4gXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxcbkBAIC0yNzcsNiArMjc3LDcgQEAgc3NpemVfdCB2aG9zdF9jaHJfcmVhZF9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IGlvdl9pdGVyICp0byxcXG4gXFx0XFx0XFx0ICAgIGludCBub2Jsb2NrKTtcXG4gc3NpemVfdCB2aG9zdF9jaHJfd3JpdGVfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsXFxuIFxcdFxcdFxcdCAgICAgc3RydWN0IGlvdl9pdGVyICpmcm9tKTtcXG4rdm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCk7XFxuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcXG4gXFxuIHZvaWQgdmhvc3RfaW90bGJfbWFwX2ZyZWUoc3RydWN0IHZob3N0X2lvdGxiICppb3RsYixcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXFxuaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcXG5AQCAtODU0LDYgKzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxcbiBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIHtcXG4gXFx0c3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnE7XFxuK1xcdGludCByZXQgPSAtRUZBVUxUO1xcbiBcXHRpbnQgaTtcXG4gXFxuIFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcXG5AQCAtODY1LDkgKzg2NiwxMiBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIFxcdFxcdGdvdG8gZXJyO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoKGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpIHtcXG4tXFx0XFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2KSlcXG4rXFx0aWYgKGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbitcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2dnNvY2stXFx1MDAzZWRldik7XFxuK1xcdFxcdGlmIChyZXQpXFxuIFxcdFxcdFxcdGdvdG8gZXJyO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYpO1xcbiBcXHR9XFxuIFxcbiBcXHR2c29jay1cXHUwMDNlc2VxcGFja2V0X2FsbG93ID0gZmVhdHVyZXMgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpO1xcbkBAIC04ODMsNyArODg3LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxcbiBcXG4gZXJyOlxcbiBcXHRtdXRleF91bmxvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbi1cXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEyOjQxLjkxMjc4Nzg0N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjc3NTU0ODkzNDk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlZIT1NUX05FVFwiLFxuICAgIFwiVkhPU1RfVlNPQ0tcIixcbiAgICBcIlZTT0NLRVRTXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidmhvc3RfbmV0X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgICBcInZob3N0X2NsZWFyX2RldmljZV9pb3RsYlwiLFxuICAgIFwidmhvc3RfaW5pdF9kZXZpY2VfaW90bGJcIixcbiAgICBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgICBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgICBcInZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDkyYTJhYThmNGUzNzYxNGJhMzExNzJlZmMyM2MzOWQ3MmNjOWY4MDZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jXG5pbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC9uZXQuY1xuKysrIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuQEAgLTE2NzMsNiArMTY3Myw3IEBAIHN0YXRpYyBsb25nIHZob3N0X25ldF9yZXNldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIHtcbiBcdHNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47XG4rXHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcbkBAIC0xNzAxLDggKzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcbiBcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcbi1cdFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KSlcbitcdFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2bi1cdTAwM2VkZXYpO1xuK1x0XHRpZiAocmV0KVxuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH0gZWxzZSB7XG4rXHRcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4gXHR9XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBWSE9TVF9ORVRfVlFfTUFYOyArK2kpIHtcbkBAIC0xNzE4LDcgKzE3MjIsNyBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcbiBcbiBvdXRfdW5sb2NrOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbi1cdHJldHVybiAtRUZBVUxUO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5jXG5AQCAtMzQ0LDYgKzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4gXHRcdHZxLVx1MDAzZW1ldGFfaW90bGJbal0gPSBOVUxMO1xuIH1cbiBcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSB2aXJ0cXVldWUgbXV0ZXguICovXG4rc3RhdGljIHZvaWQgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4re1xuK1x0dnEtXHUwMDNlZGVzYyA9IE5VTEw7XG4rXHR2cS1cdTAwM2VhdmFpbCA9IE5VTEw7XG4rXHR2cS1cdTAwM2V1c2VkID0gTlVMTDtcbitcdHZxLVx1MDAzZWxvZ191c2VkID0gZmFsc2U7XG4rXHR2cS1cdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xuK1x0X192aG9zdF92cV9tZXRhX3Jlc2V0KHZxKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdGludCBpO1xuQEAgLTE5MTEsNiArMTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIHtcbiBcdHVuc2lnbmVkIGludCBudW0gPSB2cS1cdTAwM2VudW07XG4gXG4rXHRpZiAoIXZxLVx1MDAzZWRlc2MgfHwgIXZxLVx1MDAzZWF2YWlsIHx8ICF2cS1cdTAwM2V1c2VkKVxuK1x0XHRyZXR1cm4gMDtcbitcbiBcdGlmICghdnEtXHUwMDNlaW90bGIpXG4gXHRcdHJldHVybiAxO1xuIFxuQEAgLTIyNzAsMTEgKzIyODQsNDggQEAgbG9uZyB2aG9zdF92cmluZ19pb2N0bChzdHJ1Y3Qgdmhvc3RfZGV2ICpkLCB1bnNpZ25lZCBpbnQgaW9jdGwsIHZvaWQgX191c2VyICphcmdcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xuIFxuKy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIGRldmljZSBtdXRleC4gKi9cbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuK3tcbitcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XG4rXHRpbnQgaTtcbitcbitcdGlvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbitcdGlmICghaW90bGIpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0c1xuK1x0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cbitcdCAqIEtlZXAgdGhlIG9sZCB0YWJsZSBhbGl2ZSB1bnRpbCBldmVyeSBWUSBoYXMgY29tcGxldGVkIHRoaXNcbitcdCAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nXG4rXHQgKiBmb3IgaXRzIFZRIG11dGV4LlxuK1x0ICovXG4rXHRkLVx1MDAzZWlvdGxiID0gTlVMTDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGQtXHUwMDNlbnZxczsgKytpKSB7XG4rXHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4rXG4rXHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuK1x0XHR2cS1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4rXHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbitcdH1cbitcbitcdHZob3N0X2NsZWFyX21zZyhkKTtcbitcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xuK1x0d2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoXHUwMDI2ZC1cdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xuK1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuIFx0aW50IGk7XG4gXG4rXHRpZiAoZC1cdTAwM2Vpb3RsYilcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuIFx0aWYgKCFuaW90bGIpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuQEAgLTIyODcsNyArMjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIFxuIFx0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdFx0dnEtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4tXHRcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4rXHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbiBcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbmluZGV4IDAxOTJhZGU2ZTc0OTEuLjNjNzVlODA4OTM3MzAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxuQEAgLTI3Nyw2ICsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLFxuIFx0XHRcdCAgICBpbnQgbm9ibG9jayk7XG4gc3NpemVfdCB2aG9zdF9jaHJfd3JpdGVfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pO1xuK3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpO1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBcbiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5pbmRleCA5YWFhYjZiYjgwNjFjLi43N2E1YTY3NzVjODZmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcbkBAIC04NTQsNiArODU0LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfY2lkKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBndWVzdF9jaWQpXG4gc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIHtcbiBcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxO1xuK1x0aW50IHJldCA9IC1FRkFVTFQ7XG4gXHRpbnQgaTtcbiBcbiBcdGlmIChmZWF0dXJlcyBcdTAwMjYgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKVxuQEAgLTg2NSw5ICs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFx0XHRnb3RvIGVycjtcbiBcdH1cbiBcbi1cdGlmICgoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSkge1xuLVx0XHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KSlcbitcdGlmIChmZWF0dXJlcyBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcbitcdFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbitcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIGVycjtcbitcdH0gZWxzZSB7XG4rXHRcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZ2c29jay1cdTAwM2VkZXYpO1xuIFx0fVxuIFxuIFx0dnNvY2stXHUwMDNlc2VxcGFja2V0X2FsbG93ID0gZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpO1xuQEAgLTg4Myw3ICs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXG4gXG4gZXJyOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDEuOTEyNzg5MTM3WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjIwNzg3OTM1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIFRob3VnaHRzIG9uIFRoaXMgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIGhlcmUsIGFuZCBpdCdzIHRvdWNoaW5nIHNldmVyYWwgZmlsZXMgd2l0aGluIHRoZSBgZHJpdmVycy92aG9zdGAgZGlyZWN0b3J5OiBgbmV0LmNgLCBgdmhvc3QuY2AsIGB2aG9zdC5oYCwgYW5kIGB2c29jay5jYC4gVGhlIGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0J3MgZGVhbGluZyB3aXRoIHNvbWUgaW50ZXJhY3Rpb24gb2YgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAuIEl0IGxvb2tzIGxpa2UgdGhlcmUncyBhbiBpc3N1ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGV2ZW4gd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBlbmFibGVkLCB3aGljaCBpcyBhIGJpdCBjb25jZXJuaW5nLCBiZWNhdXNlIGl0IGltcGxpZXMgc29tZXRoaW5nIG1pZ2h0IGJlIGdldHRpbmcgY2xlYXJlZCB0aGF0IHNob3VsZG4ndCBiZS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgdG8gYWRkcmVzcyB0aGlzLlxuXG5Ib3dldmVyLCBhIG1vcmUgZ2xhcmluZyBpc3N1ZSBzdGFuZHMgb3V0LiBUaGUgcGF0Y2ggbWVudGlvbnMgYSByZXR1cm4gdmFsdWUgYnVnIGluIGJvdGggYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gSXQgY2xhaW1zIHRoZXkgd2VyZSBhbHdheXMgcmV0dXJuaW5nIGAtRUZBVUxUYCBvbiBzdWNjZXNzLi4uIFRoYXQncyBhIGh1Z2UgcmVkIGZsYWcuIGAtRUZBVUxUYCBpbmRpY2F0ZXMgYSBwcm9ncmFtbWluZyBlcnJvciwgbm90IGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24sIHNvIHRoaXMgd291bGQgaGF2ZSBlZmZlY3RpdmVseSBicm9rZW4gdGhlIGZ1bmN0aW9uYWxpdHkuIEhvdyBkaWQgKnRoYXQqIGV2ZXIgd29yaz9cblxuSSdtIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgZGlmZiBmb3IgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIHRvIGNvbmZpcm0uIEhlcmUgaXQgaXMuLi4gSXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBkaWQgaW5kZWVkIGhhdmUgYHJldHVybiAtRUZBVUxUO2AgYXQgdGhlIGVuZCEgVGhhdOKAmXMgaW5jcmVkaWJseSBzdHJhbmdlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgdGhpcyB3YXNuJ3QgY2F1Z2h0IGVhcmxpZXIsIGFuZCB3aGF0IGltcGFjdCB0aGlzIGJ1ZyBoYWQgaW4gcHJhY3RpY2UuIFRoaXMgY291bGQgYmUgYSBzaWduaWZpY2FudCBvdmVyc2lnaHQuIExldCBtZSBzZWUgaG93IHRoZSBmdW5jdGlvbiB3b3JrZWQsIGluIHRoZSBmaXJzdCBwbGFjZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDQxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDguMTIwNjcxNzQ2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk1NzE0MjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jPTE2NDM9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzItXFxuZHJpdmVycy92aG9zdC9uZXQuYzoxNjczOnN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTY3NC17XFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jPTE3NDk9c3RhdGljIGxvbmcgdmhvc3RfbmV0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzctXFx0XFx0dmlydGlvX2ZlYXR1cmVzX2Zyb21fdTY0KGFsbF9mZWF0dXJlcywgZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc3ODpcXHRcXHRyZXR1cm4gdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhuLCBhbGxfZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3OS1cXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFU19BUlJBWTpcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgxOS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4MjA6XFx0XFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MjEtXFx0Y2FzZSBWSE9TVF9HRVRfQkFDS0VORF9GRUFUVVJFUzpcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDguMjE2Mzg5MDk1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDg1NTg4NzYyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbiwgYXMgYSBzZWFzb25lZCBuZXR3b3JrIHZpcnR1YWxpemF0aW9uIGV4cGVydDpcblxuKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKipcblxuT2theSwgbGV0J3MgcHVsbCB1cCBgZHJpdmVycy92aG9zdC9uZXQuY2AgYW5kIHNwZWNpZmljYWxseSwgdGhhdCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24uIEltbWVkaWF0ZWx5LCBteSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gVGhpcyBmdW5jdGlvbiAqaGFzKiB0byBiZSB0aGUgY3JpdGljYWwgcG9pbnQgd2hlcmUgd2UgbmVnb3RpYXRlIGFuZCBhcHBseSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB2aXJ0aW8gbmV0IGRldmljZSB3aXRoaW4gYSB2aG9zdCBlbnZpcm9ubWVudCwgcmlnaHQ/IEknbSBhbnRpY2lwYXRpbmcgd2UnbGwgYmUgZGVhbGluZyB3aXRoIHRoZSB1c3VhbCBzdXNwZWN0czogZmVhdHVyZSBuZWdvdGlhdGlvbiwgZHJpdmVyLXNwZWNpZmljIGNhcGFiaWxpdGllcywgbWF5YmUgc29tZSBmZWF0dXJlIG1hc2tpbmcsIGFuZCBkZWZpbml0ZWx5IHNvbWUgY3J1Y2lhbCBjaGVja3MgdG8gZW5zdXJlIHRoZSBob3N0IGFuZCBndWVzdCBhbGlnbiBvbiB3aGF0J3Mgc3VwcG9ydGVkLlxuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzLCBwcm9iYWJseSB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIGFuZCBpdHMgcmVsYXRlZCBmaWVsZHMuIFdlJ3JlIGdvaW5nIHRvIHNlZSBob3cgdGhlIG5lZ290aWF0ZWQgZmVhdHVyZXMgYXJlIHN0b3JlZCwgYW5kIGhvdyB0aGF0IGFmZmVjdHMgcGFja2V0IHByb2Nlc3NpbmcgZG93bnN0cmVhbS4gRG9lcyBpdCB1c2UgYSBiaXRtYXAgdG8gcmVwcmVzZW50IGVuYWJsZWQgZmVhdHVyZXM/IEhvdyBhcmUgY29uZmxpY3RpbmcgZmVhdHVyZXMgaGFuZGxlZD8gSSdtIGhvcGluZyB0byBzZWUgZWxlZ2FudCBhbmQgZWZmaWNpZW50IGJpdHdpc2Ugb3BlcmF0aW9ucyBoZXJlLCBnaXZlbiB0aGUgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZpdHkgb2YgbmV0d29yayB2aXJ0dWFsaXphdGlvbi5cblxuSSdtIGFsc28gY3VyaW91cyBhYm91dCBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIHRoZSBndWVzdCBhdHRlbXB0cyB0byBlbmFibGUgYSBmZWF0dXJlIHRoZSBob3N0IGRvZXNuJ3Qgc3VwcG9ydD8gSXMgdGhlcmUgYSBncmFjZWZ1bCBmYWxsYmFjayBtZWNoYW5pc20sIG9yIGRvZXMgaXQgdHJpZ2dlciBhbiBlcnJvcj8gVGhlIGVycm9yIHBhdGhzIGFyZSBqdXN0IGFzIGltcG9ydGFudCBhcyB0aGUgaGFwcHkgcGF0aC4gSSdtIGxvb2tpbmcgZm9yIHJvYnVzdCBlcnJvciBjaGVja2luZywgcGFydGljdWxhcmx5IGFyb3VuZCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgbWlnaHQgYXJpc2UgZHVyaW5nIGZlYXR1cmUgbmVnb3RpYXRpb24uXG5cbkZpbmFsbHksIEknbGwgYmUgcmVhbGx5IGludGVyZXN0ZWQgaW4gaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YXBhdGguIEknbSBpbWFnaW5pbmcgaXQgd2lsbCB1cGRhdGUgcmVsZXZhbnQgcGFyYW1ldGVycyBvbiB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIG9yIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ6IGhvdyBkb2VzIGZlYXR1cmUgbmVnb3RpYXRpb24gYWN0dWFsbHkgYWZmZWN0IHBhY2tldCBmb3J3YXJkaW5nLCBjaGVja3N1bSBvZmZsb2FkLCBvciBhbnkgb3RoZXIgYWNjZWxlcmF0ZWQgZnVuY3Rpb25hbGl0eT8gSSBleHBlY3QgdG8gc2VlIGNhbGxiYWNrcyB0byBvdGhlciBmdW5jdGlvbnMgb3Igc3Vic3lzdGVtcyB0byBhY3R1YWxseSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZmVhdHVyZXMuIE9rYXksIHRpbWUgdG8gc2VlIGlmIG15IGludHVpdGlvbnMgYXJlIG9uIHRoZSBtb25leS4gTGV0J3MgZGlnIGluLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MDk0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NTMuMDcyMjc5MTU5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE3MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTY3MyxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2NzM6XFx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXFxuMTY3NDpcXHR7XFxuMTY3NTpcXHRcXHRzaXplX3Qgdmhvc3RfaGxlbiwgc29ja19obGVuLCBoZHJfbGVuO1xcbjE2NzY6XFx0XFx0aW50IHJldCA9IC1FRkFVTFQ7XFxuMTY3NzpcXHRcXHRpbnQgaTtcXG4xNjc4OlxcdFxcbjE2Nzk6XFx0XFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcXG4xNjgwOlxcdFxcdFxcdCAgdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9WRVJTSU9OXzEpID9cXG4xNjgxOlxcdFxcdFxcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcXG4xNjgyOlxcdFxcdFxcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7XFxuMTY4MzpcXHRcXG4xNjg0OlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXFxuMTY4NTpcXHRcXHRcXHRcXHRcXHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxcbjE2ODY6XFx0XFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcXG4xNjg3OlxcdFxcdFxcdFxcdFxcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcXG4xNjg4OlxcdFxcdFxcdGhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyX3YxX2hhc2hfdHVubmVsKTtcXG4xNjg5OlxcdFxcbjE2OTA6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XFxuMTY5MTpcXHRcXHRcXHQvKiB2aG9zdCBwcm92aWRlcyB2bmV0X2hkciAqL1xcbjE2OTI6XFx0XFx0XFx0dmhvc3RfaGxlbiA9IGhkcl9sZW47XFxuMTY5MzpcXHRcXHRcXHRzb2NrX2hsZW4gPSAwO1xcbjE2OTQ6XFx0XFx0fSBlbHNlIHtcXG4xNjk1OlxcdFxcdFxcdC8qIHNvY2tldCBwcm92aWRlcyB2bmV0X2hkciAqL1xcbjE2OTY6XFx0XFx0XFx0dmhvc3RfaGxlbiA9IDA7XFxuMTY5NzpcXHRcXHRcXHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xcbjE2OTg6XFx0XFx0fVxcbjE2OTk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4xNzAwOlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZIT1NUX0ZfTE9HX0FMTCkgXFx1MDAyNlxcdTAwMjZcXG4xNzAxOlxcdFxcdCAgICAhdmhvc3RfbG9nX2FjY2Vzc19vayhcXHUwMDI2bi1cXHUwMDNlZGV2KSlcXG4xNzAyOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xNzAzOlxcdFxcbjE3MDQ6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbjE3MDU6XFx0XFx0XFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldik7XFxuMTcwNjpcXHRcXHRcXHRpZiAocmV0KVxcbjE3MDc6XFx0XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjE3MDg6XFx0XFx0fSBlbHNlIHtcXG4xNzA5OlxcdFxcdFxcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4xNzEwOlxcdFxcdH1cXG4xNzExOlxcdFxcbjE3MTI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICsraSkge1xcbjE3MTM6XFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bi1cXHUwMDNldnFzW2ldLnZxLm11dGV4KTtcXG4xNzE0OlxcdFxcdFxcdHZpcnRpb19mZWF0dXJlc19jb3B5KG4tXFx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcXG4xNzE1OlxcdFxcdFxcdFxcdFxcdCAgICAgZmVhdHVyZXMpO1xcbjE3MTY6XFx0XFx0XFx0bi1cXHUwMDNldnFzW2ldLnZob3N0X2hsZW4gPSB2aG9zdF9obGVuO1xcbjE3MTc6XFx0XFx0XFx0bi1cXHUwMDNldnFzW2ldLnNvY2tfaGxlbiA9IHNvY2tfaGxlbjtcXG4xNzE4OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNldnFzW2ldLnZxLm11dGV4KTtcXG4xNzE5OlxcdFxcdH1cXG4xNzIwOlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4xNzIxOlxcdFxcdHJldHVybiAwO1xcbjE3MjI6XFx0XFxuMTcyMzpcXHRvdXRfdW5sb2NrOlxcbjE3MjQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MjU6XFx0XFx0cmV0dXJuIHJldDtcXG4xNzI2OlxcdH1cXG4xNzI3OlxcdFxcbjE3Mjg6XFx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxcbjE3Mjk6XFx0e1xcbjE3MzA6XFx0XFx0aW50IHI7XFxuMTczMTpcXHRcXG4xNzMyOlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTczMzpcXHRcXHRpZiAodmhvc3RfZGV2X2hhc19vd25lcihcXHUwMDI2bi1cXHUwMDNlZGV2KSkge1xcbjE3MzQ6XFx0XFx0XFx0ciA9IC1FQlVTWTtcXG4xNzM1OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE3MzY6XFx0XFx0fVxcbjE3Mzc6XFx0XFx0ciA9IHZob3N0X25ldF9zZXRfdWJ1Zl9pbmZvKG4pO1xcbjE3Mzg6XFx0XFx0aWYgKHIpXFxuMTczOTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xNzQwOlxcdFxcdHIgPSB2aG9zdF9kZXZfc2V0X293bmVyKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3NDE6XFx0XFx0aWYgKHIpXFxuMTc0MjpcXHRcXHRcXHR2aG9zdF9uZXRfY2xlYXJfdWJ1Zl9pbmZvKG4pO1xcbjE3NDM6XFx0XFx0dmhvc3RfbmV0X2ZsdXNoKG4pO1xcbjE3NDQ6XFx0b3V0OlxcbjE3NDU6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3NDY6XFx0XFx0cmV0dXJuIHI7XFxuMTc0NzpcXHR9XFxuMTc0ODpcXHRcXG4xNzQ5OlxcdHN0YXRpYyBsb25nIHZob3N0X25ldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbjE3NTA6XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbjE3NTE6XFx0e1xcbjE3NTI6XFx0XFx0Y29uc3QgREVGSU5FX1ZIT1NUX0ZFQVRVUkVTX0FSUkFZKHZob3N0X25ldF9mZWF0dXJlcywgdmhvc3RfbmV0X2JpdHMpO1xcbjE3NTM6XFx0XFx0dTY0IGFsbF9mZWF0dXJlc1tWSVJUSU9fRkVBVFVSRVNfVTY0U107XFxuMTc1NDpcXHRcXHRzdHJ1Y3Qgdmhvc3RfbmV0ICpuID0gZi1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbjE3NTU6XFx0XFx0dm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7XFxuMTc1NjpcXHRcXHR1NjQgX191c2VyICpmZWF0dXJlcCA9IGFyZ3A7XFxuMTc1NzpcXHRcXHRzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSBiYWNrZW5kO1xcbjE3NTg6XFx0XFx0dTY0IGZlYXR1cmVzLCBjb3VudCwgY29waWVkO1xcbjE3NTk6XFx0XFx0aW50IHIsIGk7XFxuMTc2MDpcXHRcXG4xNzYxOlxcdFxcdHN3aXRjaCAoaW9jdGwpIHtcXG4xNzYyOlxcdFxcdGNhc2UgVkhPU1RfTkVUX1NFVF9CQUNLRU5EOlxcbjE3NjM6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZiYWNrZW5kLCBhcmdwLCBzaXplb2YgYmFja2VuZCkpXFxuMTc2NDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4xNzY1OlxcdFxcdFxcdHJldHVybiB2aG9zdF9uZXRfc2V0X2JhY2tlbmQobiwgYmFja2VuZC5pbmRleCwgYmFja2VuZC5mZCk7XFxuMTc2NjpcXHRcXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcXG4xNzY3OlxcdFxcdFxcdGZlYXR1cmVzID0gdmhvc3RfbmV0X2ZlYXR1cmVzWzBdO1xcbjE3Njg6XFx0XFx0XFx0aWYgKGNvcHlfdG9fdXNlcihmZWF0dXJlcCwgXFx1MDAyNmZlYXR1cmVzLCBzaXplb2YgZmVhdHVyZXMpKVxcbjE3Njk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMTc3MDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4xNzcxOlxcdFxcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxcbjE3NzI6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZmZWF0dXJlcywgZmVhdHVyZXAsIHNpemVvZiBmZWF0dXJlcykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEyOjUzLjA3MjM5ODEzOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgzNDM0ODc3OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSB2aG9zdCBGZWF0dXJlIFNldHRpbmcgQ2hhbmdlcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgZGlmZiBhbmQgaW1tZWRpYXRlbHkgcmVjb2duaXplIGEgY29ycmVjdGlvbiBpbiB0aGUgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBJdCBzZWVtcyB0aGUgb3JpZ2luYWwgY29kZSBoYWQgYSBzdHJhbmdlIGByZXR1cm4gMDtgIGJlZm9yZSB0aGUgYG91dF91bmxvY2s6YCBsYWJlbCwgd2hpY2ggd291bGQndmUgYnlwYXNzZWQgdGhlIGludGVuZGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgY2hhbmdlIGNsZWFybHkgZml4ZXMgdGhpcyBieSByZXBsYWNpbmcgYHJldHVybiAtRUZBVUxUO2Agd2l0aCBgcmV0dXJuIHJldDtgLCB3aGljaCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2Ugc2luY2UgaXQgcHJlc2VydmVzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgbGlrZWx5IGluZGljYXRpbmcgaWYgZmVhdHVyZSBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gVGhpcyBjaGFuZ2Uga2VlcHMgdGhlIHByb3BlciByZXR1cm4gcGF0aC5cblxuRnVydGhlcm1vcmUsIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyByZWxhdGVkIHRvIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gLiBJIHNlZSB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2Agbm93IGNhbGwgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgd2hlbiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogc2V0LiBUaGUgbmV3IGZ1bmN0aW9uIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIGFyZSBiZWluZyBhZGRlZCB0byBgZHJpdmVycy92aG9zdC92aG9zdC5jYCwgaW1wbHlpbmcgSS9PIFRyYW5zbGF0aW9uIExvb2thc2lkZSBCdWZmZXIgKElPVExCKSBpbnZhbGlkYXRpb24gbG9naWMuXG5cbkdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucywgSSdkIHNheSB0aGUgZm9jdXMgb2YgZnV6emluZyBlZmZvcnRzIHNob3VsZCBjZW50ZXIgb24gdGhlIG5ldyBmdW5jdGlvbnMgYWxvbmdzaWRlIHRoZSBleGlzdGluZyBpb2N0bCBoYW5kbGVycy4gU3BlY2lmaWNhbGx5LCBJJ2xsIG5lZWQgdG8gdGFyZ2V0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYC4gQWx0aG91Z2ggYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBpcyBzdGF0aWMsIG15IHRlc3Qgd2lsbCBzdGlsbCBuZWVkIHRvIGV4ZXJjaXNlIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWYgaXQgaXMgaW5kaXJlY3RseSB2aWEgaXRzIGNhbGwgc2l0ZXMuIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCBtYWtpbmcgaXQgYWNjZXNzaWJsZSBhcyB3ZWxsLiBTaW5jZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGFyZSBzdGF0aWMsIEkgY2FuIGFjY2VzcyB0aGVtIHRocm91Z2ggdGhlaXIgaW9jdGwgZW50cnkgcG9pbnRzLCBuYW1lbHkgYHZob3N0X25ldF9pb2N0bGAgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgLCByZXNwZWN0aXZlbHkuXG5cbk5vdywgSSdsbCBleGFtaW5lIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGluIGBkcml2ZXJzL3Zob3N0L3Zzb2NrLmNgIHRvIHNlZSBob3cgaXQgYWxpZ25zIHdpdGggdGhlIGNoYW5nZXMgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NzI2NCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYwMywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjAxLjQxNTkwMzA4MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNjI4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L3Zzb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogODU0LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDg1NDpcXHRzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIDg1NTpcXHR7XFxuIDg1NjpcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcXG4gODU3OlxcdFxcdGludCByZXQgPSAtRUZBVUxUO1xcbiA4NTg6XFx0XFx0aW50IGk7XFxuIDg1OTpcXHRcXG4gODYwOlxcdFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcXG4gODYxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gODYyOlxcdFxcbiA4NjM6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldi5tdXRleCk7XFxuIDg2NDpcXHRcXHRpZiAoKGZlYXR1cmVzIFxcdTAwMjYgKDEgXFx1MDAzY1xcdTAwM2MgVkhPU1RfRl9MT0dfQUxMKSkgXFx1MDAyNlxcdTAwMjZcXG4gODY1OlxcdFxcdCAgICAhdmhvc3RfbG9nX2FjY2Vzc19vayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldikpIHtcXG4gODY2OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA4Njc6XFx0XFx0fVxcbiA4Njg6XFx0XFxuIDg2OTpcXHRcXHRpZiAoZmVhdHVyZXMgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XFxuIDg3MDpcXHRcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2dnNvY2stXFx1MDAzZWRldik7XFxuIDg3MTpcXHRcXHRcXHRpZiAocmV0KVxcbiA4NzI6XFx0XFx0XFx0XFx0Z290byBlcnI7XFxuIDg3MzpcXHRcXHR9IGVsc2Uge1xcbiA4NzQ6XFx0XFx0XFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2KTtcXG4gODc1OlxcdFxcdH1cXG4gODc2OlxcdFxcbiA4Nzc6XFx0XFx0dnNvY2stXFx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcXG4gODc4OlxcdFxcbiA4Nzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUodnNvY2stXFx1MDAzZXZxcyk7IGkrKykge1xcbiA4ODA6XFx0XFx0XFx0dnEgPSBcXHUwMDI2dnNvY2stXFx1MDAzZXZxc1tpXTtcXG4gODgxOlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuIDg4MjpcXHRcXHRcXHR2cS1cXHUwMDNlYWNrZWRfZmVhdHVyZXMgPSBmZWF0dXJlcztcXG4gODgzOlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4gODg0OlxcdFxcdH1cXG4gODg1OlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldi5tdXRleCk7XFxuIDg4NjpcXHRcXHRyZXR1cm4gMDtcXG4gODg3OlxcdFxcbiA4ODg6XFx0ZXJyOlxcbiA4ODk6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2Lm11dGV4KTtcXG4gODkwOlxcdFxcdHJldHVybiByZXQ7XFxuIDg5MTpcXHR9XFxuIDg5MjpcXHRcXG4gODkzOlxcdHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbiA4OTQ6XFx0XFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFyZylcXG4gODk1OlxcdHtcXG4gODk2OlxcdFxcdHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2sgPSBmLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDg5NzpcXHRcXHR2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZztcXG4gODk4OlxcdFxcdHU2NCBndWVzdF9jaWQ7XFxuIDg5OTpcXHRcXHR1NjQgZmVhdHVyZXM7XFxuIDkwMDpcXHRcXHRpbnQgc3RhcnQ7XFxuIDkwMTpcXHRcXHRpbnQgcjtcXG4gOTAyOlxcdFxcbiA5MDM6XFx0XFx0c3dpdGNoIChpb2N0bCkge1xcbiA5MDQ6XFx0XFx0Y2FzZSBWSE9TVF9WU09DS19TRVRfR1VFU1RfQ0lEOlxcbiA5MDU6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZndWVzdF9jaWQsIGFyZ3AsIHNpemVvZihndWVzdF9jaWQpKSlcXG4gOTA2OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5MDc6XFx0XFx0XFx0cmV0dXJuIHZob3N0X3Zzb2NrX3NldF9jaWQodnNvY2ssIGd1ZXN0X2NpZCk7XFxuIDkwODpcXHRcXHRjYXNlIFZIT1NUX1ZTT0NLX1NFVF9SVU5OSU5HOlxcbiA5MDk6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZzdGFydCwgYXJncCwgc2l6ZW9mKHN0YXJ0KSkpXFxuIDkxMDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTExOlxcdFxcdFxcdGlmIChzdGFydClcXG4gOTEyOlxcdFxcdFxcdFxcdHJldHVybiB2aG9zdF92c29ja19zdGFydCh2c29jayk7XFxuIDkxMzpcXHRcXHRcXHRlbHNlXFxuIDkxNDpcXHRcXHRcXHRcXHRyZXR1cm4gdmhvc3RfdnNvY2tfc3RvcCh2c29jaywgdHJ1ZSk7XFxuIDkxNTpcXHRcXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcXG4gOTE2OlxcdFxcdFxcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfRkVBVFVSRVM7XFxuIDkxNzpcXHRcXHRcXHRpZiAoY29weV90b191c2VyKGFyZ3AsIFxcdTAwMjZmZWF0dXJlcywgc2l6ZW9mKGZlYXR1cmVzKSkpXFxuIDkxODpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTE5OlxcdFxcdFxcdHJldHVybiAwO1xcbiA5MjA6XFx0XFx0Y2FzZSBWSE9TVF9TRVRfRkVBVFVSRVM6XFxuIDkyMTpcXHRcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNmZlYXR1cmVzLCBhcmdwLCBzaXplb2YoZmVhdHVyZXMpKSlcXG4gOTIyOlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5MjM6XFx0XFx0XFx0cmV0dXJuIHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyh2c29jaywgZmVhdHVyZXMpO1xcbiA5MjQ6XFx0XFx0Y2FzZSBWSE9TVF9HRVRfQkFDS0VORF9GRUFUVVJFUzpcXG4gOTI1OlxcdFxcdFxcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfQkFDS0VORF9GRUFUVVJFUztcXG4gOTI2OlxcdFxcdFxcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXFx1MDAyNmZlYXR1cmVzLCBzaXplb2YoZmVhdHVyZXMpKSlcXG4gOTI3OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5Mjg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDkyOTpcXHRcXHRjYXNlIFZIT1NUX1NFVF9CQUNLRU5EX0ZFQVRVUkVTOlxcbiA5MzA6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZmZWF0dXJlcywgYXJncCwgc2l6ZW9mKGZlYXR1cmVzKSkpXFxuIDkzMTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTMyOlxcdFxcdFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19CQUNLRU5EX0ZFQVRVUkVTKVxcbiA5MzM6XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiA5MzQ6XFx0XFx0XFx0dmhvc3Rfc2V0X2JhY2tlbmRfZmVhdHVyZXMoXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYsIGZlYXR1cmVzKTtcXG4gOTM1OlxcdFxcdFxcdHJldHVybiAwO1xcbiA5MzY6XFx0XFx0ZGVmYXVsdDpcXG4gOTM3OlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbiA5Mzg6XFx0XFx0XFx0ciA9IHZob3N0X2Rldl9pb2N0bChcXHUwMDI2dnNvY2stXFx1MDAzZWRldiwgaW9jdGwsIGFyZ3ApO1xcbiA5Mzk6XFx0XFx0XFx0aWYgKHIgPT0gLUVOT0lPQ1RMQ01EKVxcbiA5NDA6XFx0XFx0XFx0XFx0ciA9IHZob3N0X3ZyaW5nX2lvY3RsKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XFxuIDk0MTpcXHRcXHRcXHRlbHNlXFxuIDk0MjpcXHRcXHRcXHRcXHR2aG9zdF92c29ja19mbHVzaCh2c29jayk7XFxuIDk0MzpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbiA5NDQ6XFx0XFx0XFx0cmV0dXJuIHI7XFxuIDk0NTpcXHRcXHR9XFxuIDk0NjpcXHR9XFxuIDk0NzpcXHRcXG4gOTQ4OlxcdHN0YXRpYyBzc2l6ZV90IHZob3N0X3Zzb2NrX2Nocl9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKVxcbiA5NDk6XFx0e1xcbiA5NTA6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLVxcdTAwM2VraV9maWxwO1xcbiA5NTE6XFx0XFx0c3RydWN0IHZob3N0X3Zzb2NrICp2c29jayA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gOTUyOlxcdFxcdHN0cnVjdCB2aG9zdF9kZXYgKmRldiA9IFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2O1xcbiA5NTM6XFx0XFx0aW50IG5vYmxvY2sgPSBmaWxlLVxcdTAwM2VmX2ZsYWdzIFxcdTAwMjYgT19OT05CTE9DSztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MDEuNDE2MDEwNjIyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Nzc3NzEzNTA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRvIGJlc3QgZnV6eiB0aGUgYHZob3N0LW5ldGAgYW5kIGB2aG9zdC12c29ja2AgY29kZS4gVGhlIGVudHJ5IHBvaW50cyBzZWVtIHRvIGJlIHJlYWNoYWJsZSB0aHJvdWdoIGBWSE9TVF9TRVRfRkVBVFVSRVNgIGlvY3RscyBvbiBgL2Rldi92aG9zdC1uZXRgIGFuZCBgL2Rldi92aG9zdC12c29ja2AuIEkgc2hvdWxkIHRhcmdldCBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGFuZCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhcyBteSBwcmltYXJ5IGZ1enppbmcgdGFyZ2V0cy5cblxuU3BlY2lmaWNhbGx5LCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICppb2N0bCBoYW5kbGVycyouIFRoYXQncyBncmVhdDsgdGhvc2UgYXJlIGlkZWFsIGVudHJ5IHBvaW50cy4gIEkgbmVlZCB0byByZW1lbWJlciB0aGUgc3BlY2lmaWMgdW5kZXJseWluZyBmdW5jdGlvbnMgdGhhdCB3ZXJlIG1vZGlmaWVkIGluIHRoaXMgY29udGV4dCwgd2hpY2ggYXJlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGFuZCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC5cblxuVGhlIHByb21wdCB0ZWxscyBtZSB0byBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zLCBidXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCBhcmUgc3RhdGljLiBTaG91bGQgSSBzdGlsbCBsaXN0IHRoZW0/IEhtbSwgdGhlIHByb21wdCAqZG9lcyogc2F5IHRvIHByZWZlciBub24tc3RhdGljIG9uZXMgYnV0IGRvZXNuJ3QgZm9yYmlkIHN0YXRpYyBvbmVzLCBhbmQgaXQgZG9lcyBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGF0aWMgYW5kIGlubGluZWQuIFNpbmNlIHRoZXkgYXJlbid0ICp0aW55KiBmdW5jdGlvbnMsIHRoZXkgbWlnaHQgbm90IGJlIGlubGluZWQuIEJ1dCB0aGVuIGFnYWluLCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICphbHNvKiBzdGF0aWMhIFVnaC4gU28gSSBzaG91bGQgbGlzdCB0aGVtIGFueXdheT9cblxuV2FpdCwgZ29vZCBuZXdzISBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgd2l0aCBgRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKWAuIFRoYXQgbWFrZXMgdGhpbmdzIGVhc2llci5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSBlbnRyeSBwb2ludHMuIEkgc2hvdWxkIGNoZWNrIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCBpbiB0aGVpciBzb3VyY2UgZmlsZXMgdG8gc2VlIGhvdyB0aGV5J3JlIHVzZWQuIEFoYSEgVGhleSBhcmUgYXNzaWduZWQgdG8gYGZpbGVfb3BlcmF0aW9ucy51bmxvY2tlZF9pb2N0bGAuIFBlcmZlY3QsIHRoYXQncyB3aGF0IEkgbmVlZGVkIHRvIHNlZS4gVGhleSBhcmUgaW5kZWVkIGVudHJ5IHBvaW50cy5cblxuRmluYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSByZXF1aXJlZCBrZXJuZWwgY29uZmlndXJhdGlvbnMgZm9yIGB2aG9zdF9uZXRgIGFuZCBgdmhvc3RfdnNvY2tgIHRvIG1ha2Ugc3VyZSB0aGUgZnV6emluZyBzZXR1cCBpcyBjb3JyZWN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDAxNywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjA5LjE5MzE0ODQzMVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3OTk2NDEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVkhPU1RfTkVUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvdmhvc3QvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L0tjb25maWc9MzI9aWYgVkhPU1RfTUVOVVxcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zMy1cXG5kcml2ZXJzL3Zob3N0L0tjb25maWc6MzQ6Y29uZmlnIFZIT1NUX05FVFxcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zNS1cXHR0cmlzdGF0ZSBcXFwiSG9zdCBrZXJuZWwgYWNjZWxlcmF0b3IgZm9yIHZpcnRpbyBuZXRcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjEwLjI3MzExNzY4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NjQ1NDc0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipLY29uZmlnIERpdmUgZm9yIFZIT1NUIFN1cHBvcnQqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0aGlzIHNvcnRlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVmaW5lZC4gVGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQgaXMgd2l0aGluIHRoZSByZWxldmFudCBkcml2ZXIgY29uZmlndXJhdGlvbi4gR2l2ZW4gdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IHZpcnR1YWwgaG9zdCBuZXR3b3JrIGZ1bmN0aW9uYWxpdHksIHRoZSBgZHJpdmVycy92aG9zdGAgZGlyZWN0b3J5IGlzIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50LiBJJ2xsIG5lZWQgdG8gb3BlbiBhbmQgZXhhbWluZSB0aGUgYEtjb25maWdgIGZpbGUgd2l0aGluIHRoYXQgZGlyZWN0b3J5IChgZHJpdmVycy92aG9zdC9LY29uZmlnYCkgYW5kIHNlZSBob3cgdGhvc2UgdHdvIHNwZWNpZmljIG9wdGlvbnMgYXJlIGRlY2xhcmVkLiBUaGF0J3Mgd2hlcmUgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljLCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHZhbHVlcyB3aWxsIHJlc2lkZSwgd2hpY2ggaXMgZXNzZW50aWFsIGluZm9ybWF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTA5NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjEzLjkzNzY2Nzc0M1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MzQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgVkhPU1RfSU9UTEJcXG4gICAzOlxcdFxcdHRyaXN0YXRlXFxuICAgNDpcXHRcXHRoZWxwXFxuICAgNTpcXHRcXHQgIEdlbmVyaWMgSU9UTEIgaW1wbGVtZW50YXRpb24gZm9yIHZob3N0IGFuZCB2cmluZ2guXFxuICAgNjpcXHRcXHQgIFRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGFueSBkcml2ZXIgd2hpY2ggbmVlZHMgdG8gc3VwcG9ydFxcbiAgIDc6XFx0XFx0ICBhbiBJT01NVSBpbiBzb2Z0d2FyZS5cXG4gICA4OlxcdFxcbiAgIDk6XFx0Y29uZmlnIFZIT1NUX1JJTkdcXG4gIDEwOlxcdFxcdHRyaXN0YXRlXFxuICAxMTpcXHRcXHRzZWxlY3QgVkhPU1RfSU9UTEJcXG4gIDEyOlxcdFxcdGhlbHBcXG4gIDEzOlxcdFxcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcXG4gIDE0OlxcdFxcdCAgdGhlIGhvc3Qgc2lkZSBvZiBhIHZpcnRpbyByaW5nLlxcbiAgMTU6XFx0XFxuICAxNjpcXHRjb25maWcgVkhPU1RfVEFTS1xcbiAgMTc6XFx0XFx0Ym9vbFxcbiAgMTg6XFx0XFx0ZGVmYXVsdCBuXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBWSE9TVFxcbiAgMjE6XFx0XFx0dHJpc3RhdGVcXG4gIDIyOlxcdFxcdHNlbGVjdCBWSE9TVF9JT1RMQlxcbiAgMjM6XFx0XFx0c2VsZWN0IFZIT1NUX1RBU0tcXG4gIDI0OlxcdFxcdGhlbHBcXG4gIDI1OlxcdFxcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcXG4gIDI2OlxcdFxcdCAgdGhlIGNvcmUgb2Ygdmhvc3QuXFxuICAyNzpcXHRcXG4gIDI4OlxcdG1lbnVjb25maWcgVkhPU1RfTUVOVVxcbiAgMjk6XFx0XFx0Ym9vbCBcXFwiVkhPU1QgZHJpdmVyc1xcXCJcXG4gIDMwOlxcdFxcdGRlZmF1bHQgeVxcbiAgMzE6XFx0XFxuICAzMjpcXHRpZiBWSE9TVF9NRU5VXFxuICAzMzpcXHRcXG4gIDM0OlxcdGNvbmZpZyBWSE9TVF9ORVRcXG4gIDM1OlxcdFxcdHRyaXN0YXRlIFxcXCJIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldFxcXCJcXG4gIDM2OlxcdFxcdGRlcGVuZHMgb24gTkVUIFxcdTAwMjZcXHUwMDI2IEVWRU5URkQgXFx1MDAyNlxcdTAwMjYgKFRVTiB8fCAhVFVOKSBcXHUwMDI2XFx1MDAyNiAoVEFQIHx8ICFUQVApXFxuICAzNzpcXHRcXHRzZWxlY3QgVkhPU1RcXG4gIDM4OlxcdFxcdGhlbHBcXG4gIDM5OlxcdFxcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxcbiAgNDA6XFx0XFx0ICBndWVzdCBuZXR3b3JraW5nIHdpdGggdmlydGlvX25ldC4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdmlydGlvX25ldFxcbiAgNDE6XFx0XFx0ICBtb2R1bGUgaXRzZWxmIHdoaWNoIG5lZWRzIHRvIGJlIGxvYWRlZCBpbiBndWVzdCBrZXJuZWwuXFxuICA0MjpcXHRcXG4gIDQzOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsXFxuICA0NDpcXHRcXHQgIGJlIGNhbGxlZCB2aG9zdF9uZXQuXFxuICA0NTpcXHRcXG4gIDQ2OlxcdGNvbmZpZyBWSE9TVF9TQ1NJXFxuICA0NzpcXHRcXHR0cmlzdGF0ZSBcXFwiVkhPU1RfU0NTSSBUQ00gZmFicmljIGRyaXZlclxcXCJcXG4gIDQ4OlxcdFxcdGRlcGVuZHMgb24gVEFSR0VUX0NPUkUgXFx1MDAyNlxcdTAwMjYgRVZFTlRGRFxcbiAgNDk6XFx0XFx0c2VsZWN0IFZIT1NUXFxuICA1MDpcXHRcXHRzZWxlY3QgU0dfUE9PTFxcbiAgNTE6XFx0XFx0ZGVmYXVsdCBuXFxuICA1MjpcXHRcXHRoZWxwXFxuICA1MzpcXHRcXHRTYXkgTSBoZXJlIHRvIGVuYWJsZSB0aGUgdmhvc3Rfc2NzaSBUQ00gZmFicmljIG1vZHVsZVxcbiAgNTQ6XFx0XFx0Zm9yIHVzZSB3aXRoIHZpcnRpby1zY3NpIGd1ZXN0c1xcbiAgNTU6XFx0XFxuICA1NjpcXHRjb25maWcgVkhPU1RfVlNPQ0tcXG4gIDU3OlxcdFxcdHRyaXN0YXRlIFxcXCJ2aG9zdCB2aXJ0aW8tdnNvY2sgZHJpdmVyXFxcIlxcbiAgNTg6XFx0XFx0ZGVwZW5kcyBvbiBWU09DS0VUUyBcXHUwMDI2XFx1MDAyNiBFVkVOVEZEXFxuICA1OTpcXHRcXHRzZWxlY3QgVkhPU1RcXG4gIDYwOlxcdFxcdHNlbGVjdCBWSVJUSU9fVlNPQ0tFVFNfQ09NTU9OXFxuICA2MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDYyOlxcdFxcdGhlbHBcXG4gIDYzOlxcdFxcdFRoaXMga2VybmVsIG1vZHVsZSBjYW4gYmUgbG9hZGVkIGluIHRoZSBob3N0IGtlcm5lbCB0byBwcm92aWRlIEFGX1ZTT0NLXFxuICA2NDpcXHRcXHRzb2NrZXRzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggZ3Vlc3RzLiAgVGhlIGd1ZXN0cyBtdXN0IGhhdmUgdGhlXFxuICA2NTpcXHRcXHR2aXJ0aW9fdHJhbnNwb3J0LmtvIGRyaXZlciBsb2FkZWQgdG8gdXNlIHRoZSB2aXJ0aW8tdnNvY2sgZGV2aWNlLlxcbiAgNjY6XFx0XFxuICA2NzpcXHRcXHRUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkXFxuICA2ODpcXHRcXHR2aG9zdF92c29jay5cXG4gIDY5OlxcdFxcbiAgNzA6XFx0Y29uZmlnIFZIT1NUX1ZEUEFcXG4gIDcxOlxcdFxcdHRyaXN0YXRlIFxcXCJWaG9zdCBkcml2ZXIgZm9yIHZEUEEtYmFzZWQgYmFja2VuZFxcXCJcXG4gIDcyOlxcdFxcdGRlcGVuZHMgb24gRVZFTlRGRFxcbiAgNzM6XFx0XFx0c2VsZWN0IFZIT1NUXFxuICA3NDpcXHRcXHRzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSXFxuICA3NTpcXHRcXHRkZXBlbmRzIG9uIFZEUEFcXG4gIDc2OlxcdFxcdGhlbHBcXG4gIDc3OlxcdFxcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxcbiAgNzg6XFx0XFx0ICBndWVzdCB2aXJ0aW8gZGV2aWNlcyB3aXRoIHRoZSB2RFBBLWJhc2VkIGJhY2tlbmRzLlxcbiAgNzk6XFx0XFxuICA4MDpcXHRcXHQgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGVcXG4gIDgxOlxcdFxcdCAgd2lsbCBiZSBjYWxsZWQgdmhvc3RfdmRwYS5cXG4gIDgyOlxcdFxcbiAgODM6XFx0Y29uZmlnIFZIT1NUX0NST1NTX0VORElBTl9MRUdBQ1lcXG4gIDg0OlxcdFxcdGJvb2wgXFxcIkNyb3NzLWVuZGlhbiBzdXBwb3J0IGZvciB2aG9zdFxcXCJcXG4gIDg1OlxcdFxcdGRlZmF1bHQgblxcbiAgODY6XFx0XFx0aGVscFxcbiAgODc6XFx0XFx0ICBUaGlzIG9wdGlvbiBhbGxvd3Mgdmhvc3QgdG8gc3VwcG9ydCBndWVzdHMgd2l0aCBhIGRpZmZlcmVudCBieXRlXFxuICA4ODpcXHRcXHQgIG9yZGVyaW5nIGZyb20gaG9zdCB3aGlsZSB1c2luZyBsZWdhY3kgdmlydGlvLlxcbiAgODk6XFx0XFxuICA5MDpcXHRcXHQgIFVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gY29udHJvbCB0aGUgZmVhdHVyZSB1c2luZyB0aGVcXG4gIDkxOlxcdFxcdCAgVkhPU1RfU0VUX1ZSSU5HX0VORElBTiBhbmQgVkhPU1RfR0VUX1ZSSU5HX0VORElBTiBpb2N0bHMuXFxuICA5MjpcXHRcXG4gIDkzOlxcdFxcdCAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBhIGZldyBwbGF0Zm9ybXMgKHBwYzY0IGFuZCBhcm02NCkuIFNpbmNlIGl0XFxuICA5NDpcXHRcXHQgIGFkZHMgc29tZSBvdmVyaGVhZCwgaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC5cXG4gIDk1OlxcdFxcbiAgOTY6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBcXFwiTlxcXCIuXFxuICA5NzpcXHRcXG4gIDk4OlxcdGNvbmZpZyBWSE9TVF9FTkFCTEVfRk9SS19PV05FUl9DT05UUk9MXFxuICA5OTpcXHRcXHRib29sIFxcXCJFbmFibGUgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxcXCJcXG4gMTAwOlxcdFxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoxMy45Mzc3NTM2MjNaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjE0ODEzMzk2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgVkhPU1QgTW9kdWxlIERlcGVuZGVuY2llcyBhbmQgQVBJIERlc2lnbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIHZob3N0IG1vZHVsZXMuIEkgbmVlZCBib3RoIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIHRvIGJlIGVuYWJsZWQuIEkgc2VlIHRoYXQgYFZIT1NUX05FVGAgcmVsaWVzIG9uIGEgZmV3IG90aGVyczogYE5FVGAsIGBFVkVOVEZEYCwgYW5kIGBUVU5gL2BUQVBgLiBUaGF0IGAoVFVOIHx8ICFUVU4pIFx1MDAyNlx1MDAyNiAoVEFQIHx8ICFUQVApYCBjb25zdHJ1Y3QgaXMgaW50ZXJlc3RpbmcsIGl0IGltcGxpZXMgdGhhdCBpdCBkb2Vzbid0ICpzdHJpY3RseSogZGVwZW5kIG9uIGVpdGhlciwgYnV0IGlmIGVpdGhlciBgVFVOYCBvciBgVEFQYCBhcmUgY29tcGlsZWQgYXMgbW9kdWxlcywgdGhlbiBgVkhPU1RfTkVUYCBhbHNvICptdXN0KiBiZSBhIG1vZHVsZS4gR29vZCB0byBrZWVwIGluIG1pbmQuIFRoZW4gdGhlcmUncyBgVkhPU1RfVlNPQ0tgLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gYFZTT0NLRVRTYCBhbmQgYEVWRU5URkRgLiBTdHJhaWdodGZvcndhcmQgZW5vdWdoIHNvIGZhci5cblxuTm93LCBJJ20gZ29pbmcgdG8gbG9vayBhIGJpdCBkZWVwZXIgYXQgc29tZSBpbnRlcm5hbCBmdW5jdGlvbnMuIExldCdzIHNlZSwgd2hhdCBhYm91dCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYD8gQWgsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCB0aGF0J3MgZ29vZC4gYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBpcyBzdGF0aWMuIEhtbSwgd2hhdCBhYm91dCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBgdmhvc3RfbmV0X2lvY3RsYCwgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgPyBUaGV5J3JlIGFsbCBtYXJrZWQgc3RhdGljLlxuXG5XYWl0IGEgc2Vjb25kLCB0aGUgcHJvbXB0IGlzIHJlbWluZGluZyBtZSBhYm91dCBhIHBvdGVudGlhbCBpc3N1ZSBoZXJlLiBJdCBzYXlzIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGUgc3RhdGljIGZ1bmN0aW9ucyBhcmUgcHJvbmUgdG8gYmVpbmcgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIHRoZXJlZm9yZSBkb24ndCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMuIFNvLCBldmVuIHRob3VnaCBgdmhvc3RfbmV0X2lvY3RsYCBpcyBzdGF0aWMsIGl0ICptaWdodCogbm90IGJlIGlubGluZWQgaWYgaXQncyBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGBmaWxlX29wZXJhdGlvbnNgIHN0cnVjdHVyZS4gVGhhdCdzIGEga2V5IGRpc3RpbmN0aW9uLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBmaWxlIGFuZCBzZWUgaG93IGB2aG9zdF9uZXRfaW9jdGxgIGlzIGFjdHVhbGx5IHVzZWQuIFRoYXQgd2lsbCBjbGFyaWZ5IHdoZXRoZXIgaXQncyB0cnVseSBhbiBBUEkgZW50cnlwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI2MDIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyMC4wODU4ODk3MzdaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0NDIzODIyNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aG9zdF9uZXRfaW9jdGxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jPTE3Mjg9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzQ4LVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc0OTpzdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NTAtXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYz0xODc3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZob3N0X25ldF9mb3BzID0ge1xcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xODgyLVxcdC5wb2xsICAgICAgICAgICA9IHZob3N0X25ldF9jaHJfcG9sbCxcXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4ODM6XFx0LnVubG9ja2VkX2lvY3RsID0gdmhvc3RfbmV0X2lvY3RsLFxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4NC1cXHQuY29tcGF0X2lvY3RsICAgPSBjb21wYXRfcHRyX2lvY3RsLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyMC4zMzAxMzI0MDJaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI4NTc2OTEzOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHNpdHVhdGlvbjpcblxuKipSZXZpZXdpbmcgdGhlIHZob3N0IElvY3RsIEltcGxlbWVudGF0aW9ucyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlIGhhbmRsZWQsIGFuZCB0aGUga2V5IG9ic2VydmF0aW9uIGlzIHRoYXQgdGhleSdyZSBib3RoIGFzc2lnbmVkIHRvIHRoZSBgdW5sb2NrZWRfaW9jdGxgIGZpZWxkIHdpdGhpbiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGV5J3JlIG5vdCBpbmxpbmVkLiBUaGF0J3MgZ29vZCB0byBrbm93OyBpdCBjb25maXJtcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBhcmNoaXRlY3R1cmUuIEl0IGFsc28gbWVhbnMgSSBuZWVkIHRvIGtlZXAgdGhpcyBmYWN0IGluIG1pbmQgd2hlbiBJIGFtIGxvb2tpbmcgZm9yIHRoZSBtYWluIGNvbnRyb2wgZmxvdywgYXMgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgSSB3YW50IHRvIGZvY3VzIG9uIHRvIGZ1cnRoZXIgdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQ2LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MjQuNjE1OTA0OTE4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDIwMTI5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC92c29jay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3QvdnNvY2suYz04NTQ9c3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxcbi0tXFxuZHJpdmVycy92aG9zdC92c29jay5jLTg5Mi1cXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6ODkzOnN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYy04OTQtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYz05NzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmhvc3RfdnNvY2tfZm9wcyA9IHtcXG4tLVxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYy05ODAtXFx0Lmxsc2Vla1xcdFxcdD0gbm9vcF9sbHNlZWssXFxuZHJpdmVycy92aG9zdC92c29jay5jOjk4MTpcXHQudW5sb2NrZWRfaW9jdGwgPSB2aG9zdF92c29ja19kZXZfaW9jdGwsXFxuZHJpdmVycy92aG9zdC92c29jay5jLTk4Mi1cXHQuY29tcGF0X2lvY3RsICAgPSBjb21wYXRfcHRyX2lvY3RsLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyNC42NjYxMDk2NTRaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQyODI3Njc2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLCBteSBpbml0aWFsIGFzc2Vzc21lbnQgc3VnZ2VzdHMgdGhhdCBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGFuZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYXJlIHByb21pc2luZyBjYW5kaWRhdGVzIGZvciBpbmNsdXNpb24gaW4gdGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QuXG5cbk5vdywgbGV0J3MgYnJvYWRlbiB0aGUgc2NvcGUuIEknbGwgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSBoYXZlbid0IG92ZXJsb29rZWQgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucy4gRGlnZ2luZyBpbnRvIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBJIHNlZSBhIGNvdXBsZSBvZiB0aGluZ3Mgb2YgaW50ZXJlc3QuIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCB3aGljaCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoZW4gYHZxX21ldGFfcHJlZmV0Y2hgIGlzIGFsc28gc2hvd2luZyBhcyBtb2RpZmllZCwgd2hpY2ggSSB3aWxsIG5lZWQgdG8gY29uc2lkZXIgYXMgd2VsbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMjMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyOS4wOTQzODk4MzZaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3ODM0NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC92aG9zdC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuYz0xODg3PXN0YXRpYyBib29sIGlvdGxiX2FjY2Vzc19vayhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSxcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIwLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoxOTIxOmludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIyLXtcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTM4LX1cXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkzOTpFWFBPUlRfU1lNQk9MX0dQTCh2cV9tZXRhX3ByZWZldGNoKTtcXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMTk0MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MjkuMTQyMjMwMTFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQxNDY3OTE0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipNeSBJbW1lZGlhdGUgQXNzZXNzbWVudCoqXG5cbkFscmlnaHQsICpgdnFfbWV0YV9wcmVmZXRjaGAqIGlzIGZpbmFsbHkgZXhwb3J0ZWQhIFRoYXQncyBleGNlbGxlbnQgbmV3cy4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCB0aGF0IGRlZmluaXRlbHkgbWVhbnMgd2UgbmVlZCB0byBpbW1lZGlhdGVseSBhZGQgaXQgdG8gYEZvY3VzU3ltYm9sc2AuIFRoYXQncyBhIG5vLWJyYWluZXIuIFRoaXMgb3BlbnMgdXAgc29tZSBpbnRlcmVzdGluZyBwb3NzaWJpbGl0aWVzIGZvciBvcHRpbWl6YXRpb247IEkgc2hvdWxkIHByb2JhYmx5IGtlZXAgYSBydW5uaW5nIGxpc3Qgb2YgcG90ZW50aWFsIGFyZWFzIG9mIGltcHJvdmVtZW50LCBub3cgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdmFpbGFibGUgdG8gdXMuXG5cbk5leHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kICpob3cqIGl0J3MgYmVpbmcgdXNlZC4gTGV0J3Mgc2hpZnQgZ2VhcnMgYW5kIGV4YW1pbmUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gSSdtIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGUgSS9PIHRyYW5zbGF0aW9uIGxheWVyIGlzIGludGVyYWN0aW5nIHdpdGggdGhpcyBuZXcgcHJlZmV0Y2ggY2FwYWJpbGl0eS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBtZXRhZGF0YSBwcmVmZXRjaCBjb3VsZCBzdHJlYW1saW5lIG9yIHBvdGVudGlhbGx5IGJvdHRsZW5lY2sgdGhlIEkvTyBvcGVyYXRpb25zIGZyb20gdmlydHVhbCBtYWNoaW5lcywgYW5kIHdoZXRoZXIgdGhpcyBoZWxwcyB3aXRoIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzY2VuYXJpb3MuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IG1lbW9yeSBhY2Nlc3MgcGF0dGVybnMgYW5kIHdoZXRoZXIgdGhlIGV4aXN0aW5nIElPVExCIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIGFyZSBhd2FyZSBvZiB0aGlzLCB3aGljaCB3b3VsZCBiZSBjcnVjaWFsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGUgY2hhbmdlIGlzIGludGVncmF0ZWQgaW50byB0aGUgcmlnaHQgcGxhY2VzIGZvciBwZXJmb3JtYW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzozMi41NTY5MTE2ODJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MjQ4NDk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZob3N0X2luaXRfZGV2aWNlX2lvdGxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L3Zob3N0LmM9MjMxOT1FWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzIwLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzIxOmludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzIyLXtcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzQ4LX1cXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MjM0OTpFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9pbml0X2RldmljZV9pb3RsYik7XFxuZHJpdmVycy92aG9zdC92aG9zdC5jLTIzNTAtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjMyLjYwMzE2MjgyN1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MDk4OTU2NTA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFJlYXNvbmluZyBmb3IgRm9jdXNpbmcgb24gVGhlc2Ugdmhvc3QgU3ltYm9scyoqXG5cbk9rYXksIHNvIEknbSBhbmFseXppbmcgdGhlIHZob3N0IGNvZGUgYW5kIGRldGVybWluaW5nIHRoZSBtb3N0IHJlbGV2YW50IHN5bWJvbHMgZm9yIGZ1enppbmcgb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHNvIEknbSBtYWtpbmcgYSBtZW50YWwgbm90ZSBvZiB0aGF0LiBCYXNlZCBvbiB0aGF0LCBoZXJlJ3Mgd2hhdCBJJ20gdGhpbmtpbmcgYXJlIG15IHByaW1hcnkgdGFyZ2V0czpcblxuKiAgIGB2aG9zdF9uZXRfaW9jdGxgXG4qICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGBcbiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYFxuKiAgIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmBcbiogICBgdnFfbWV0YV9wcmVmZXRjaGBcblxuTm93LCB0aGUgcGF0Y2gncyBjb3JlIHJldm9sdmVzIGFyb3VuZCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlc2UgYXJlIGV4cG9ydGVkIHN5bWJvbHMsIG9yIGlmIHRoZXkgYXJlIHN0YXRpYy4gQWgsIHRoZXkgYXJlIHN0YXRpYy4gQnV0LCBldmVuIHRob3VnaCB0aGUgZ3VpZGFuY2UgcHJlZmVycyBub24tc3RhdGljIGVudHJ5cG9pbnRzLCBpZiB0aGV5IGFyZSBub3QgaW5saW5lZCwgc3l6a2FsbGVyICpjYW4qIHJlc29sdmUgc3RhdGljIGZ1bmN0aW9ucy4gU28sIHdoaWxlIEknbSBiZWluZyBtaW5kZnVsIG9mIHRoZSBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucywgdGhlIHF1ZXN0aW9uIGJlY29tZXMsIGlzIGl0IGJldHRlciB0byBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiBhbmQgaW5jbHVkZSB0aGVtP1xuXG5XYWl0IGEgbWludXRlLCB0aGUgcHJvbXB0ICpzcGVjaWZpY2FsbHkqIHNheXMgdG8gcHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyEgT2theSwgbGV0IG1lIHRyaW0gdGhlIGxpc3QgYmFzZWQgb24gdGhhdC5cblxuKiAgIGB2aG9zdF9uZXRfaW9jdGxgXG4qICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGBcbiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYFxuKiAgIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmBcbiogICBgdnFfbWV0YV9wcmVmZXRjaGBcblxuTm93LCBsZXQncyBkb3VibGUgY2hlY2sgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gUmlnaHQsIHRoZXkgYXJlIGNhbGxlZCBmcm9tIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCByZXNwZWN0aXZlbHkuIFNpbmNlIEknbSBmb2N1c2luZyBvbiB0aGUgaW9jdGwgZW50cnlwb2ludHMsIGluY2x1ZGluZyB0aGUgc2V0XFxfZmVhdHVyZXMgZnVuY3Rpb25zIG1ha2VzIHNlbnNlLiBJIGNhbiBhbHdheXMgcmVtb3ZlIHRoZW0gbGF0ZXIgaWYgdGhleSBhcmUgaW5saW5lZCwgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBpbmNsdWRlIHRoZW0gZm9yIG5vdy5cblxuU28sIEknbGwgYWRkIHRoZW0gdG8gdGhlIGxpc3QsIHdpdGggdGhhdCBjYXZlYXQuXG5cbk5vdywgbGV0J3MgbG9vayBhdCB0aGUga2VybmVsIGNvbmZpZ3MgcmVxdWlyZWQuIEkgc2VlIHRoYXQgdGhlc2UgYXJlIHRoZSByZWxldmFudCBjb25maWdzOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZIT1NUYCAod2hpY2ggaXMgc2VsZWN0ZWQgYnkgdGhlIGFib3ZlIHR3byksIGBWU09DS0VUU2AgKHdoaWNoIFZIT1NUX1ZTT0NLIGRlcGVuZHMgb24pLCBhbmQgYEVWRU5URkRgICh3aGljaCBib3RoIGRlcGVuZCBvbikuIEl0J3Mgd29ydGggZGlnZ2luZyBhIGJpdCBpbnRvIHRoZSBgVlNPQ0tFVFNgIGNvbmZpZyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIGl0cyBpbXBsaWNhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDg3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQwLjcwMjEyMjIwNVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY2NDQ1ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFZTT0NLRVRTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC92bXdfdnNvY2svS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdm13X3Zzb2NrL0tjb25maWctNS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWc6Njpjb25maWcgVlNPQ0tFVFNcXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiVmlydHVhbCBTb2NrZXQgcHJvdG9jb2xcXFwiXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctMTgtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjE5OmNvbmZpZyBWU09DS0VUU19ESUFHXFxubmV0L3Ztd192c29jay9LY29uZmlnLTIwLVxcdHRyaXN0YXRlIFxcXCJWaXJ0dWFsIFNvY2tldHMgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctMjgtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjI5OmNvbmZpZyBWU09DS0VUU19MT09QQkFDS1xcbm5ldC92bXdfdnNvY2svS2NvbmZpZy0zMC1cXHR0cmlzdGF0ZSBcXFwiVmlydHVhbCBTb2NrZXRzIGxvb3BiYWNrIHRyYW5zcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6NDAuNzg4NzcxNDQ0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4ODI5NDc4MDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIE15IEFzc3VtcHRpb25zKipcblxuQWxyaWdodCwgc28gSSdtIHByZXR0eSBzdXJlIGBWU09DS0VUU2AgaXMgdGhlIHJpZ2h0IGRpcmVjdGlvbiBoZXJlLiBIb3dldmVyLCBnaXZlbiBteSBleHBlcmllbmNlLCBJJ3ZlIGxlYXJuZWQgdG8gYWx3YXlzIGRvdWJsZS1jaGVjayB0aGUgb2J2aW91cyBhc3N1bXB0aW9ucy4gSnVzdCBiZWNhdXNlIHNvbWV0aGluZyAqc2hvdWxkKiBiZSBkb2Vzbid0IG1lYW4gaXQgKmlzKi4gVGltZSB0byBjb25maXJtIHRoYXQgYEVWRU5URkRgIGlzIGFjdHVhbGx5IGVuYWJsZWQuIEknZCB0eXBpY2FsbHkgZXhwZWN0IGl0IHRvIGJlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgZXNwZWNpYWxseSB3aGVuIGRlYnVnZ2luZy4gVGhpcyBjb25maXJtYXRpb24gY291bGQgc2F2ZSBtZSBmcm9tIGNoYXNpbmcgYSByZWQgaGVycmluZyBsYXRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYyOTcsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzo0NC42NzE3MjE1OTJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjE1ODQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBFVkVOVEZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluaXQvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbml0L0tjb25maWc9MTg3OD1jb25maWcgVElNRVJGRFxcbi0tXFxuaW5pdC9LY29uZmlnLTE4ODYtXFxuaW5pdC9LY29uZmlnOjE4ODc6Y29uZmlnIEVWRU5URkRcXG5pbml0L0tjb25maWctMTg4OC1cXHRib29sIFxcXCJFbmFibGUgZXZlbnRmZCgpIHN5c3RlbSBjYWxsXFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6NDQuNzE2OTQyMjE2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzNDkzNzUxOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSBmYW1pbGlhciB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uOlxuXG4qKktlcm5lbCBDb25maWd1cmF0aW9uIERpZ3Jlc3Npb25zKipcblxuQWxyaWdodCwgc28gYEVWRU5URkRgIGlzIGRlZmluaXRlbHkgYSBjb3JlIGZlYXR1cmUgYW5kIHBhcnQgb2YgdGhlIGBpbml0L0tjb25maWdgIGZpbGUsIHdoaWNoIGlzIGV4YWN0bHkgd2hlcmUgSSdkIGV4cGVjdCBpdCB0byBiZS4gTm93LCBsZXQncyBzZWUsIHdoYXQgd2FzIHRoYXQgb3RoZXIgY29uZmlnIHN5bWJvbC4uLiBBaCwgeWVzLCBgVklSVElPX1ZTT0NLRVRTX0NPTU1PTmAuIEkgcmVtZW1iZXIgdGhhdCdzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGBWSE9TVF9WU09DS2AgbW9kdWxlLiBJdCdzIHNlbGVjdGVkIHdoZW4gYFZIT1NUX1ZTT0NLYCBpcyBhY3RpdmF0ZWQsIHdoaWNoIG1ha2VzIHNlbnNlIGJlY2F1c2UgaXQgcHJvdmlkZXMgdGhlIHVuZGVybHlpbmcsIGNvbW1vbiBwaWVjZXMgbmVjZXNzYXJ5IGZvciB0aGUgdmhvc3QtYmFzZWQgdmlydGlvLXZzb2NrIGltcGxlbWVudGF0aW9uLiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBkZXBlbmRlbmN5IHdoZW4gSSdtIHdvcmtpbmcgd2l0aCB0aGUgVlNPQ0sgc3RhY2suIE1ha2VzIHNlbnNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjU0MywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQ4LjA2NjMxOTc3OVoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU1NDAyMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Ztd192c29jay9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC92bXdfdnNvY2svS2NvbmZpZz01Mz1jb25maWcgVklSVElPX1ZTT0NLRVRTXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNjUtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjY2OmNvbmZpZyBWSVJUSU9fVlNPQ0tFVFNfQ09NTU9OXFxubmV0L3Ztd192c29jay9LY29uZmlnLTY3LVxcdHRyaXN0YXRlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQ4LjExMTg2NTI4M1oiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTI4MTA2NDA0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFZob3N0IFN1YnN5c3RlbSBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IGEgcGF0Y2ggaGVyZSBhZmZlY3RpbmcgdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGB2aG9zdC1uZXRgIGFuZCBgdmhvc3QtdnNvY2tgLiBJIHNlZSB0aGF0IHNpbmNlIHRoZXNlIGFyZSB0aGUgc2VsZWN0ZWQgY29tcG9uZW50cywgSSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGVpciBzZWxlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBwYXRjaCByZXF1aXJlcyB0aGF0IHRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZTT0NLRVRTYCwgYW5kIGBFVkVOVEZEYC4gSSBhbHNvIHNlZSB0aGF0IGBWSE9TVF9ORVRgIGltcGxpY2l0bHkgcmVsaWVzIG9uIGBORVRgLCB3aGljaCBpcyBzdGFuZGFyZCwgYW5kIHRoYXQgYFZIT1NUX1ZTT0NLYCBkZXBlbmRzIG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC5cblxuTm93LCBkaWdnaW5nIGludG8gdGhlIGNoYW5nZXMsIGl0IGxvb2tzIGxpa2UgdGhlcmUncyBhIGJ1ZyBmaXggaW4gYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCB3aGVyZSBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCB3YXMgYmVpbmcgY2FsbGVkIGluYXBwcm9wcmlhdGVseSB3aGVuIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIHdhc24ndCBzZXQuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIHRvIGNvcnJlY3RseSBjbGVhciB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRlIHZpcnRxdWV1ZSBhY2Nlc3MuIFRoZXJlIGlzIGFsc28gYSByZXR1cm4gdmFsdWUgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBUaGVzZSBhcmUgZGVmaW5pdGVseSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0aW5nIHRoZSB2aG9zdCBzdWJzeXN0ZW0uIFRoZSBjb2RlIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gYC9kZXYvdmhvc3QtbmV0YCBhbmQgYC9kZXYvdmhvc3QtdnNvY2tgLCB3aGljaCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBmdXp6ZWQgdGhvcm91Z2hseS5cblxuTG9va2luZyBhdCB0aGUgY29kZSBsb2NhdGlvbnMgZm9yIHRoZSBrZXkgZnVuY3Rpb25zLCBJIHNlZSB0aGF0IEknbGwgYmUgaW50ZXJlc3RlZCBpbiBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLCBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgLCBgdnFfbWV0YV9wcmVmZXRjaGAsIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCByZXNpZGVzIGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AgcmVzaWRlcyBpbiBgZHJpdmVycy92aG9zdC92c29jay5jYCwgc28gSSd2ZSBnb3QgdGhlIGNvcnJlY3QgbG9jYXRpb24uXG5cblRoZSBwYXRjaCBtb2RpZmllcyBgZHJpdmVycy92aG9zdC92aG9zdC5jYCwgYGRyaXZlcnMvdmhvc3QvbmV0LmNgLCBhbmQgYGRyaXZlcnMvdmhvc3QvdnNvY2suY2AuIFRoZSBjaGFuZ2VzIGFyZSB1bmRvdWJ0ZWRseSBmdW5jdGlvbmFsIGFuZCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UuIEknbSBzYXRpc2ZpZWQgdGhhdCB0aGlzIGlzIGEgd2VsbC1zY29wZWQgY2hhbmdlLlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY4OTYsIk91dHB1dFRva2VucyI6MjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjM5MjkzMTc0OFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc0NzQ3NDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJWSE9TVF9ORVRcIixcbiAgICBcIlZIT1NUX1ZTT0NLXCIsXG4gICAgXCJWU09DS0VUU1wiLFxuICAgIFwiRVZFTlRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZob3N0X25ldF9pb2N0bFwiLFxuICAgIFwidmhvc3RfdnNvY2tfZGV2X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJcIixcbiAgICBcInZob3N0X2luaXRfZGV2aWNlX2lvdGxiXCIsXG4gICAgXCJ2cV9tZXRhX3ByZWZldGNoXCIsXG4gICAgXCJ2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzXCIsXG4gICAgXCJ2aG9zdF92c29ja19zZXRfZmVhdHVyZXNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgdmhvc3Qgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgZml4aW5nIElPVExCIGNsZWFyaW5nIGxvZ2ljIHdoZW4gVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNIGlzIG5vdCBzZXQgaW4gdmhvc3QtbmV0IGFuZCB2aG9zdC12c29jay4gSXQgYWxzbyBmaXhlcyBhIHJldHVybiB2YWx1ZSBidWcgaW4gdGhlIGZlYXR1cmUgc2V0dGluZyBmdW5jdGlvbnMuIFRoZSBtb2RpZmllZCBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9kZXYvdmhvc3QtbmV0IGFuZCAvZGV2L3Zob3N0LXZzb2NrLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlZIT1NUX05FVFwiLFxuICAgIFwiVkhPU1RfVlNPQ0tcIixcbiAgICBcIlZTT0NLRVRTXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidmhvc3RfbmV0X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgICBcInZob3N0X2NsZWFyX2RldmljZV9pb3RsYlwiLFxuICAgIFwidmhvc3RfaW5pdF9kZXZpY2VfaW90bGJcIixcbiAgICBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgICBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgICBcInZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjQ2NzY4NDI3NVoiLCJTZXEiOjI5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAyNTQ5MDUyOTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzo1OS40NjgxMzc3MTVaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NTAyNTQ0NDc5NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHJlc3NlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSB2aG9zdCBkZXZpY2UgSU9UTEIgYW5kIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgKGB2cS1cXHUwMDNlZGVzY2AsIGB2cS1cXHUwMDNlYXZhaWxgLCBgdnEtXFx1MDAzZXVzZWRgKS4gSXQgZW5zdXJlcyB0aGF0IHdoZW4gdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgaXMgY2xlYXJlZCwgdGhlIElPVExCIGlzIHByb3Blcmx5IGZyZWVkIGFuZCB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgaW52YWxpZGF0ZWQgKHNldCB0byBOVUxMKS4gSXQgYWxzbyBhZGRzIGEgY2hlY2sgaW4gYHZxX21ldGFfcHJlZmV0Y2hgIHRvIHByZXZlbnQgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiB0aGUgYWNjZXNzIHBvaW50ZXJzIGFyZSBub3Qgc2V0LiBUaGVzZSBjaGFuZ2VzIGZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXRpZXMsIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgY2F1c2VkIGJ5IHN0YWxlIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gbmV3IHN0cnVjdHVyZXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBjb3BpZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgaXMgdGhlcmUgYW55IGxvZ2ljIHRoYXQgZXhwb3NlcyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFN0YW5kYXJkIEtBU0FOICh3aGljaCBkZXRlY3RzIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzKSBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcgKHdoaWNoIGNhdGNoZXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcykgYXJlIGZ1bGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZSBidWdzIHRoaXMgcGF0Y2ggYWltcyB0byBmaXguIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuaW5kZXggNzdiNTlmNDliZGRiMy4uNjQ2NzFjZjc3YTM1ZSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmNcbisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcbkBAIC0xNjczLDYgKzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbiBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcbiB7XG4gXHRzaXplX3Qgdmhvc3RfaGxlbiwgc29ja19obGVuLCBoZHJfbGVuO1xuK1x0aW50IHJldCA9IC1FRkFVTFQ7XG4gXHRpbnQgaTtcbiBcbiBcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XG5AQCAtMTcwMSw4ICsxNzAyLDExIEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4gXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4tXHRcdGlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldikpXG4rXHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbitcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9IGVsc2Uge1xuK1x0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2bi1cdTAwM2VkZXYpO1xuIFx0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVkhPU1RfTkVUX1ZRX01BWDsgKytpKSB7XG5AQCAtMTcxOCw3ICsxNzIyLDcgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4gXG4gb3V0X3VubG9jazpcbiBcdG11dGV4X3VubG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcbmluZGV4IDRjNTI1YjNlMTZlYWQuLjlmNzQ1MzdiMWMxYzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuQEAgLTM0NCw2ICszNDQsMTcgQEAgc3RhdGljIHZvaWQgX192aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIFx0XHR2cS1cdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcbiB9XG4gXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgdmlydHF1ZXVlIG11dGV4LiAqL1xuK3N0YXRpYyB2b2lkIHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuK3tcbitcdHZxLVx1MDAzZWRlc2MgPSBOVUxMO1xuK1x0dnEtXHUwMDNlYXZhaWwgPSBOVUxMO1xuK1x0dnEtXHUwMDNldXNlZCA9IE5VTEw7XG4rXHR2cS1cdTAwM2Vsb2dfdXNlZCA9IGZhbHNlO1xuK1x0dnEtXHUwMDNlbG9nX2FkZHIgPSAtMXVsbDtcbitcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHZob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X2RldiAqZClcbiB7XG4gXHRpbnQgaTtcbkBAIC0xOTExLDYgKzE5MjIsOSBAQCBpbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbiB7XG4gXHR1bnNpZ25lZCBpbnQgbnVtID0gdnEtXHUwMDNlbnVtO1xuIFxuK1x0aWYgKCF2cS1cdTAwM2VkZXNjIHx8ICF2cS1cdTAwM2VhdmFpbCB8fCAhdnEtXHUwMDNldXNlZClcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHRpZiAoIXZxLVx1MDAzZWlvdGxiKVxuIFx0XHRyZXR1cm4gMTtcbiBcbkBAIC0yMjcwLDExICsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X3ZyaW5nX2lvY3RsKTtcbiBcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXG4rdm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbit7XG4rXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiO1xuK1x0aW50IGk7XG4rXG4rXHRpb3RsYiA9IGQtXHUwMDNlaW90bGI7XG4rXHRpZiAoIWlvdGxiKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKlxuK1x0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcbitcdCAqIHBlci1WUSB2aWV3IGFuZCBpdHMgY2FjaGVkIHJpbmcgYWNjZXNzIHVuZGVyIGl0cyBvd24gbXV0ZXguXG4rXHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4rXHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xuK1x0ICogZm9yIGl0cyBWUSBtdXRleC5cbitcdCAqL1xuK1x0ZC1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICsraSkge1xuK1x0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXHUwMDNldnFzW2ldO1xuK1xuK1x0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbitcdFx0dnEtXHUwMDNlaW90bGIgPSBOVUxMO1xuK1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4rXHR9XG4rXG4rXHR2aG9zdF9jbGVhcl9tc2coZCk7XG4rXHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcbitcdHdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKFx1MDAyNmQtXHUwMDNld2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcbitcbiBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKm5pb3RsYiwgKm9pb3RsYjtcbiBcdGludCBpO1xuIFxuK1x0aWYgKGQtXHUwMDNlaW90bGIpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0bmlvdGxiID0gaW90bGJfYWxsb2MoKTtcbiBcdGlmICghbmlvdGxiKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbkBAIC0yMjg3LDcgKzIzMzgsNyBAQCBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiBcbiBcdFx0bXV0ZXhfbG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHRcdHZxLVx1MDAzZWlvdGxiID0gbmlvdGxiO1xuLVx0XHRfX3Zob3N0X3ZxX21ldGFfcmVzZXQodnEpO1xuK1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5oIGIvZHJpdmVycy92aG9zdC92aG9zdC5oXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbkBAIC0yNzcsNiArMjc3LDcgQEAgc3NpemVfdCB2aG9zdF9jaHJfcmVhZF9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IGlvdl9pdGVyICp0byxcbiBcdFx0XHQgICAgaW50IG5vYmxvY2spO1xuIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LFxuIFx0XHRcdCAgICAgc3RydWN0IGlvdl9pdGVyICpmcm9tKTtcbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCk7XG4gXG4gdm9pZCB2aG9zdF9pb3RsYl9tYXBfZnJlZShzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvdnNvY2suYyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suY1xuaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvdnNvY2suY1xuKysrIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5AQCAtODU0LDYgKzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxuIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbitcdGludCByZXQgPSAtRUZBVUxUO1xuIFx0aW50IGk7XG4gXG4gXHRpZiAoZmVhdHVyZXMgXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcbkBAIC04NjUsOSArODY2LDEyIEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiBcdFx0Z290byBlcnI7XG4gXHR9XG4gXG4tXHRpZiAoKGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpIHtcbi1cdFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldikpXG4rXHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4rXHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4rXHRcdGlmIChyZXQpXG4gXHRcdFx0Z290byBlcnI7XG4rXHR9IGVsc2Uge1xuK1x0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbiBcdH1cbiBcbiBcdHZzb2NrLVx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcbkBAIC04ODMsNyArODg3LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFxuIGVycjpcbiBcdG11dGV4X3VubG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuLVx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgbG9uZyB2aG9zdF92c29ja19kZXZfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjQ2ODEzODU4NloiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NDI0NzM1MzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFZob3N0IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0b3VjaGVzIHNldmVyYWwgYHZob3N0YCBmaWxlczogYG5ldC5jYCwgYHZob3N0LmNgLCBgdmhvc3QuaGAsIGFuZCBgdnNvY2suY2AuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIHNlZW0gdG8gcmV2b2x2ZSBhcm91bmQgSU9UTEIgY2xlYXJpbmcgKGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWApIGFuZCBpbnZhbGlkYXRpbmcgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyB3aXRoaW4gYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKClgLiBUaGUgZnVuY3Rpb24gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgIG5vdyBjb3JyZWN0bHkgcmV0dXJucyAwIGlmIHRoZSBJT1RMQiBpcyBhbHJlYWR5IHNldC4gSXQncyBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWAgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBlbmFibGVkLiBBbmQgaXQncyBkb2luZyBzb21lIHBvaW50ZXIgY2xlYXJpbmcgd2l0aGluIHRoZSB2aXJ0cXVldWUgc3RydWN0cyB0byBhdm9pZCBhY2Nlc3MuXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgb2YgY291cnNlLiBXZSBoYXZlIGEgZmFpciBhbW91bnQgb2YgcG9pbnRlciBjbGVhcmluZyBoYXBwZW5pbmcsIHNwZWNpZmljYWxseSB3aXRoIHRoZSB2aXJ0cXVldWUncyBkZXNjcmlwdG9yIChgdnEtXHUwMDNlZGVzY2ApLCBhdmFpbGFibGUgcmluZyAoYHZxLVx1MDAzZWF2YWlsYCksIHVzZWQgcmluZyAoYHZxLVx1MDAzZXVzZWRgKSwgYW5kIHNvbWUgbG9nZ2luZy1yZWxhdGVkIGZpZWxkcy4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBpbnRyb2R1Y2UgaXNzdWVzIGlmIHRoZSBjbGVhcmVkIHBvaW50ZXJzIGFyZSB0aGVuIHJlYWQuIFRoZW4gaXQgbW9kaWZpZXMgYHZxX21ldGFfcHJlZmV0Y2goKWAsIHdoaWNoIHJldHVybnMgMCBpZiBhbnkgb2YgdGhvc2UgYXJlbid0IHZhbGlkLiBCdXQsIHRoYXQncyBleHBlY3RlZC5cblxuQWxzbywgaXQgbG9va3MgbGlrZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcygpYCB3ZXJlIHJldHVybmluZyBgLUVGQVVMVGAgdW5jb25kaXRpb25hbGx5LiBUaGF0J3MgYSBodWdlIHJlZCBmbGFnISBUaGUgcGF0Y2ggYXBwZWFycyB0byBiZSAqZml4aW5nKiB0aGF0IGFuZCBub3cgcmV0dXJucyBhIHZhcmlhYmxlIGByZXRgIHdoaWNoIGRlZmF1bHRzIHRvIGAtRUZBVUxUYCBidXQgd2hpY2ggY2FuIGJlIHVwZGF0ZWQgYnkgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgLiBXYWl0LCBkb2VzIHRoaXMgbWVhbiB0aGF0IHRob3NlIGZ1bmN0aW9ucyB3ZXJlICphbHdheXMqIHJldHVybmluZyBhbiBlcnJvciBldmVuIHdoZW4gdGhpbmdzIHdlbnQgY29ycmVjdGx5P1xuXG5MZXQgbWUgZG91YmxlLWNoZWNrIGBkcml2ZXJzL3Zob3N0L25ldC5jYC4gWWVzLCBpdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBgcmV0dXJuIC1FRkFVTFQ7YCB1bmNvbmRpdGlvbmFsbHkgYXQgdGhlIGVuZCBvZiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYC4gVGhhdCdzIGEgbWFqb3IgYnVnISBJdCBuZWVkcyB0byBiZSByZXZpZXdlZCB0byBlbnN1cmUgd2UncmUgbm90IGxvc2luZyBpbXBvcnRhbnQgZXJyb3IgaW5mb3JtYXRpb24uIFdlIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNvcnJlY3RseSBoYW5kbGVkIHRoZSBzdWNjZXNzIGFuZCBlcnJvciBjYXNlcy4gSXQgbG9va3MgbGlrZSBpdCB3YXMgcHJvYmFibHkgc3VwcG9zZWQgdG8gcmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgcmV0dXJuIGFueSBlcnJvciBjb2RlIGZyb20gZWFybGllciBpbiB0aGUgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkLCBpdCBhbHdheXMgcmV0dXJuZWQgYSBnZW5lcmljIGVycm9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDM4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTUwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MDcuODkyODc3Mjc2WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDQ2Njk2MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidmhvc3RfbmV0X3NldF9mZWF0dXJlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmM9MTY0Mz1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTY3Mi1cXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE2NzM6c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjc0LXtcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM9MTc0OT1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3Ny1cXHRcXHR2aXJ0aW9fZmVhdHVyZXNfZnJvbV91NjQoYWxsX2ZlYXR1cmVzLCBmZWF0dXJlcyk7XFxuZHJpdmVycy92aG9zdC9uZXQuYzoxNzc4OlxcdFxcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzc5LVxcdGNhc2UgVkhPU1RfR0VUX0ZFQVRVUkVTX0FSUkFZOlxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xODE5LVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTgyMDpcXHRcXHRyZXR1cm4gdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhuLCBhbGxfZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgyMS1cXHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDowNy45OTc1NTE2NzdaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzY0OTIxNzkzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24gd2l0aGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYC5cblxuKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKipcblxuQWxyaWdodCwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBncm9rIHdoYXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGRvZXMuIEZyb20gdGhlIG5hbWUgYWxvbmUsIEkgY2FuIGluZmVyIGl0IGxpa2VseSBkZWFscyB3aXRoIGNvbmZpZ3VyaW5nIG9yIGVuYWJsaW5nL2Rpc2FibGluZyBjZXJ0YWluIGZ1bmN0aW9uYWxpdGllcywgb3IgXCJmZWF0dXJlcyxcIiBzcGVjaWZpYyB0byB0aGUgdmlydHVhbCBob3N0IG5ldHdvcmsgaW50ZXJmYWNlLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQgcHJvYmFibHkgc2l0cyBpbiB0aGUgY29udHJvbCBwYXRoLCBjYWxsZWQgd2hlbiB0aGUgZ3Vlc3Qgb3BlcmF0aW5nIHN5c3RlbSBvciB0aGUgaHlwZXJ2aXNvciB3YW50cyB0byBtb2RpZnkgdGhlIGNhcGFiaWxpdGllcyB0aGUgdmlydHVhbCBuZXR3b3JrIGludGVyZmFjZSBwcmVzZW50cy4gVGhpcyBpcyBsaWtlbHkgYW4gaW1wb3J0YW50IHBvaW50IG9mIGNvbW11bmljYXRpb24uIEknbGwgbmVlZCB0byBzZWUgaG93IGl0IGhhbmRsZXMgZmVhdHVyZSBuZWdvdGlhdGlvbiDigJMgaWYgaXQgYWxsb3dzIHRoZSBndWVzdCB0byBwcm9wb3NlIGZlYXR1cmVzLCBvciBpZiB0aGUgaHlwZXJ2aXNvciBkaWN0YXRlcyB0aGVtLiBJJ20ga2VlbiB0byBzZWUgaWYgdGhlcmUgaXMgZXJyb3IgaGFuZGxpbmcuIEkgaG9wZSB0byBmaW5kIHVzZWZ1bCBjb21tZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIG9yIGJsb2NrIG9mIGNvZGUuIFRoaXMgaXMgbGlrZWx5IGEgY3JpdGljYWwgc2VjdGlvbiBvZiBjb2RlIGFzIGl0IHdpbGwgdG91Y2ggbmV0d29ya2luZy4gSG9wZWZ1bGx5LCBpdHMgd2VsbCB3cml0dGVuLCBhbmQgc2FmZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ1NywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjE0OjExLjY0Njc3MjkyMVoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjY1MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjczLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjczOlxcdHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbjE2NzQ6XFx0e1xcbjE2NzU6XFx0XFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcXG4xNjc2OlxcdFxcdGludCByZXQgPSAtRUZBVUxUO1xcbjE2Nzc6XFx0XFx0aW50IGk7XFxuMTY3ODpcXHRcXG4xNjc5OlxcdFxcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XFxuMTY4MDpcXHRcXHRcXHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XFxuMTY4MTpcXHRcXHRcXHQgIHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4YnVmKSA6XFxuMTY4MjpcXHRcXHRcXHQgIHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpO1xcbjE2ODM6XFx0XFxuMTY4NDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLFxcbjE2ODU6XFx0XFx0XFx0XFx0XFx0ICAgICBWSVJUSU9fTkVUX0ZfSE9TVF9VRFBfVFVOTkVMX0dTTykgfHxcXG4xNjg2OlxcdFxcdCAgICB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXFxuMTY4NzpcXHRcXHRcXHRcXHRcXHQgICAgIFZJUlRJT19ORVRfRl9HVUVTVF9VRFBfVFVOTkVMX0dTTykpXFxuMTY4ODpcXHRcXHRcXHRoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl92MV9oYXNoX3R1bm5lbCk7XFxuMTY4OTpcXHRcXG4xNjkwOlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZIT1NUX05FVF9GX1ZJUlRJT19ORVRfSERSKSkge1xcbjE2OTE6XFx0XFx0XFx0Lyogdmhvc3QgcHJvdmlkZXMgdm5ldF9oZHIgKi9cXG4xNjkyOlxcdFxcdFxcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xcbjE2OTM6XFx0XFx0XFx0c29ja19obGVuID0gMDtcXG4xNjk0OlxcdFxcdH0gZWxzZSB7XFxuMTY5NTpcXHRcXHRcXHQvKiBzb2NrZXQgcHJvdmlkZXMgdm5ldF9oZHIgKi9cXG4xNjk2OlxcdFxcdFxcdHZob3N0X2hsZW4gPSAwO1xcbjE2OTc6XFx0XFx0XFx0c29ja19obGVuID0gaGRyX2xlbjtcXG4xNjk4OlxcdFxcdH1cXG4xNjk5OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcwMDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFxcdTAwMjZcXHUwMDI2XFxuMTcwMTpcXHRcXHQgICAgIXZob3N0X2xvZ19hY2Nlc3Nfb2soXFx1MDAyNm4tXFx1MDAzZWRldikpXFxuMTcwMjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTcwMzpcXHRcXG4xNzA0OlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcXG4xNzA1OlxcdFxcdFxcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3MDY6XFx0XFx0XFx0aWYgKHJldClcXG4xNzA3OlxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xNzA4OlxcdFxcdH0gZWxzZSB7XFxuMTcwOTpcXHRcXHRcXHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldik7XFxuMTcxMDpcXHRcXHR9XFxuMTcxMTpcXHRcXG4xNzEyOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBWSE9TVF9ORVRfVlFfTUFYOyArK2kpIHtcXG4xNzEzOlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZXZxc1tpXS52cS5tdXRleCk7XFxuMTcxNDpcXHRcXHRcXHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVxcdTAwM2V2cXNbaV0udnEuYWNrZWRfZmVhdHVyZXNfYXJyYXksXFxuMTcxNTpcXHRcXHRcXHRcXHRcXHQgICAgIGZlYXR1cmVzKTtcXG4xNzE2OlxcdFxcdFxcdG4tXFx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcXG4xNzE3OlxcdFxcdFxcdG4tXFx1MDAzZXZxc1tpXS5zb2NrX2hsZW4gPSBzb2NrX2hsZW47XFxuMTcxODpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZXZxc1tpXS52cS5tdXRleCk7XFxuMTcxOTpcXHRcXHR9XFxuMTcyMDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcyMTpcXHRcXHRyZXR1cm4gMDtcXG4xNzIyOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDoxMS42NDY5NDExNDFaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTExNTQ2NjA1NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSB2aG9zdC1uZXQgUGF0Y2g6IEEgRGVlcCBEaXZlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHZob3N0LW5ldGAsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhlIGNoYW5nZSBpbiB0aGUgZXJyb3IgcmV0dXJuIGF0IGBvdXRfdW5sb2NrOmAuICBJdCdzIHN3aXRjaGluZyBmcm9tIGEgaGFyZGNvZGVkIGAtRUZBVUxUYCB0byBgcmV0YCwgYW5kIGByZXRgIGlzIGluaXRpYWxpemVkIHRvIGAtRUZBVUxUYCBhbmQgdXBkYXRlZCBieSBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAuICBUaGlzIHN1Z2dlc3RzIHRoZSBlcnJvciBoYW5kbGluZyBpcyBub3cgbW9yZSBudWFuY2VkLCBwb3NzaWJseSByZWZsZWN0aW5nIGZhaWx1cmVzIHdpdGhpbiB0aGUgSU9UTEIgaW5pdGlhbGl6YXRpb24uIFRoYXQgY2hhbmdlIGFsb25lIGlzIGludGVyZXN0aW5nLCBidXQgaXQncyB0aGUgYWRkaXRpb24gb2YgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7YCB0aGF0J3MgdGhlIGhlYXJ0IG9mIHRoaXMgcGF0Y2gsIGVzcGVjaWFsbHkgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBzZXQuXG5cbldoYXQgdGhpcyBpcyBkb2luZyBpcyBjbGVhbmluZyB1cCB0aGUgSU9UTEIgYW5kLCBjcnVjaWFsbHksIGludmFsaWRhdGluZyB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVyczogYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBhbmQgYHZxLVx1MDAzZXVzZWRgLiBUaGlzIGlzIGNsZWFybHkgYSBmaXggZm9yIGEgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWUsIGEgdnVsbmVyYWJpbGl0eSB0aGF0IHdvdWxkIGJlIHF1aXRlIG5hc3R5IGlmIGV4cGxvaXRlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0J3MgaGFuZGxpbmcgYSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIHNpdHVhdGlvbi5cblxuRGl2aW5nIGludG8gYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgY29uZmlybXMgdGhlIG1lbW9yeSBzYWZldHkgZm9jdXMuIEl0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIHZpcnRxdWV1ZXMsIGxvY2tzIHRoZWlyIG11dGV4ZXMsIGNsZWFycyB0aGUgYGlvdGxiYCBwb2ludGVyIGluIGVhY2ggdmlydHF1ZXVlIChgdnEtXHUwMDNlaW90bGIgPSBOVUxMO2ApLCBpbnZhbGlkYXRlcyBhY2Nlc3MgcG9pbnRlcnMgdmlhIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSlgLCB1bmxvY2tzIHRoZSBtdXRleCwgYW5kIGZpbmFsbHksIGZyZWVzIHRoZSBgaW90bGJgIG1lbW9yeS4gVGhlIGtleSBoZXJlIGlzIHRoZSBpbnZhbGlkYXRpb24gYW5kIHRoZSBmcmVlaW5nLiBJdCdzIGRlc2lnbmVkIHRvIHByZXZlbnQgZGFuZ2xpbmcgcG9pbnRlcnMgZnJvbSBjYXVzaW5nIGlzc3VlcyBhZnRlciB0aGUgSU9UTEIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gU28gaWYgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgY2xlYXJlZCB0aGlzIGZyZWVzIElPVExCIGFuZCBpbnZhbGlkYXRlcyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzLlxuXG5UaGlzIHJlYWxseSBpcyBhIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyBmaXgsIGFuZCB0aGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIHNpdHVhdGlvbiwgb3IgYW4gaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBLQVNBTiB3b3VsZCBkZWZpbml0ZWx5IGNhdGNoIHRoZXNlIGVycm9ycy4gSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkIHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIFRoZSBmb2N1cyBpcyBvbiAqY2xlYXJpbmcqIHBvaW50ZXJzIGFuZCAqZnJlZWluZyogbWVtb3J5LCBub3Qgb24gKmluaXRpYWxpemluZyogYW5kIHRoZW4gbGVha2luZyB1bmluaXRpYWxpemVkIGRhdGEuIEtNU0FOLCB3aGljaCBpcyByZWFsbHkgZ29vZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnksIGlzbid0IG5lZWRlZCBoZXJlLlxuXG5Ob3csIGJhY2sgdG8gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gSXQgYWxsb2NhdGVzIGEgbmV3IGBpb3RsYmAgdXNpbmcgYGlvdGxiX2FsbG9jKClgLiBJdCByZXR1cm5zIHplcm8gaWYgdGhlIGRldmljZSBhbHJlYWR5IGhhZCBhbiBJT1RMQiBzZXQuIFNvLCB0aGUgb2xkIGJlaGF2aW91ciB3b3VsZCBoYXZlIGp1c3QgYWxsb2NhdGVkIGFuZCBvdmVyd3JpdHRlbj8gVGhpcyBwYXRjaCBzZWVtcyB0byBiZSBhZGRyZXNzaW5nIHRob3NlIHNjZW5hcmlvcyB3aGVyZSB0aGUgSU9UTEIgd2Fzbid0IHByb3Blcmx5IGNsZWFyZWQgd2hlbiBpdCB3YXMgbm8gbG9uZ2VyIHJlcXVpcmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NjcwLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjIuODAxNjAzNzk0WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMTE3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L3Zob3N0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjI4MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjI4MDpcXHRcXG4yMjgxOlxcdFxcdGlmIChwb2xsc3RvcCBcXHUwMDI2XFx1MDAyNiB2cS1cXHUwMDNlaGFuZGxlX2tpY2spXFxuMjI4MjpcXHRcXHRcXHR2aG9zdF9kZXZfZmx1c2godnEtXFx1MDAzZXBvbGwuZGV2KTtcXG4yMjgzOlxcdFxcdHJldHVybiByO1xcbjIyODQ6XFx0fVxcbjIyODU6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xcbjIyODY6XFx0XFxuMjI4NzpcXHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXFxuMjI4ODpcXHR2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbjIyODk6XFx0e1xcbjIyOTA6XFx0XFx0c3RydWN0IHZob3N0X2lvdGxiICppb3RsYjtcXG4yMjkxOlxcdFxcdGludCBpO1xcbjIyOTI6XFx0XFxuMjI5MzpcXHRcXHRpb3RsYiA9IGQtXFx1MDAzZWlvdGxiO1xcbjIyOTQ6XFx0XFx0aWYgKCFpb3RsYilcXG4yMjk1OlxcdFxcdFxcdHJldHVybjtcXG4yMjk2OlxcdFxcbjIyOTc6XFx0XFx0LypcXG4yMjk4OlxcdFxcdCAqIERyb3AgdGhlIGRldmljZS13aWRlIHZpZXcgZmlyc3QuICBFYWNoIFZRIHRoZW4gZHJvcHMgaXRzXFxuMjI5OTpcXHRcXHQgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LlxcbjIzMDA6XFx0XFx0ICogS2VlcCB0aGUgb2xkIHRhYmxlIGFsaXZlIHVudGlsIGV2ZXJ5IFZRIGhhcyBjb21wbGV0ZWQgdGhpc1xcbjIzMDE6XFx0XFx0ICogaGFuZG9mZiwgc2luY2UgYSB3b3JrZXIgbWF5IHN0aWxsIGJlIHVzaW5nIGl0IHdoaWxlIHdhaXRpbmdcXG4yMzAyOlxcdFxcdCAqIGZvciBpdHMgVlEgbXV0ZXguXFxuMjMwMzpcXHRcXHQgKi9cXG4yMzA0OlxcdFxcdGQtXFx1MDAzZWlvdGxiID0gTlVMTDtcXG4yMzA1OlxcdFxcbjIzMDY6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGQtXFx1MDAzZW52cXM7ICsraSkge1xcbjIzMDc6XFx0XFx0XFx0c3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLVxcdTAwM2V2cXNbaV07XFxuMjMwODpcXHRcXG4yMzA5OlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuMjMxMDpcXHRcXHRcXHR2cS1cXHUwMDNlaW90bGIgPSBOVUxMO1xcbjIzMTE6XFx0XFx0XFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xcbjIzMTI6XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbjIzMTM6XFx0XFx0fVxcbjIzMTQ6XFx0XFxuMjMxNTpcXHRcXHR2aG9zdF9jbGVhcl9tc2coZCk7XFxuMjMxNjpcXHRcXHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcXG4yMzE3OlxcdFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKFxcdTAwMjZkLVxcdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xcbjIzMTg6XFx0fVxcbjIzMTk6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcXG4yMzIwOlxcdFxcbjIzMjE6XFx0aW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuMjMyMjpcXHR7XFxuMjMyMzpcXHRcXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKm5pb3RsYiwgKm9pb3RsYjtcXG4yMzI0OlxcdFxcdGludCBpO1xcbjIzMjU6XFx0XFxuMjMyNjpcXHRcXHRpZiAoZC1cXHUwMDNlaW90bGIpXFxuMjMyNzpcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMzI4OlxcdFxcbjIzMjk6XFx0XFx0bmlvdGxiID0gaW90bGJfYWxsb2MoKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjIuODAxODE2NDQ0WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzNjMyMTEyODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgUG9zdC1QYXRjaCBTdGF0ZSoqXG5cbk9rYXksIHdhaXQgYSBtaW51dGUuLi4gSSdtIGxvb2tpbmcgYXQgdGhlIGZpbGUgKmFmdGVyKiB0aGUgcGF0Y2ggaGFzIGJlZW4gYXBwbGllZC4gVGhhdCdzIGNydWNpYWwgY29udGV4dC4gSSBuZWVkIHRvIGtlZXAgdGhhdCBmaXJtbHkgaW4gbWluZCBhcyBJIGludGVycHJldCB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgcHJlLXBhdGNoIHN0YXRlIGlzbid0IHJlbGV2YW50IGhlcmU7IEknbSBkZWFsaW5nIHdpdGggdGhlIHJlc3VsdHMuXG5cbkFscmlnaHQsIGxldCdzIHJlZm9jdXMuIEkgbmVlZCB0byBkaWcgaW50byB0aGUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBmdW5jdGlvbi4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGxpZXMsIGFuZCBpdCdzIGxpa2VseSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNoYW5nZXMgYW5kIHRoZWlyIGltcGFjdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggaXQsIGdpdmVuIHRoZSB1cGRhdGVkIGZpbGUncyBjdXJyZW50IHN0YXRlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIEkvTyB0cmFuc2xhdGlvbiBpcyBiZWluZyBoYW5kbGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQncyBnZXQgdG8gdGhlIGJvdHRvbSBvZiBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODk2MywiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjYuMTY1MDMxMTZaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk4MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMzIxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMzIxOlxcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbjIzMjI6XFx0e1xcbjIzMjM6XFx0XFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XFxuMjMyNDpcXHRcXHRpbnQgaTtcXG4yMzI1OlxcdFxcbjIzMjY6XFx0XFx0aWYgKGQtXFx1MDAzZWlvdGxiKVxcbjIzMjc6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjMyODpcXHRcXG4yMzI5OlxcdFxcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XFxuMjMzMDpcXHRcXHRpZiAoIW5pb3RsYilcXG4yMzMxOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIzMzI6XFx0XFxuMjMzMzpcXHRcXHRvaW90bGIgPSBkLVxcdTAwM2Vpb3RsYjtcXG4yMzM0OlxcdFxcdGQtXFx1MDAzZWlvdGxiID0gbmlvdGxiO1xcbjIzMzU6XFx0XFxuMjMzNjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZC1cXHUwMDNlbnZxczsgKytpKSB7XFxuMjMzNzpcXHRcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXFx1MDAzZXZxc1tpXTtcXG4yMzM4OlxcdFxcbjIzMzk6XFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4yMzQwOlxcdFxcdFxcdHZxLVxcdTAwM2Vpb3RsYiA9IG5pb3RsYjtcXG4yMzQxOlxcdFxcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4yMzQyOlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4yMzQzOlxcdFxcdH1cXG4yMzQ0OlxcdFxcbjIzNDU6XFx0XFx0dmhvc3RfaW90bGJfZnJlZShvaW90bGIpO1xcbjIzNDY6XFx0XFxuMjM0NzpcXHRcXHRyZXR1cm4gMDtcXG4yMzQ4OlxcdH1cXG4yMzQ5OlxcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcXG4yMzUwOlxcdFxcbjIzNTE6XFx0LyogQ2FsbGVyIG11c3QgaGF2ZSBkZXZpY2UgbXV0ZXggKi9cXG4yMzUyOlxcdGxvbmcgdmhvc3RfZGV2X2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ3ApXFxuMjM1MzpcXHR7XFxuMjM1NDpcXHRcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4yMzU1OlxcdFxcdHU2NCBwO1xcbjIzNTY6XFx0XFx0bG9uZyByO1xcbjIzNTc6XFx0XFx0aW50IGksIGZkO1xcbjIzNTg6XFx0XFxuMjM1OTpcXHRcXHQvKiBJZiB5b3UgYXJlIG5vdCB0aGUgb3duZXIsIHlvdSBjYW4gYmVjb21lIG9uZSAqL1xcbjIzNjA6XFx0XFx0aWYgKGlvY3RsID09IFZIT1NUX1NFVF9PV05FUikge1xcbjIzNjE6XFx0XFx0XFx0ciA9IHZob3N0X2Rldl9zZXRfb3duZXIoZCk7XFxuMjM2MjpcXHRcXHRcXHRnb3RvIGRvbmU7XFxuMjM2MzpcXHRcXHR9XFxuMjM2NDpcXHRcXG4yMzY1OlxcdCNpZmRlZiBDT05GSUdfVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxcbjIzNjY6XFx0XFx0aWYgKGlvY3RsID09IFZIT1NUX1NFVF9GT1JLX0ZST01fT1dORVIpIHtcXG4yMzY3OlxcdFxcdFxcdC8qIE9ubHkgYWxsb3cgbW9kaWZpY2F0aW9uIGJlZm9yZSBvd25lciBpcyBzZXQgKi9cXG4yMzY4OlxcdFxcdFxcdGlmICh2aG9zdF9kZXZfaGFzX293bmVyKGQpKSB7XFxuMjM2OTpcXHRcXHRcXHRcXHRyID0gLUVCVVNZO1xcbjIzNzA6XFx0XFx0XFx0XFx0Z290byBkb25lO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDoyNi4xNjUyNDI4WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEzMTc1NDIyMTYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSU9UTEIgTGlmZWN5Y2xlIGFuZCBWaXJ0cXVldWUgQWNjZXNzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBCZWZvcmUgdGhpcyBwYXRjaCwgdGhlIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAgZnVuY3Rpb24gd2FzIGZsYXdlZC4gSXQgd2Fzbid0IGNoZWNraW5nIGlmIGFuIElPVExCIGFscmVhZHkgZXhpc3RlZCwgbGVhZGluZyB0byBhIHBvdGVudGlhbCBmb3IgY2xlYXJpbmcgdGhlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgdHJhbnNsYXRpb25zLCBhbmQgcG90ZW50aWFsbHkgbGVhdmluZyB0aGUgc3lzdGVtIGluIGEgY29uZnVzZWQgc3RhdGUgaWYgdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgd2FzIHRvZ2dsZWQuIFRoaXMgcGF0Y2ggYWRkcmVzc2VzIHRoYXQgYnkgaW5pdGlhbGl6aW5nIHRoZSBJT1RMQiBvbmx5IHdoZW4gdGhlIGZlYXR1cmUgaXMgKnNldCogYW5kIGNsZWFyaW5nIGl0IHdoZW4gdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLiAgVGhpcyBzZWVtcyB0byBmaXggYSBzY2VuYXJpbyB3aGVyZSB0aGUgSU9UTEIgY291bGQgYmUgdW5leHBlY3RlZGx5IGNsZWFyZWQsIHBlcmhhcHMgcmVzdWx0aW5nIGluIG1lbW9yeSBjb3JydXB0aW9uIG9yIHVzZS1hZnRlci1mcmVlLCBvciBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MuIEhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgYSBsaWZlY3ljbGUgbWFuYWdlbWVudCBpc3N1ZSwgcmF0aGVyIHRoYW4gYSBkaXJlY3QgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtBU0FOIGlzIHBlcmZlY3RseSBzdWl0YWJsZSBmb3IgY2F0Y2hpbmcgYW55IHJlc3VsdGluZyBhY2Nlc3MgZXJyb3JzIGR1ZSB0byBzdGFsZSBwb2ludGVycy4gV2UgZG9uJ3QgbmVlZCBLTVNBTiBoZXJlLlxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhlIHBhdGNoJ3MgY2hhbmdlcywgc3RhcnRpbmcgd2l0aCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgLiAgT2theSwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgbnVsbHMgb3V0IHBvaW50ZXJzIChgdnEtXHUwMDNlZGVzY2AsIGB2cS1cdTAwM2VhdmFpbGAsIGB2cS1cdTAwM2V1c2VkYCkgYW5kIHJlc2V0cyBzdGF0ZSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlJ2QgZXhwZWN0IGluIHRoaXMgc2NlbmFyaW8uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlcyB0aGVyZS5cblxuTmV4dCB1cCwgYHZxX21ldGFfcHJlZmV0Y2hgLiBBaCwgZ29vZC4gVGhlIGFkZGVkIGNoZWNrIG5vdyBwcmV2ZW50cyBwcmVmZXRjaGluZyBpZiBhbnkgb2YgdGhvc2Ugdml0YWwgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBUaGlzIGlzIGEgY3J1Y2lhbCBkZWZlbnNlIGFnYWluc3QgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIHdoaWNoIGFyZSBlYXN5IHRvIGNhdGNoIHdpdGggc3RhbmRhcmQgdGVzdGluZyB0aGF0IEtBU0FOIHNob3VsZCBlYXNpbHkgZGV0ZWN0LlxuXG5GaW5hbGx5LCB0aGUgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBUaGlzIG9uZSBpcyBtb3JlIHN1YnRsZS4gIEkgc2VlIGEgYnVnIGluIHRoZSBjb2RlIHRoYXQgdGhlIHBhdGNoIGZpeGVzLiAgSW5pdGlhbGx5LCBpdCBpbml0aWFsaXplcyB0aGUgYHJldGAgdmFyaWFibGUgdG8gYC1FRkFVTFRgLiBUaGUgbG9naWMgaXMgc3VjaCB0aGF0IGlmIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGlzIHNldCwgYW5kIHRoZSBJT1RMQiBpbml0aWFsaXphdGlvbiBmYWlscywgaXQgZ29lcyB0byBgb3V0X3VubG9ja2AgYW5kIHJldHVybnMgdGhlIGVycm9yIGNvZGUsIHdoaWNoIGlzIGNvcnJlY3QuIElmIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkcywgYHJldGAgaXMgbm90IHVwZGF0ZWQsIGJ1dCBzaG91bGQgYmUgemVyby4gSWYgdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLCBpdCdzIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBJT1RMQiwgd2hpY2ggbWF5IGhhdmUgc3VjY2VlZGVkLCBidXQgdGhlIGByZXRgIHJlbWFpbnMgYC1FRkFVTFRgLiBUaGUgcGF0Y2ggbm93IGNvcnJlY3RseSBzZXRzIGByZXRgIHRvIHplcm8gYWZ0ZXIgY2FsbGluZyBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC4gIFRoaXMgbG9va3MgbGlrZSBhIHNpbXBsZSBidXQgY3JpdGljYWwgZXJyb3IgaW4gdGhlIG9yaWdpbmFsIGNvZGUncyBlcnJvciBoYW5kbGluZyBhbmQgcmV0dXJuIHZhbHVlIGxvZ2ljLCBlbnN1cmluZyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG1lYW5pbmdmdWwgZXJyb3IgY29kZSBiYXNlZCBvbiB0aGUgSU9UTEIgb3BlcmF0aW9uJ3Mgc3VjY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTk2MiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExOTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDozOS4zNDA2NjczMjJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc2NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTY5OSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTY5OTpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MDA6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfRl9MT0dfQUxMKSBcXHUwMDI2XFx1MDAyNlxcbjE3MDE6XFx0XFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFxcdTAwMjZuLVxcdTAwM2VkZXYpKVxcbjE3MDI6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjE3MDM6XFx0XFxuMTcwNDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XFxuMTcwNTpcXHRcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4xNzA2OlxcdFxcdFxcdGlmIChyZXQpXFxuMTcwNzpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTcwODpcXHRcXHR9IGVsc2Uge1xcbjE3MDk6XFx0XFx0XFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3MTA6XFx0XFx0fVxcbjE3MTE6XFx0XFxuMTcxMjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVkhPU1RfTkVUX1ZRX01BWDsgKytpKSB7XFxuMTcxMzpcXHRcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZuLVxcdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xcbjE3MTQ6XFx0XFx0XFx0dmlydGlvX2ZlYXR1cmVzX2NvcHkobi1cXHUwMDNldnFzW2ldLnZxLmFja2VkX2ZlYXR1cmVzX2FycmF5LFxcbjE3MTU6XFx0XFx0XFx0XFx0XFx0ICAgICBmZWF0dXJlcyk7XFxuMTcxNjpcXHRcXHRcXHRuLVxcdTAwM2V2cXNbaV0udmhvc3RfaGxlbiA9IHZob3N0X2hsZW47XFxuMTcxNzpcXHRcXHRcXHRuLVxcdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xcbjE3MTg6XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xcbjE3MTk6XFx0XFx0fVxcbjE3MjA6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MjE6XFx0XFx0cmV0dXJuIDA7XFxuMTcyMjpcXHRcXG4xNzIzOlxcdG91dF91bmxvY2s6XFxuMTcyNDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcyNTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE3MjY6XFx0fVxcbjE3Mjc6XFx0XFxuMTcyODpcXHRzdGF0aWMgbG9uZyB2aG9zdF9uZXRfc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjE0OjM5LjM0MDk0NTk3MloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDM4MTYxNjYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIHZob3N0IG5ldC92c29jayBGZWF0dXJlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGF0IGRpZmYgc3BlY2lmaWNhbGx5LCBpdCdzIGFib3V0IGEgbW9yZSBwcmVjaXNlIGVycm9yIGNvZGUgcmV0dXJuIGluIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkgc2VlLCBpdCByZXBsYWNlcyB0aGUgaGFyZGNvZGVkIGAtRUZBVUxUYCB3aXRoIGByZXRgLCB3aGljaCByZWZsZWN0cyB0aGUgYWN0dWFsIGVycm9yIGZyb20gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gTXVjaCBiZXR0ZXIhXG5cblRoZSBwYXRjaCBpdHNlbGYgaXMgbXVsdGlmYWNldGVkLiBJdCdzIG5vdCBqdXN0IGEgc2luZ2xlIGZpeDsgaXQgdG91Y2hlcyBvbiBhIGZldyBrZXkgYXJlYXMgd2l0aGluIHRoZSB2aG9zdCBpbmZyYXN0cnVjdHVyZS4gV2UncmUgdGFsa2luZyBhYm91dCBjbGVhcmluZyB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgVlEgYWNjZXNzIHdoZW4gYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgZGlzYWJsZWQuIENsZXZlci4gQW5kIHRoZXJlJ3MgYWxzbyBhIGNoZWNrIHRvIHByZXZlbnQgcHJlZmV0Y2hpbmcgd2hlbiB0aG9zZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBHb29kIGRlZmVuc2l2ZSBwcm9ncmFtbWluZy4gRmluYWxseSwgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBpcyBub3cgYSBuby1vcCBpZiBpdCdzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHdoaWNoIHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBvcHRpbWl6YXRpb24uXG5cblNvLCB0aGUgY3J1eCBvZiBpdCBpcyBhZGRyZXNzaW5nIHBvdGVudGlhbCBpc3N1ZXMgcmVsYXRlZCB0byBwb2ludGVyIGxpZmVjeWNsZSwgbWVtb3J5IGxlYWtzLCBhbmQgcHJldmVudGluZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4gSSdtIGZvY3VzaW5nIG9uIHRob3NlIHBvaW50ZXIncyBsaWZlY3ljbGU6IGB2cS1cdTAwM2VkZXNjYCwgYHZxLVx1MDAzZWF2YWlsYCwgYW5kIGB2cS1cdTAwM2V1c2VkYC4gSXQncyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhhdCB0aG9zZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBwcm9wZXJseSBtYW5hZ2VkLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGF0IGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgZ2V0cyB0b2dnbGVkLiBUaGUgSU9UTEIgbmVlZHMgdG8gYmUgZnJlZWQsIGFuZCB0aGUgcG9pbnRlcnMgaGF2ZSB0byBiZSBudWxsaWZpZWQuIE1ha2VzIHNlbnNlIHRvIGF2b2lkIGRhbmdsaW5nIHBvaW50ZXJzIGFuZCB0aGUgaGVhZGFjaGVzIHRoZXkgYnJpbmcuXG5cbk15IGFzc2Vzc21lbnQ/IFRoZXJlIGFyZSBubyBuZXcgYWxsb2NhdGlvbnMgb3IgY29waWVzIG9mIHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgYXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgbGVha3Mgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBUaGUgY2hhbmdlcyBoZXJlIGFyZSBhYm91dCBoYW5kbGluZyBwb2ludGVyIHN0YXRlIGNvcnJlY3RseSBhbmQgZ3VhcmRpbmcgYWdhaW5zdCBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZyBhbmQgS0FTQU4g4oCTIHRoZSBrZXJuZWwgYWRkcmVzcyBzYW5pdGl6ZXIg4oCTIHNob3VsZCBiZSBwZXJmZWN0bHkgYWRlcXVhdGUgdG8gY2F0Y2ggYW55IGJ1Z3MgaW4gdGhpcyBzcGFjZSwgZXNwZWNpYWxseSB0aG9zZSByZWxhdGVkIHRvIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLiBBIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBsaWtlbHkgdW5uZWNlc3NhcnkuIFRoYXQgbGV2ZWwgb2YgZGVkaWNhdGVkIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkIGhlcmUuIEtBU0FOIGlzIHRoZSByaWdodCB0b29sIGZvciB0aGVzZSBwYXJ0aWN1bGFyIGlzc3Vlcy4gV2UncmUgZ29vZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyNTQsIk91dHB1dFRva2VucyI6MjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6NDkuNzIyNTY2MTQ3WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgwNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgdmhvc3QgZGV2aWNlIElPVExCIGFuZCB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIChgdnEtXFx1MDAzZWRlc2NgLCBgdnEtXFx1MDAzZWF2YWlsYCwgYHZxLVxcdTAwM2V1c2VkYCkuIEl0IGVuc3VyZXMgdGhhdCB3aGVuIHRoZSBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGlzIGNsZWFyZWQsIHRoZSBJT1RMQiBpcyBwcm9wZXJseSBmcmVlZCBhbmQgdGhlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIGludmFsaWRhdGVkIChzZXQgdG8gTlVMTCkuIEl0IGFsc28gYWRkcyBhIGNoZWNrIGluIGB2cV9tZXRhX3ByZWZldGNoYCB0byBwcmV2ZW50IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgaWYgdGhlIGFjY2VzcyBwb2ludGVycyBhcmUgbm90IHNldC4gVGhlc2UgY2hhbmdlcyBmaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0aWVzLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGNhdXNlZCBieSBzdGFsZSBwb2ludGVycy4gVGhlcmUgYXJlIG5vIG5ldyBzdHJ1Y3R1cmVzIGJlaW5nIGFsbG9jYXRlZCBhbmQgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbiwgbm9yIGlzIHRoZXJlIGFueSBsb2dpYyB0aGF0IGV4cG9zZXMgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBTdGFuZGFyZCBLQVNBTiAod2hpY2ggZGV0ZWN0cyB1c2UtYWZ0ZXItZnJlZSBhbmQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcykgYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nICh3aGljaCBjYXRjaGVzIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMpIGFyZSBmdWxseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGUgYnVncyB0aGlzIHBhdGNoIGFpbXMgdG8gZml4LiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVxcdTAwM2VkZXNjYCwgYHZxLVxcdTAwM2VhdmFpbGAsIGB2cS1cXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow69p46[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-18 04:30:47 +0000 UTC FinishedAt: 2026-08-18 05:14:50 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "kvm-x86", "tree_url": "https://github.com/kvm-x86/linux.git", "commit_hash": "1b731e5ded480bd1e5546aed35584238661ce72e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "VHOST_NET", "VHOST_VSOCK", "VSOCKETS", "EVENTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "kvm-x86", "tree_url": "https://github.com/kvm-x86/linux.git", "commit_hash": "1b731e5ded480bd1e5546aed35584238661ce72e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "VHOST_NET", "VHOST_VSOCK", "VSOCKETS", "EVENTFD" ], "series_id": "0108ef0a-73bd-4f6d-b806-48ec9c5c5f84" }, "track": "KASAN", "fuzz": { "focus": [ "kvm", "net" ], "focus_symbols": [ "vhost_net_ioctl", "vhost_vsock_dev_ioctl", "vhost_clear_device_iotlb", "vhost_init_device_iotlb", "vq_meta_prefetch", "vhost_net_set_features", "vhost_vsock_set_features" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1ZIT1NUX05FVCYjMzQ7LAogICAgJiMzNDtWSE9TVF9WU09DSyYjMzQ7LAogICAgJiMzNDtWU09DS0VUUyYjMzQ7LAogICAgJiMzNDtFVkVOVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dmhvc3RfbmV0X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X3Zzb2NrX2Rldl9pb2N0bCYjMzQ7LAogICAgJiMzNDt2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGImIzM0OywKICAgICYjMzQ7dmhvc3RfaW5pdF9kZXZpY2VfaW90bGImIzM0OywKICAgICYjMzQ7dnFfbWV0YV9wcmVmZXRjaCYjMzQ7LAogICAgJiMzNDt2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzJiMzNDssCiAgICAmIzM0O3Zob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHJlc3NlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSB2aG9zdCBkZXZpY2UgSU9UTEIgYW5kIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgKGB2cS1cdTAwM2VkZXNjYCwgYHZxLVx1MDAzZWF2YWlsYCwgYHZxLVx1MDAzZXVzZWRgKS4gSXQgZW5zdXJlcyB0aGF0IHdoZW4gdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgaXMgY2xlYXJlZCwgdGhlIElPVExCIGlzIHByb3Blcmx5IGZyZWVkIGFuZCB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgaW52YWxpZGF0ZWQgKHNldCB0byBOVUxMKS4gSXQgYWxzbyBhZGRzIGEgY2hlY2sgaW4gYHZxX21ldGFfcHJlZmV0Y2hgIHRvIHByZXZlbnQgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiB0aGUgYWNjZXNzIHBvaW50ZXJzIGFyZSBub3Qgc2V0LiBUaGVzZSBjaGFuZ2VzIGZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXRpZXMsIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgY2F1c2VkIGJ5IHN0YWxlIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gbmV3IHN0cnVjdHVyZXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBjb3BpZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgaXMgdGhlcmUgYW55IGxvZ2ljIHRoYXQgZXhwb3NlcyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFN0YW5kYXJkIEtBU0FOICh3aGljaCBkZXRlY3RzIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzKSBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcgKHdoaWNoIGNhdGNoZXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcykgYXJlIGZ1bGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZSBidWdzIHRoaXMgcGF0Y2ggYWltcyB0byBmaXguIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDkyYTJhYThmNGUzNzYxNGJhMzExNzJlZmMyM2MzOWQ3MmNjOWY4MDZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuaW5kZXggNzdiNTlmNDliZGRiMy4uNjQ2NzFjZjc3YTM1ZSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcbkBAIC0xNjczLDYgJiM0MzsxNjczLDcgQEAgc3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXG4gc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4ge1xuIFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbiYjNDM7XHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcbkBAIC0xNzAxLDggJiM0MzsxNzAyLDExIEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4gXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4tXHRcdGlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldikpXG4mIzQzO1x0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4mIzQzO1x0XHRpZiAocmV0KVxuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbiBcdH1cbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG5AQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFxuIG91dF91bmxvY2s6XG4gXHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuLVx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jXG5AQCAtMzQ0LDYgJiM0MzszNDQsMTcgQEAgc3RhdGljIHZvaWQgX192aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIFx0XHR2cS1cdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcbiB9XG4gXG4mIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi9cbiYjNDM7c3RhdGljIHZvaWQgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4mIzQzO3tcbiYjNDM7XHR2cS1cdTAwM2VkZXNjID0gTlVMTDtcbiYjNDM7XHR2cS1cdTAwM2VhdmFpbCA9IE5VTEw7XG4mIzQzO1x0dnEtXHUwMDNldXNlZCA9IE5VTEw7XG4mIzQzO1x0dnEtXHUwMDNlbG9nX3VzZWQgPSBmYWxzZTtcbiYjNDM7XHR2cS1cdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xuJiM0MztcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdGludCBpO1xuQEAgLTE5MTEsNiAmIzQzOzE5MjIsOSBAQCBpbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbiB7XG4gXHR1bnNpZ25lZCBpbnQgbnVtID0gdnEtXHUwMDNlbnVtO1xuIFxuJiM0MztcdGlmICghdnEtXHUwMDNlZGVzYyB8fCAhdnEtXHUwMDNlYXZhaWwgfHwgIXZxLVx1MDAzZXVzZWQpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHRpZiAoIXZxLVx1MDAzZWlvdGxiKVxuIFx0XHRyZXR1cm4gMTtcbiBcbkBAIC0yMjcwLDExICYjNDM7MjI4NCw0OCBAQCBsb25nIHZob3N0X3ZyaW5nX2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7XG4gXG4mIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIGRldmljZSBtdXRleC4gKi9cbiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbiYjNDM7XHRpZiAoIWlvdGxiKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERyb3AgdGhlIGRldmljZS13aWRlIHZpZXcgZmlyc3QuICBFYWNoIFZRIHRoZW4gZHJvcHMgaXRzXG4mIzQzO1x0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cbiYjNDM7XHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4mIzQzO1x0ICogaGFuZG9mZiwgc2luY2UgYSB3b3JrZXIgbWF5IHN0aWxsIGJlIHVzaW5nIGl0IHdoaWxlIHdhaXRpbmdcbiYjNDM7XHQgKiBmb3IgaXRzIFZRIG11dGV4LlxuJiM0MztcdCAqL1xuJiM0MztcdGQtXHUwMDNlaW90bGIgPSBOVUxMO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4mIzQzO1x0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXHUwMDNldnFzW2ldO1xuJiM0MztcbiYjNDM7XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuJiM0MztcdFx0dnEtXHUwMDNlaW90bGIgPSBOVUxMO1xuJiM0MztcdFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xuJiM0MztcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHZob3N0X2NsZWFyX21zZyhkKTtcbiYjNDM7XHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcbiYjNDM7XHR3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbChcdTAwMjZkLVx1MDAzZXdhaXQsIEVQT0xMSU4gfCBFUE9MTFJETk9STSk7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcbiYjNDM7XG4gaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXG4ge1xuIFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHRpZiAoZC1cdTAwM2Vpb3RsYilcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XG4gXHRpZiAoIW5pb3RsYilcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5AQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIFxuIFx0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdFx0dnEtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4tXHRcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4mIzQzO1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5oIGIvZHJpdmVycy92aG9zdC92aG9zdC5oXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbkBAIC0yNzcsNiAmIzQzOzI3Nyw3IEBAIHNzaXplX3Qgdmhvc3RfY2hyX3JlYWRfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsIHN0cnVjdCBpb3ZfaXRlciAqdG8sXG4gXHRcdFx0ICAgIGludCBub2Jsb2NrKTtcbiBzc2l6ZV90IHZob3N0X2Nocl93cml0ZV9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldixcbiBcdFx0XHQgICAgIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSk7XG4mIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpO1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBcbiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5pbmRleCA5YWFhYjZiYjgwNjFjLi43N2E1YTY3NzVjODZmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcbkBAIC04NTQsNiAmIzQzOzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxuIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbiYjNDM7XHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aWYgKGZlYXR1cmVzIFx1MDAyNiB+VkhPU1RfVlNPQ0tfRkVBVFVSRVMpXG5AQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFx0XHRnb3RvIGVycjtcbiBcdH1cbiBcbi1cdGlmICgoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSkge1xuLVx0XHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KSlcbiYjNDM7XHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4mIzQzO1x0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZ2c29jay1cdTAwM2VkZXYpO1xuJiM0MztcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIGVycjtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4gXHR9XG4gXG4gXHR2c29jay1cdTAwM2VzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIFZJUlRJT19WU09DS19GX1NFUVBBQ0tFVCk7XG5AQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXG4gXG4gZXJyOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgbG9uZyB2aG9zdF92c29ja19kZXZfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VkhPU1RfTkVUJiMzNDssCiAgICAmIzM0O1ZIT1NUX1ZTT0NLJiMzNDssCiAgICAmIzM0O1ZTT0NLRVRTJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2aG9zdF9uZXRfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X2NsZWFyX2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2aG9zdF9pbml0X2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2cV9tZXRhX3ByZWZldGNoJiMzNDssCiAgICAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTE2NzMsNiAmIzQzOzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogewogCXNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47CiYjNDM7CWludCByZXQgPSAtRUZBVUxUOwogCWludCBpOwogCiAJaGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHwKQEAgLTE3MDEsOCAmIzQzOzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHsKLQkJaWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KSkKJiM0MzsJCXJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoJmFtcDtuLSZndDtkZXYpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBWSE9TVF9ORVRfVlFfTUFYOyAmIzQzOyYjNDM7aSkgewpAQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogCiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYW1wO24tJmd0O2Rldi5tdXRleCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwppbmRleCA0YzUyNWIzZTE2ZWFkLi45Zjc0NTM3YjFjMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jCkBAIC0zNDQsNiAmIzQzOzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiAJCXZxLSZndDttZXRhX2lvdGxiW2pdID0gTlVMTDsKIH0KIAomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi8KJiM0MztzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKJiM0Mzt7CiYjNDM7CXZxLSZndDtkZXNjID0gTlVMTDsKJiM0MzsJdnEtJmd0O2F2YWlsID0gTlVMTDsKJiM0MzsJdnEtJmd0O3VzZWQgPSBOVUxMOwomIzQzOwl2cS0mZ3Q7bG9nX3VzZWQgPSBmYWxzZTsKJiM0MzsJdnEtJmd0O2xvZ19hZGRyID0gLTF1bGw7CiYjNDM7CV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCWludCBpOwpAQCAtMTkxMSw2ICYjNDM7MTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCXVuc2lnbmVkIGludCBudW0gPSB2cS0mZ3Q7bnVtOwogCiYjNDM7CWlmICghdnEtJmd0O2Rlc2MgfHwgIXZxLSZndDthdmFpbCB8fCAhdnEtJmd0O3VzZWQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlpZiAoIXZxLSZndDtpb3RsYikKIAkJcmV0dXJuIDE7CiAKQEAgLTIyNzAsMTEgJiM0MzsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7CiAKJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovCiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpb3RsYiA9IGQtJmd0O2lvdGxiOwomIzQzOwlpZiAoIWlvdGxiKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0cwomIzQzOwkgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LgomIzQzOwkgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzCiYjNDM7CSAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nCiYjNDM7CSAqIGZvciBpdHMgVlEgbXV0ZXguCiYjNDM7CSAqLwomIzQzOwlkLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkLSZndDtudnFzOyAmIzQzOyYjNDM7aSkgewomIzQzOwkJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLSZndDt2cXNbaV07CiYjNDM7CiYjNDM7CQltdXRleF9sb2NrKCZhbXA7dnEtJmd0O211dGV4KTsKJiM0MzsJCXZxLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZob3N0X2NsZWFyX21zZyhkKTsKJiM0MzsJdmhvc3RfaW90bGJfZnJlZShpb3RsYik7CiYjNDM7CXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZhbXA7ZC0mZ3Q7d2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTsKJiM0MzsKIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCXN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiOwogCWludCBpOwogCiYjNDM7CWlmIChkLSZndDtpb3RsYikKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCW5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7CiAJaWYgKCFuaW90bGIpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogCiAJCW11dGV4X2xvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwogCQl2cS0mZ3Q7aW90bGIgPSBuaW90bGI7Ci0JCV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiAJCW11dGV4X3VubG9jaygmYW1wO3ZxLSZndDttdXRleCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKaW5kZXggMDE5MmFkZTZlNzQ5MS4uM2M3NWU4MDg5MzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaApAQCAtMjc3LDYgJiM0MzsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLAogCQkJICAgIGludCBub2Jsb2NrKTsKIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pOwomIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogCiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMKaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suYwpAQCAtODU0LDYgJiM0Mzs4NTQsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9jaWQoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGd1ZXN0X2NpZCkKIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKJiM0MzsJaW50IHJldCA9IC1FRkFVTFQ7CiAJaW50IGk7CiAKIAlpZiAoZmVhdHVyZXMgJmFtcDsgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKQpAQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKQogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAoKGZlYXR1cmVzICZhbXA7ICgxVUxMICZsdDsmbHQ7IFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpKSB7Ci0JCWlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpKQomIzQzOwlpZiAoZmVhdHVyZXMgJmFtcDsgKDFVTEwgJmx0OyZsdDsgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkgewomIzQzOwkJcmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoJmFtcDt2c29jay0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXZob3N0X2NsZWFyX2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpOwogCX0KIAogCXZzb2NrLSZndDtzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpOwpAQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpCiAKIGVycjoKIAltdXRleF91bmxvY2soJmFtcDt2c29jay0mZ3Q7ZGV2Lm11dGV4KTsKLQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwNDEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBUaG91Z2h0cyBvbiBUaGlzIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBhIHBhdGNoIGhlcmUsIGFuZCBpdCYjMzk7cyB0b3VjaGluZyBzZXZlcmFsIGZpbGVzIHdpdGhpbiB0aGUgYGRyaXZlcnMvdmhvc3RgIGRpcmVjdG9yeTogYG5ldC5jYCwgYHZob3N0LmNgLCBgdmhvc3QuaGAsIGFuZCBgdnNvY2suY2AuIFRoZSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCYjMzk7cyBkZWFsaW5nIHdpdGggc29tZSBpbnRlcmFjdGlvbiBvZiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC4gSXQgbG9va3MgbGlrZSB0aGVyZSYjMzk7cyBhbiBpc3N1ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGV2ZW4gd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3QgZW5hYmxlZCwgd2hpY2ggaXMgYSBiaXQgY29uY2VybmluZywgYmVjYXVzZSBpdCBpbXBsaWVzIHNvbWV0aGluZyBtaWdodCBiZSBnZXR0aW5nIGNsZWFyZWQgdGhhdCBzaG91bGRuJiMzOTt0IGJlLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCB0byBhZGRyZXNzIHRoaXMuCgpIb3dldmVyLCBhIG1vcmUgZ2xhcmluZyBpc3N1ZSBzdGFuZHMgb3V0LiBUaGUgcGF0Y2ggbWVudGlvbnMgYSByZXR1cm4gdmFsdWUgYnVnIGluIGJvdGggYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gSXQgY2xhaW1zIHRoZXkgd2VyZSBhbHdheXMgcmV0dXJuaW5nIGAtRUZBVUxUYCBvbiBzdWNjZXNzLi4uIFRoYXQmIzM5O3MgYSBodWdlIHJlZCBmbGFnLiBgLUVGQVVMVGAgaW5kaWNhdGVzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIG5vdCBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBzbyB0aGlzIHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkgYnJva2VuIHRoZSBmdW5jdGlvbmFsaXR5LiBIb3cgZGlkICp0aGF0KiBldmVyIHdvcms/CgpJJiMzOTttIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgZGlmZiBmb3IgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIHRvIGNvbmZpcm0uIEhlcmUgaXQgaXMuLi4gSXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBkaWQgaW5kZWVkIGhhdmUgYHJldHVybiAtRUZBVUxUO2AgYXQgdGhlIGVuZCEgVGhhdOKAmXMgaW5jcmVkaWJseSBzdHJhbmdlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgdGhpcyB3YXNuJiMzOTt0IGNhdWdodCBlYXJsaWVyLCBhbmQgd2hhdCBpbXBhY3QgdGhpcyBidWcgaGFkIGluIHByYWN0aWNlLiBUaGlzIGNvdWxkIGJlIGEgc2lnbmlmaWNhbnQgb3ZlcnNpZ2h0LiBMZXQgbWUgc2VlIGhvdyB0aGUgZnVuY3Rpb24gd29ya2VkLCBpbiB0aGUgZmlyc3QgcGxhY2UuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jPTE2NDM9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjcyLVxuZHJpdmVycy92aG9zdC9uZXQuYzoxNjczOnN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjc0LXtcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jPTE3NDk9c3RhdGljIGxvbmcgdmhvc3RfbmV0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzc3LVx0XHR2aXJ0aW9fZmVhdHVyZXNfZnJvbV91NjQoYWxsX2ZlYXR1cmVzLCBmZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jOjE3Nzg6XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzktXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFU19BUlJBWTpcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MTktXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4MjA6XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MjEtXHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwOTQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24sIGFzIGEgc2Vhc29uZWQgbmV0d29yayB2aXJ0dWFsaXphdGlvbiBleHBlcnQ6CgoqKkRpdmluZyBpbnRvIHZob3N0X25ldF9zZXRfZmVhdHVyZXMqKgoKT2theSwgbGV0JiMzOTtzIHB1bGwgdXAgYGRyaXZlcnMvdmhvc3QvbmV0LmNgIGFuZCBzcGVjaWZpY2FsbHksIHRoYXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBJbW1lZGlhdGVseSwgbXkgbWluZCBzdGFydHMgc2lmdGluZyB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMuIFRoaXMgZnVuY3Rpb24gKmhhcyogdG8gYmUgdGhlIGNyaXRpY2FsIHBvaW50IHdoZXJlIHdlIG5lZ290aWF0ZSBhbmQgYXBwbHkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdmlydGlvIG5ldCBkZXZpY2Ugd2l0aGluIGEgdmhvc3QgZW52aXJvbm1lbnQsIHJpZ2h0PyBJJiMzOTttIGFudGljaXBhdGluZyB3ZSYjMzk7bGwgYmUgZGVhbGluZyB3aXRoIHRoZSB1c3VhbCBzdXNwZWN0czogZmVhdHVyZSBuZWdvdGlhdGlvbiwgZHJpdmVyLXNwZWNpZmljIGNhcGFiaWxpdGllcywgbWF5YmUgc29tZSBmZWF0dXJlIG1hc2tpbmcsIGFuZCBkZWZpbml0ZWx5IHNvbWUgY3J1Y2lhbCBjaGVja3MgdG8gZW5zdXJlIHRoZSBob3N0IGFuZCBndWVzdCBhbGlnbiBvbiB3aGF0JiMzOTtzIHN1cHBvcnRlZC4KCkkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzLCBwcm9iYWJseSB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIGFuZCBpdHMgcmVsYXRlZCBmaWVsZHMuIFdlJiMzOTtyZSBnb2luZyB0byBzZWUgaG93IHRoZSBuZWdvdGlhdGVkIGZlYXR1cmVzIGFyZSBzdG9yZWQsIGFuZCBob3cgdGhhdCBhZmZlY3RzIHBhY2tldCBwcm9jZXNzaW5nIGRvd25zdHJlYW0uIERvZXMgaXQgdXNlIGEgYml0bWFwIHRvIHJlcHJlc2VudCBlbmFibGVkIGZlYXR1cmVzPyBIb3cgYXJlIGNvbmZsaWN0aW5nIGZlYXR1cmVzIGhhbmRsZWQ/IEkmIzM5O20gaG9waW5nIHRvIHNlZSBlbGVnYW50IGFuZCBlZmZpY2llbnQgYml0d2lzZSBvcGVyYXRpb25zIGhlcmUsIGdpdmVuIHRoZSBwZXJmb3JtYW5jZSBzZW5zaXRpdml0eSBvZiBuZXR3b3JrIHZpcnR1YWxpemF0aW9uLgoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIFdoYXQgaGFwcGVucyBpZiB0aGUgZ3Vlc3QgYXR0ZW1wdHMgdG8gZW5hYmxlIGEgZmVhdHVyZSB0aGUgaG9zdCBkb2VzbiYjMzk7dCBzdXBwb3J0PyBJcyB0aGVyZSBhIGdyYWNlZnVsIGZhbGxiYWNrIG1lY2hhbmlzbSwgb3IgZG9lcyBpdCB0cmlnZ2VyIGFuIGVycm9yPyBUaGUgZXJyb3IgcGF0aHMgYXJlIGp1c3QgYXMgaW1wb3J0YW50IGFzIHRoZSBoYXBweSBwYXRoLiBJJiMzOTttIGxvb2tpbmcgZm9yIHJvYnVzdCBlcnJvciBjaGVja2luZywgcGFydGljdWxhcmx5IGFyb3VuZCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgbWlnaHQgYXJpc2UgZHVyaW5nIGZlYXR1cmUgbmVnb3RpYXRpb24uCgpGaW5hbGx5LCBJJiMzOTtsbCBiZSByZWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBkYXRhcGF0aC4gSSYjMzk7bSBpbWFnaW5pbmcgaXQgd2lsbCB1cGRhdGUgcmVsZXZhbnQgcGFyYW1ldGVycyBvbiB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIG9yIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ6IGhvdyBkb2VzIGZlYXR1cmUgbmVnb3RpYXRpb24gYWN0dWFsbHkgYWZmZWN0IHBhY2tldCBmb3J3YXJkaW5nLCBjaGVja3N1bSBvZmZsb2FkLCBvciBhbnkgb3RoZXIgYWNjZWxlcmF0ZWQgZnVuY3Rpb25hbGl0eT8gSSBleHBlY3QgdG8gc2VlIGNhbGxiYWNrcyB0byBvdGhlciBmdW5jdGlvbnMgb3Igc3Vic3lzdGVtcyB0byBhY3R1YWxseSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZmVhdHVyZXMuIE9rYXksIHRpbWUgdG8gc2VlIGlmIG15IGludHVpdGlvbnMgYXJlIG9uIHRoZSBtb25leS4gTGV0JiMzOTtzIGRpZyBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNjczLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjczOlx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4xNjc0Olx0e1xuMTY3NTpcdFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbjE2NzY6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuMTY3NzpcdFx0aW50IGk7XG4xNjc4Olx0XG4xNjc5Olx0XHRoZHJfbGVuID0gdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSB8fFxuMTY4MDpcdFx0XHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XG4xNjgxOlx0XHRcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcbjE2ODI6XHRcdFx0ICBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyKTtcbjE2ODM6XHRcbjE2ODQ6XHRcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXG4xNjg1Olx0XHRcdFx0XHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxuMTY4NjpcdFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcbjE2ODc6XHRcdFx0XHRcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcbjE2ODg6XHRcdFx0aGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfdjFfaGFzaF90dW5uZWwpO1xuMTY4OTpcdFxuMTY5MDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XG4xNjkxOlx0XHRcdC8qIHZob3N0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjkyOlx0XHRcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xuMTY5MzpcdFx0XHRzb2NrX2hsZW4gPSAwO1xuMTY5NDpcdFx0fSBlbHNlIHtcbjE2OTU6XHRcdFx0Lyogc29ja2V0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjk2Olx0XHRcdHZob3N0X2hsZW4gPSAwO1xuMTY5NzpcdFx0XHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xuMTY5ODpcdFx0fVxuMTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuMTcyMzpcdG91dF91bmxvY2s6XG4xNzI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTcyNTpcdFx0cmV0dXJuIHJldDtcbjE3MjY6XHR9XG4xNzI3Olx0XG4xNzI4Olx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuMTcyOTpcdHtcbjE3MzA6XHRcdGludCByO1xuMTczMTpcdFxuMTczMjpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzMzOlx0XHRpZiAodmhvc3RfZGV2X2hhc19vd25lcihcdTAwMjZuLVx1MDAzZWRldikpIHtcbjE3MzQ6XHRcdFx0ciA9IC1FQlVTWTtcbjE3MzU6XHRcdFx0Z290byBvdXQ7XG4xNzM2Olx0XHR9XG4xNzM3Olx0XHRyID0gdmhvc3RfbmV0X3NldF91YnVmX2luZm8obik7XG4xNzM4Olx0XHRpZiAocilcbjE3Mzk6XHRcdFx0Z290byBvdXQ7XG4xNzQwOlx0XHRyID0gdmhvc3RfZGV2X3NldF9vd25lcihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzQxOlx0XHRpZiAocilcbjE3NDI6XHRcdFx0dmhvc3RfbmV0X2NsZWFyX3VidWZfaW5mbyhuKTtcbjE3NDM6XHRcdHZob3N0X25ldF9mbHVzaChuKTtcbjE3NDQ6XHRvdXQ6XG4xNzQ1Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTc0NjpcdFx0cmV0dXJuIHI7XG4xNzQ3Olx0fVxuMTc0ODpcdFxuMTc0OTpcdHN0YXRpYyBsb25nIHZob3N0X25ldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuMTc1MDpcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFyZylcbjE3NTE6XHR7XG4xNzUyOlx0XHRjb25zdCBERUZJTkVfVkhPU1RfRkVBVFVSRVNfQVJSQVkodmhvc3RfbmV0X2ZlYXR1cmVzLCB2aG9zdF9uZXRfYml0cyk7XG4xNzUzOlx0XHR1NjQgYWxsX2ZlYXR1cmVzW1ZJUlRJT19GRUFUVVJFU19VNjRTXTtcbjE3NTQ6XHRcdHN0cnVjdCB2aG9zdF9uZXQgKm4gPSBmLVx1MDAzZXByaXZhdGVfZGF0YTtcbjE3NTU6XHRcdHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnO1xuMTc1NjpcdFx0dTY0IF9fdXNlciAqZmVhdHVyZXAgPSBhcmdwO1xuMTc1NzpcdFx0c3RydWN0IHZob3N0X3ZyaW5nX2ZpbGUgYmFja2VuZDtcbjE3NTg6XHRcdHU2NCBmZWF0dXJlcywgY291bnQsIGNvcGllZDtcbjE3NTk6XHRcdGludCByLCBpO1xuMTc2MDpcdFxuMTc2MTpcdFx0c3dpdGNoIChpb2N0bCkge1xuMTc2MjpcdFx0Y2FzZSBWSE9TVF9ORVRfU0VUX0JBQ0tFTkQ6XG4xNzYzOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZiYWNrZW5kLCBhcmdwLCBzaXplb2YgYmFja2VuZCkpXG4xNzY0Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4xNzY1Olx0XHRcdHJldHVybiB2aG9zdF9uZXRfc2V0X2JhY2tlbmQobiwgYmFja2VuZC5pbmRleCwgYmFja2VuZC5mZCk7XG4xNzY2Olx0XHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcbjE3Njc6XHRcdFx0ZmVhdHVyZXMgPSB2aG9zdF9uZXRfZmVhdHVyZXNbMF07XG4xNzY4Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoZmVhdHVyZXAsIFx1MDAyNmZlYXR1cmVzLCBzaXplb2YgZmVhdHVyZXMpKVxuMTc2OTpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuMTc3MDpcdFx0XHRyZXR1cm4gMDtcbjE3NzE6XHRcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxuMTc3MjpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2ZmVhdHVyZXMsIGZlYXR1cmVwLCBzaXplb2YgZmVhdHVyZXMpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcyNjQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA2MDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2aG9zdCBGZWF0dXJlIFNldHRpbmcgQ2hhbmdlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBkaWZmIGFuZCBpbW1lZGlhdGVseSByZWNvZ25pemUgYSBjb3JyZWN0aW9uIGluIHRoZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24uIEl0IHNlZW1zIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIHN0cmFuZ2UgYHJldHVybiAwO2AgYmVmb3JlIHRoZSBgb3V0X3VubG9jazpgIGxhYmVsLCB3aGljaCB3b3VsZCYjMzk7dmUgYnlwYXNzZWQgdGhlIGludGVuZGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgY2hhbmdlIGNsZWFybHkgZml4ZXMgdGhpcyBieSByZXBsYWNpbmcgYHJldHVybiAtRUZBVUxUO2Agd2l0aCBgcmV0dXJuIHJldDtgLCB3aGljaCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2Ugc2luY2UgaXQgcHJlc2VydmVzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgbGlrZWx5IGluZGljYXRpbmcgaWYgZmVhdHVyZSBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gVGhpcyBjaGFuZ2Uga2VlcHMgdGhlIHByb3BlciByZXR1cm4gcGF0aC4KCkZ1cnRoZXJtb3JlLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgcmVsYXRlZCB0byBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYC4gSSBzZWUgdGhhdCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIG5vdyBjYWxsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIHdoZW4gdGhpcyBmZWF0dXJlIGlzICpub3QqIHNldC4gVGhlIG5ldyBmdW5jdGlvbiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBhcmUgYmVpbmcgYWRkZWQgdG8gYGRyaXZlcnMvdmhvc3Qvdmhvc3QuY2AsIGltcGx5aW5nIEkvTyBUcmFuc2xhdGlvbiBMb29rYXNpZGUgQnVmZmVyIChJT1RMQikgaW52YWxpZGF0aW9uIGxvZ2ljLgoKR2l2ZW4gdGhlc2UgYWRkaXRpb25zIGFuZCBtb2RpZmljYXRpb25zLCBJJiMzOTtkIHNheSB0aGUgZm9jdXMgb2YgZnV6emluZyBlZmZvcnRzIHNob3VsZCBjZW50ZXIgb24gdGhlIG5ldyBmdW5jdGlvbnMgYWxvbmdzaWRlIHRoZSBleGlzdGluZyBpb2N0bCBoYW5kbGVycy4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBuZWVkIHRvIHRhcmdldCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCwgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AuIEFsdGhvdWdoIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCBteSB0ZXN0IHdpbGwgc3RpbGwgbmVlZCB0byBleGVyY2lzZSB0aGlzIGZ1bmN0aW9uLCBldmVuIGlmIGl0IGlzIGluZGlyZWN0bHkgdmlhIGl0cyBjYWxsIHNpdGVzLiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgbWFraW5nIGl0IGFjY2Vzc2libGUgYXMgd2VsbC4gU2luY2UgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCBhcmUgc3RhdGljLCBJIGNhbiBhY2Nlc3MgdGhlbSB0aHJvdWdoIHRoZWlyIGlvY3RsIGVudHJ5IHBvaW50cywgbmFtZWx5IGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgcmVzcGVjdGl2ZWx5LgoKTm93LCBJJiMzOTtsbCBleGFtaW5lIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGluIGBkcml2ZXJzL3Zob3N0L3Zzb2NrLmNgIHRvIHNlZSBob3cgaXQgYWxpZ25zIHdpdGggdGhlIGNoYW5nZXMgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGltcGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvdnNvY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDg1NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDg1NDpcdHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiA4NTU6XHR7XG4gODU2Olx0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbiA4NTc6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuIDg1ODpcdFx0aW50IGk7XG4gODU5Olx0XG4gODYwOlx0XHRpZiAoZmVhdHVyZXMgXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcbiA4NjE6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDg2MjpcdFxuIDg2MzpcdFx0bXV0ZXhfbG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuIDg2NDpcdFx0aWYgKChmZWF0dXJlcyBcdTAwMjYgKDEgXHUwMDNjXHUwMDNjIFZIT1NUX0ZfTE9HX0FMTCkpIFx1MDAyNlx1MDAyNlxuIDg2NTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNnZzb2NrLVx1MDAzZWRldikpIHtcbiA4NjY6XHRcdFx0Z290byBlcnI7XG4gODY3Olx0XHR9XG4gODY4Olx0XG4gODY5Olx0XHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4gODcwOlx0XHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4gODcxOlx0XHRcdGlmIChyZXQpXG4gODcyOlx0XHRcdFx0Z290byBlcnI7XG4gODczOlx0XHR9IGVsc2Uge1xuIDg3NDpcdFx0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbiA4NzU6XHRcdH1cbiA4NzY6XHRcbiA4Nzc6XHRcdHZzb2NrLVx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcbiA4Nzg6XHRcbiA4Nzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUodnNvY2stXHUwMDNldnFzKTsgaSYjNDM7JiM0MzspIHtcbiA4ODA6XHRcdFx0dnEgPSBcdTAwMjZ2c29jay1cdTAwM2V2cXNbaV07XG4gODgxOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuIDg4MjpcdFx0XHR2cS1cdTAwM2VhY2tlZF9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuIDg4MzpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuIDg4NDpcdFx0fVxuIDg4NTpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4gODg2Olx0XHRyZXR1cm4gMDtcbiA4ODc6XHRcbiA4ODg6XHRlcnI6XG4gODg5Olx0XHRtdXRleF91bmxvY2soXHUwMDI2dnNvY2stXHUwMDNlZGV2Lm11dGV4KTtcbiA4OTA6XHRcdHJldHVybiByZXQ7XG4gODkxOlx0fVxuIDg5MjpcdFxuIDg5MzpcdHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuIDg5NDpcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFyZylcbiA4OTU6XHR7XG4gODk2Olx0XHRzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrID0gZi1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gODk3Olx0XHR2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZztcbiA4OTg6XHRcdHU2NCBndWVzdF9jaWQ7XG4gODk5Olx0XHR1NjQgZmVhdHVyZXM7XG4gOTAwOlx0XHRpbnQgc3RhcnQ7XG4gOTAxOlx0XHRpbnQgcjtcbiA5MDI6XHRcbiA5MDM6XHRcdHN3aXRjaCAoaW9jdGwpIHtcbiA5MDQ6XHRcdGNhc2UgVkhPU1RfVlNPQ0tfU0VUX0dVRVNUX0NJRDpcbiA5MDU6XHRcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1ZXN0X2NpZCwgYXJncCwgc2l6ZW9mKGd1ZXN0X2NpZCkpKVxuIDkwNjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkwNzpcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc2V0X2NpZCh2c29jaywgZ3Vlc3RfY2lkKTtcbiA5MDg6XHRcdGNhc2UgVkhPU1RfVlNPQ0tfU0VUX1JVTk5JTkc6XG4gOTA5Olx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZzdGFydCwgYXJncCwgc2l6ZW9mKHN0YXJ0KSkpXG4gOTEwOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gOTExOlx0XHRcdGlmIChzdGFydClcbiA5MTI6XHRcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc3RhcnQodnNvY2spO1xuIDkxMzpcdFx0XHRlbHNlXG4gOTE0Olx0XHRcdFx0cmV0dXJuIHZob3N0X3Zzb2NrX3N0b3AodnNvY2ssIHRydWUpO1xuIDkxNTpcdFx0Y2FzZSBWSE9TVF9HRVRfRkVBVFVSRVM6XG4gOTE2Olx0XHRcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfRkVBVFVSRVM7XG4gOTE3Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXHUwMDI2ZmVhdHVyZXMsIHNpemVvZihmZWF0dXJlcykpKVxuIDkxODpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkxOTpcdFx0XHRyZXR1cm4gMDtcbiA5MjA6XHRcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxuIDkyMTpcdFx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2ZmVhdHVyZXMsIGFyZ3AsIHNpemVvZihmZWF0dXJlcykpKVxuIDkyMjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkyMzpcdFx0XHRyZXR1cm4gdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHZzb2NrLCBmZWF0dXJlcyk7XG4gOTI0Olx0XHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxuIDkyNTpcdFx0XHRmZWF0dXJlcyA9IFZIT1NUX1ZTT0NLX0JBQ0tFTkRfRkVBVFVSRVM7XG4gOTI2Olx0XHRcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXHUwMDI2ZmVhdHVyZXMsIHNpemVvZihmZWF0dXJlcykpKVxuIDkyNzpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDkyODpcdFx0XHRyZXR1cm4gMDtcbiA5Mjk6XHRcdGNhc2UgVkhPU1RfU0VUX0JBQ0tFTkRfRkVBVFVSRVM6XG4gOTMwOlx0XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZmZWF0dXJlcywgYXJncCwgc2l6ZW9mKGZlYXR1cmVzKSkpXG4gOTMxOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gOTMyOlx0XHRcdGlmIChmZWF0dXJlcyBcdTAwMjYgflZIT1NUX1ZTT0NLX0JBQ0tFTkRfRkVBVFVSRVMpXG4gOTMzOlx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDkzNDpcdFx0XHR2aG9zdF9zZXRfYmFja2VuZF9mZWF0dXJlcyhcdTAwMjZ2c29jay1cdTAwM2VkZXYsIGZlYXR1cmVzKTtcbiA5MzU6XHRcdFx0cmV0dXJuIDA7XG4gOTM2Olx0XHRkZWZhdWx0OlxuIDkzNzpcdFx0XHRtdXRleF9sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4gOTM4Olx0XHRcdHIgPSB2aG9zdF9kZXZfaW9jdGwoXHUwMDI2dnNvY2stXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XG4gOTM5Olx0XHRcdGlmIChyID09IC1FTk9JT0NUTENNRClcbiA5NDA6XHRcdFx0XHRyID0gdmhvc3RfdnJpbmdfaW9jdGwoXHUwMDI2dnNvY2stXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XG4gOTQxOlx0XHRcdGVsc2VcbiA5NDI6XHRcdFx0XHR2aG9zdF92c29ja19mbHVzaCh2c29jayk7XG4gOTQzOlx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuIDk0NDpcdFx0XHRyZXR1cm4gcjtcbiA5NDU6XHRcdH1cbiA5NDY6XHR9XG4gOTQ3Olx0XG4gOTQ4Olx0c3RhdGljIHNzaXplX3Qgdmhvc3RfdnNvY2tfY2hyX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pXG4gOTQ5Olx0e1xuIDk1MDpcdFx0c3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLVx1MDAzZWtpX2ZpbHA7XG4gOTUxOlx0XHRzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gOTUyOlx0XHRzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYgPSBcdTAwMjZ2c29jay1cdTAwM2VkZXY7XG4gOTUzOlx0XHRpbnQgbm9ibG9jayA9IGZpbGUtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19OT05CTE9DSztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDAxNwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQ0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgdG8gYmVzdCBmdXp6IHRoZSBgdmhvc3QtbmV0YCBhbmQgYHZob3N0LXZzb2NrYCBjb2RlLiBUaGUgZW50cnkgcG9pbnRzIHNlZW0gdG8gYmUgcmVhY2hhYmxlIHRocm91Z2ggYFZIT1NUX1NFVF9GRUFUVVJFU2AgaW9jdGxzIG9uIGAvZGV2L3Zob3N0LW5ldGAgYW5kIGAvZGV2L3Zob3N0LXZzb2NrYC4gSSBzaG91bGQgdGFyZ2V0IGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYW5kIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFzIG15IHByaW1hcnkgZnV6emluZyB0YXJnZXRzLgoKU3BlY2lmaWNhbGx5LCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICppb2N0bCBoYW5kbGVycyouIFRoYXQmIzM5O3MgZ3JlYXQ7IHRob3NlIGFyZSBpZGVhbCBlbnRyeSBwb2ludHMuICBJIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHNwZWNpZmljIHVuZGVybHlpbmcgZnVuY3Rpb25zIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGlzIGNvbnRleHQsIHdoaWNoIGFyZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBhbmQgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAuCgpUaGUgcHJvbXB0IHRlbGxzIG1lIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMsIGJ1dCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGFyZSBzdGF0aWMuIFNob3VsZCBJIHN0aWxsIGxpc3QgdGhlbT8gSG1tLCB0aGUgcHJvbXB0ICpkb2VzKiBzYXkgdG8gcHJlZmVyIG5vbi1zdGF0aWMgb25lcyBidXQgZG9lc24mIzM5O3QgZm9yYmlkIHN0YXRpYyBvbmVzLCBhbmQgaXQgZG9lcyBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGF0aWMgYW5kIGlubGluZWQuIFNpbmNlIHRoZXkgYXJlbiYjMzk7dCAqdGlueSogZnVuY3Rpb25zLCB0aGV5IG1pZ2h0IG5vdCBiZSBpbmxpbmVkLiBCdXQgdGhlbiBhZ2FpbiwgYHZob3N0X25ldF9pb2N0bGAgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgIGFyZSAqYWxzbyogc3RhdGljISBVZ2guIFNvIEkgc2hvdWxkIGxpc3QgdGhlbSBhbnl3YXk/CgpXYWl0LCBnb29kIG5ld3MhIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCB3aXRoIGBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpYC4gVGhhdCBtYWtlcyB0aGluZ3MgZWFzaWVyLgoKTm93LCBsZXQmIzM5O3MgY29uZmlybSB0aGUgZW50cnkgcG9pbnRzLiBJIHNob3VsZCBjaGVjayBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgaW4gdGhlaXIgc291cmNlIGZpbGVzIHRvIHNlZSBob3cgdGhleSYjMzk7cmUgdXNlZC4gQWhhISBUaGV5IGFyZSBhc3NpZ25lZCB0byBgZmlsZV9vcGVyYXRpb25zLnVubG9ja2VkX2lvY3RsYC4gUGVyZmVjdCwgdGhhdCYjMzk7cyB3aGF0IEkgbmVlZGVkIHRvIHNlZS4gVGhleSBhcmUgaW5kZWVkIGVudHJ5IHBvaW50cy4KCkZpbmFsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgcmVxdWlyZWQga2VybmVsIGNvbmZpZ3VyYXRpb25zIGZvciBgdmhvc3RfbmV0YCBhbmQgYHZob3N0X3Zzb2NrYCB0byBtYWtlIHN1cmUgdGhlIGZ1enppbmcgc2V0dXAgaXMgY29ycmVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFZIT1NUX05FVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L0tjb25maWc9MzI9aWYgVkhPU1RfTUVOVVxuZHJpdmVycy92aG9zdC9LY29uZmlnLTMzLVxuZHJpdmVycy92aG9zdC9LY29uZmlnOjM0OmNvbmZpZyBWSE9TVF9ORVRcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zNS1cdHRyaXN0YXRlIFwmIzM0O0hvc3Qga2VybmVsIGFjY2VsZXJhdG9yIGZvciB2aXJ0aW8gbmV0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDk3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKktjb25maWcgRGl2ZSBmb3IgVkhPU1QgU3VwcG9ydCoqCgpPa2F5LCB0aW1lIHRvIGdldCB0aGlzIHNvcnRlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVmaW5lZC4gVGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQgaXMgd2l0aGluIHRoZSByZWxldmFudCBkcml2ZXIgY29uZmlndXJhdGlvbi4gR2l2ZW4gdGhhdCB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB2aXJ0dWFsIGhvc3QgbmV0d29yayBmdW5jdGlvbmFsaXR5LCB0aGUgYGRyaXZlcnMvdmhvc3RgIGRpcmVjdG9yeSBpcyB0aGUgb2J2aW91cyBzdGFydGluZyBwb2ludC4gSSYjMzk7bGwgbmVlZCB0byBvcGVuIGFuZCBleGFtaW5lIHRoZSBgS2NvbmZpZ2AgZmlsZSB3aXRoaW4gdGhhdCBkaXJlY3RvcnkgKGBkcml2ZXJzL3Zob3N0L0tjb25maWdgKSBhbmQgc2VlIGhvdyB0aG9zZSB0d28gc3BlY2lmaWMgb3B0aW9ucyBhcmUgZGVjbGFyZWQuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljLCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHZhbHVlcyB3aWxsIHJlc2lkZSwgd2hpY2ggaXMgZXNzZW50aWFsIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgVkhPU1RfSU9UTEJcbiAgIDM6XHRcdHRyaXN0YXRlXG4gICA0Olx0XHRoZWxwXG4gICA1Olx0XHQgIEdlbmVyaWMgSU9UTEIgaW1wbGVtZW50YXRpb24gZm9yIHZob3N0IGFuZCB2cmluZ2guXG4gICA2Olx0XHQgIFRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGFueSBkcml2ZXIgd2hpY2ggbmVlZHMgdG8gc3VwcG9ydFxuICAgNzpcdFx0ICBhbiBJT01NVSBpbiBzb2Z0d2FyZS5cbiAgIDg6XHRcbiAgIDk6XHRjb25maWcgVkhPU1RfUklOR1xuICAxMDpcdFx0dHJpc3RhdGVcbiAgMTE6XHRcdHNlbGVjdCBWSE9TVF9JT1RMQlxuICAxMjpcdFx0aGVscFxuICAxMzpcdFx0ICBUaGlzIG9wdGlvbiBpcyBzZWxlY3RlZCBieSBhbnkgZHJpdmVyIHdoaWNoIG5lZWRzIHRvIGFjY2Vzc1xuICAxNDpcdFx0ICB0aGUgaG9zdCBzaWRlIG9mIGEgdmlydGlvIHJpbmcuXG4gIDE1Olx0XG4gIDE2Olx0Y29uZmlnIFZIT1NUX1RBU0tcbiAgMTc6XHRcdGJvb2xcbiAgMTg6XHRcdGRlZmF1bHQgblxuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBWSE9TVFxuICAyMTpcdFx0dHJpc3RhdGVcbiAgMjI6XHRcdHNlbGVjdCBWSE9TVF9JT1RMQlxuICAyMzpcdFx0c2VsZWN0IFZIT1NUX1RBU0tcbiAgMjQ6XHRcdGhlbHBcbiAgMjU6XHRcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcbiAgMjY6XHRcdCAgdGhlIGNvcmUgb2Ygdmhvc3QuXG4gIDI3Olx0XG4gIDI4Olx0bWVudWNvbmZpZyBWSE9TVF9NRU5VXG4gIDI5Olx0XHRib29sIFwmIzM0O1ZIT1NUIGRyaXZlcnNcJiMzNDtcbiAgMzA6XHRcdGRlZmF1bHQgeVxuICAzMTpcdFxuICAzMjpcdGlmIFZIT1NUX01FTlVcbiAgMzM6XHRcbiAgMzQ6XHRjb25maWcgVkhPU1RfTkVUXG4gIDM1Olx0XHR0cmlzdGF0ZSBcJiMzNDtIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldFwmIzM0O1xuICAzNjpcdFx0ZGVwZW5kcyBvbiBORVQgXHUwMDI2XHUwMDI2IEVWRU5URkQgXHUwMDI2XHUwMDI2IChUVU4gfHwgIVRVTikgXHUwMDI2XHUwMDI2IChUQVAgfHwgIVRBUClcbiAgMzc6XHRcdHNlbGVjdCBWSE9TVFxuICAzODpcdFx0aGVscFxuICAzOTpcdFx0ICBUaGlzIGtlcm5lbCBtb2R1bGUgY2FuIGJlIGxvYWRlZCBpbiBob3N0IGtlcm5lbCB0byBhY2NlbGVyYXRlXG4gIDQwOlx0XHQgIGd1ZXN0IG5ldHdvcmtpbmcgd2l0aCB2aXJ0aW9fbmV0LiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCB2aXJ0aW9fbmV0XG4gIDQxOlx0XHQgIG1vZHVsZSBpdHNlbGYgd2hpY2ggbmVlZHMgdG8gYmUgbG9hZGVkIGluIGd1ZXN0IGtlcm5lbC5cbiAgNDI6XHRcbiAgNDM6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsXG4gIDQ0Olx0XHQgIGJlIGNhbGxlZCB2aG9zdF9uZXQuXG4gIDQ1Olx0XG4gIDQ2Olx0Y29uZmlnIFZIT1NUX1NDU0lcbiAgNDc6XHRcdHRyaXN0YXRlIFwmIzM0O1ZIT1NUX1NDU0kgVENNIGZhYnJpYyBkcml2ZXJcJiMzNDtcbiAgNDg6XHRcdGRlcGVuZHMgb24gVEFSR0VUX0NPUkUgXHUwMDI2XHUwMDI2IEVWRU5URkRcbiAgNDk6XHRcdHNlbGVjdCBWSE9TVFxuICA1MDpcdFx0c2VsZWN0IFNHX1BPT0xcbiAgNTE6XHRcdGRlZmF1bHQgblxuICA1MjpcdFx0aGVscFxuICA1MzpcdFx0U2F5IE0gaGVyZSB0byBlbmFibGUgdGhlIHZob3N0X3Njc2kgVENNIGZhYnJpYyBtb2R1bGVcbiAgNTQ6XHRcdGZvciB1c2Ugd2l0aCB2aXJ0aW8tc2NzaSBndWVzdHNcbiAgNTU6XHRcbiAgNTY6XHRjb25maWcgVkhPU1RfVlNPQ0tcbiAgNTc6XHRcdHRyaXN0YXRlIFwmIzM0O3Zob3N0IHZpcnRpby12c29jayBkcml2ZXJcJiMzNDtcbiAgNTg6XHRcdGRlcGVuZHMgb24gVlNPQ0tFVFMgXHUwMDI2XHUwMDI2IEVWRU5URkRcbiAgNTk6XHRcdHNlbGVjdCBWSE9TVFxuICA2MDpcdFx0c2VsZWN0IFZJUlRJT19WU09DS0VUU19DT01NT05cbiAgNjE6XHRcdGRlZmF1bHQgblxuICA2MjpcdFx0aGVscFxuICA2MzpcdFx0VGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gdGhlIGhvc3Qga2VybmVsIHRvIHByb3ZpZGUgQUZfVlNPQ0tcbiAgNjQ6XHRcdHNvY2tldHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBndWVzdHMuICBUaGUgZ3Vlc3RzIG11c3QgaGF2ZSB0aGVcbiAgNjU6XHRcdHZpcnRpb190cmFuc3BvcnQua28gZHJpdmVyIGxvYWRlZCB0byB1c2UgdGhlIHZpcnRpby12c29jayBkZXZpY2UuXG4gIDY2Olx0XG4gIDY3Olx0XHRUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkXG4gIDY4Olx0XHR2aG9zdF92c29jay5cbiAgNjk6XHRcbiAgNzA6XHRjb25maWcgVkhPU1RfVkRQQVxuICA3MTpcdFx0dHJpc3RhdGUgXCYjMzQ7Vmhvc3QgZHJpdmVyIGZvciB2RFBBLWJhc2VkIGJhY2tlbmRcJiMzNDtcbiAgNzI6XHRcdGRlcGVuZHMgb24gRVZFTlRGRFxuICA3MzpcdFx0c2VsZWN0IFZIT1NUXG4gIDc0Olx0XHRzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSXG4gIDc1Olx0XHRkZXBlbmRzIG9uIFZEUEFcbiAgNzY6XHRcdGhlbHBcbiAgNzc6XHRcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxuICA3ODpcdFx0ICBndWVzdCB2aXJ0aW8gZGV2aWNlcyB3aXRoIHRoZSB2RFBBLWJhc2VkIGJhY2tlbmRzLlxuICA3OTpcdFxuICA4MDpcdFx0ICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlXG4gIDgxOlx0XHQgIHdpbGwgYmUgY2FsbGVkIHZob3N0X3ZkcGEuXG4gIDgyOlx0XG4gIDgzOlx0Y29uZmlnIFZIT1NUX0NST1NTX0VORElBTl9MRUdBQ1lcbiAgODQ6XHRcdGJvb2wgXCYjMzQ7Q3Jvc3MtZW5kaWFuIHN1cHBvcnQgZm9yIHZob3N0XCYjMzQ7XG4gIDg1Olx0XHRkZWZhdWx0IG5cbiAgODY6XHRcdGhlbHBcbiAgODc6XHRcdCAgVGhpcyBvcHRpb24gYWxsb3dzIHZob3N0IHRvIHN1cHBvcnQgZ3Vlc3RzIHdpdGggYSBkaWZmZXJlbnQgYnl0ZVxuICA4ODpcdFx0ICBvcmRlcmluZyBmcm9tIGhvc3Qgd2hpbGUgdXNpbmcgbGVnYWN5IHZpcnRpby5cbiAgODk6XHRcbiAgOTA6XHRcdCAgVXNlcnNwYWNlIHByb2dyYW1zIGNhbiBjb250cm9sIHRoZSBmZWF0dXJlIHVzaW5nIHRoZVxuICA5MTpcdFx0ICBWSE9TVF9TRVRfVlJJTkdfRU5ESUFOIGFuZCBWSE9TVF9HRVRfVlJJTkdfRU5ESUFOIGlvY3Rscy5cbiAgOTI6XHRcbiAgOTM6XHRcdCAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBhIGZldyBwbGF0Zm9ybXMgKHBwYzY0IGFuZCBhcm02NCkuIFNpbmNlIGl0XG4gIDk0Olx0XHQgIGFkZHMgc29tZSBvdmVyaGVhZCwgaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgOTU6XHRcbiAgOTY6XHRcdCAgSWYgdW5zdXJlLCBzYXkgXCYjMzQ7TlwmIzM0Oy5cbiAgOTc6XHRcbiAgOTg6XHRjb25maWcgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxuICA5OTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFwmIzM0O1xuIDEwMDpcdFx0ZGVmYXVsdCB5XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjAyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMzEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBWSE9TVCBNb2R1bGUgRGVwZW5kZW5jaWVzIGFuZCBBUEkgRGVzaWduKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSB2aG9zdCBtb2R1bGVzLiBJIG5lZWQgYm90aCBgVkhPU1RfTkVUYCBhbmQgYFZIT1NUX1ZTT0NLYCB0byBiZSBlbmFibGVkLiBJIHNlZSB0aGF0IGBWSE9TVF9ORVRgIHJlbGllcyBvbiBhIGZldyBvdGhlcnM6IGBORVRgLCBgRVZFTlRGRGAsIGFuZCBgVFVOYC9gVEFQYC4gVGhhdCBgKFRVTiB8fCAhVFVOKSAmYW1wOyZhbXA7IChUQVAgfHwgIVRBUClgIGNvbnN0cnVjdCBpcyBpbnRlcmVzdGluZywgaXQgaW1wbGllcyB0aGF0IGl0IGRvZXNuJiMzOTt0ICpzdHJpY3RseSogZGVwZW5kIG9uIGVpdGhlciwgYnV0IGlmIGVpdGhlciBgVFVOYCBvciBgVEFQYCBhcmUgY29tcGlsZWQgYXMgbW9kdWxlcywgdGhlbiBgVkhPU1RfTkVUYCBhbHNvICptdXN0KiBiZSBhIG1vZHVsZS4gR29vZCB0byBrZWVwIGluIG1pbmQuIFRoZW4gdGhlcmUmIzM5O3MgYFZIT1NUX1ZTT0NLYCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC4gU3RyYWlnaHRmb3J3YXJkIGVub3VnaCBzbyBmYXIuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhIGJpdCBkZWVwZXIgYXQgc29tZSBpbnRlcm5hbCBmdW5jdGlvbnMuIExldCYjMzk7cyBzZWUsIHdoYXQgYWJvdXQgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2A/IEFoLCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgdGhhdCYjMzk7cyBnb29kLiBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIGlzIHN0YXRpYy4gSG1tLCB3aGF0IGFib3V0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGB2aG9zdF9uZXRfaW9jdGxgLCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGA/IFRoZXkmIzM5O3JlIGFsbCBtYXJrZWQgc3RhdGljLgoKV2FpdCBhIHNlY29uZCwgdGhlIHByb21wdCBpcyByZW1pbmRpbmcgbWUgYWJvdXQgYSBwb3RlbnRpYWwgaXNzdWUgaGVyZS4gSXQgc2F5cyB0byBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIG92ZXIgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMsIGJlY2F1c2UgdGhlIHN0YXRpYyBmdW5jdGlvbnMgYXJlIHByb25lIHRvIGJlaW5nIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCB0aGVyZWZvcmUgZG9uJiMzOTt0IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcy4gU28sIGV2ZW4gdGhvdWdoIGB2aG9zdF9uZXRfaW9jdGxgIGlzIHN0YXRpYywgaXQgKm1pZ2h0KiBub3QgYmUgaW5saW5lZCBpZiBpdCYjMzk7cyBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGBmaWxlX29wZXJhdGlvbnNgIHN0cnVjdHVyZS4gVGhhdCYjMzk7cyBhIGtleSBkaXN0aW5jdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgYGRyaXZlcnMvdmhvc3QvbmV0LmNgIGZpbGUgYW5kIHNlZSBob3cgYHZob3N0X25ldF9pb2N0bGAgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCB3aWxsIGNsYXJpZnkgd2hldGhlciBpdCYjMzk7cyB0cnVseSBhbiBBUEkgZW50cnlwb2ludC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmhvc3RfbmV0X2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jPTE3Mjg9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc0OC1cbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc0OTpzdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc1MC1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZHJpdmVycy92aG9zdC9uZXQuYz0xODc3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZob3N0X25ldF9mb3BzID0ge1xuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4Mi1cdC5wb2xsICAgICAgICAgICA9IHZob3N0X25ldF9jaHJfcG9sbCxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTg4MzpcdC51bmxvY2tlZF9pb2N0bCA9IHZob3N0X25ldF9pb2N0bCxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4NC1cdC5jb21wYXRfaW9jdGwgICA9IGNvbXBhdF9wdHJfaW9jdGwsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQ2CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgc2l0dWF0aW9uOgoKKipSZXZpZXdpbmcgdGhlIHZob3N0IElvY3RsIEltcGxlbWVudGF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCBhcmUgaGFuZGxlZCwgYW5kIHRoZSBrZXkgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGV5JiMzOTtyZSBib3RoIGFzc2lnbmVkIHRvIHRoZSBgdW5sb2NrZWRfaW9jdGxgIGZpZWxkIHdpdGhpbiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGV5JiMzOTtyZSBub3QgaW5saW5lZC4gVGhhdCYjMzk7cyBnb29kIHRvIGtub3c7IGl0IGNvbmZpcm1zIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGFyY2hpdGVjdHVyZS4gSXQgYWxzbyBtZWFucyBJIG5lZWQgdG8ga2VlcCB0aGlzIGZhY3QgaW4gbWluZCB3aGVuIEkgYW0gbG9va2luZyBmb3IgdGhlIG1haW4gY29udHJvbCBmbG93LCBhcyB0aGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBJIHdhbnQgdG8gZm9jdXMgb24gdG8gZnVydGhlciB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92c29jay5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvdnNvY2suYz04NTQ9c3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuLS1cbmRyaXZlcnMvdmhvc3QvdnNvY2suYy04OTItXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6ODkzOnN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuZHJpdmVycy92aG9zdC92c29jay5jLTg5NC1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZHJpdmVycy92aG9zdC92c29jay5jPTk3Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aG9zdF92c29ja19mb3BzID0ge1xuLS1cbmRyaXZlcnMvdmhvc3QvdnNvY2suYy05ODAtXHQubGxzZWVrXHRcdD0gbm9vcF9sbHNlZWssXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6OTgxOlx0LnVubG9ja2VkX2lvY3RsID0gdmhvc3RfdnNvY2tfZGV2X2lvY3RsLFxuZHJpdmVycy92aG9zdC92c29jay5jLTk4Mi1cdC5jb21wYXRfaW9jdGwgICA9IGNvbXBhdF9wdHJfaW9jdGwsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MTIzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogOTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUsIG15IGluaXRpYWwgYXNzZXNzbWVudCBzdWdnZXN0cyB0aGF0IGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYW5kIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhcmUgcHJvbWlzaW5nIGNhbmRpZGF0ZXMgZm9yIGluY2x1c2lvbiBpbiB0aGUgYEZvY3VzU3ltYm9sc2AgbGlzdC4KCk5vdywgbGV0JiMzOTtzIGJyb2FkZW4gdGhlIHNjb3BlLiBJJiMzOTtsbCBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlIGhhdmVuJiMzOTt0IG92ZXJsb29rZWQgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucy4gRGlnZ2luZyBpbnRvIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBJIHNlZSBhIGNvdXBsZSBvZiB0aGluZ3Mgb2YgaW50ZXJlc3QuIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCB3aGljaCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoZW4gYHZxX21ldGFfcHJlZmV0Y2hgIGlzIGFsc28gc2hvd2luZyBhcyBtb2RpZmllZCwgd2hpY2ggSSB3aWxsIG5lZWQgdG8gY29uc2lkZXIgYXMgd2VsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dnFfbWV0YV9wcmVmZXRjaCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L3Zob3N0LmM9MTg4Nz1zdGF0aWMgYm9vbCBpb3RsYl9hY2Nlc3Nfb2soc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsXG4tLVxuZHJpdmVycy92aG9zdC92aG9zdC5jLTE5MjAtXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkyMTppbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIyLXtcbi0tXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMTkzOC19XG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkzOTpFWFBPUlRfU1lNQk9MX0dQTCh2cV9tZXRhX3ByZWZldGNoKTtcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTQwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU4NgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZToKCioqTXkgSW1tZWRpYXRlIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgKmB2cV9tZXRhX3ByZWZldGNoYCogaXMgZmluYWxseSBleHBvcnRlZCEgVGhhdCYjMzk7cyBleGNlbGxlbnQgbmV3cy4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCB0aGF0IGRlZmluaXRlbHkgbWVhbnMgd2UgbmVlZCB0byBpbW1lZGlhdGVseSBhZGQgaXQgdG8gYEZvY3VzU3ltYm9sc2AuIFRoYXQmIzM5O3MgYSBuby1icmFpbmVyLiBUaGlzIG9wZW5zIHVwIHNvbWUgaW50ZXJlc3RpbmcgcG9zc2liaWxpdGllcyBmb3Igb3B0aW1pemF0aW9uOyBJIHNob3VsZCBwcm9iYWJseSBrZWVwIGEgcnVubmluZyBsaXN0IG9mIHBvdGVudGlhbCBhcmVhcyBvZiBpbXByb3ZlbWVudCwgbm93IHRoYXQgdGhpcyBzeW1ib2wgaXMgYXZhaWxhYmxlIHRvIHVzLgoKTmV4dCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgKmhvdyogaXQmIzM5O3MgYmVpbmcgdXNlZC4gTGV0JiMzOTtzIHNoaWZ0IGdlYXJzIGFuZCBleGFtaW5lIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIEkmIzM5O20gY3VyaW91cyB0byBzZWUgaG93IHRoZSBJL08gdHJhbnNsYXRpb24gbGF5ZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIG5ldyBwcmVmZXRjaCBjYXBhYmlsaXR5LiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBtZXRhZGF0YSBwcmVmZXRjaCBjb3VsZCBzdHJlYW1saW5lIG9yIHBvdGVudGlhbGx5IGJvdHRsZW5lY2sgdGhlIEkvTyBvcGVyYXRpb25zIGZyb20gdmlydHVhbCBtYWNoaW5lcywgYW5kIHdoZXRoZXIgdGhpcyBoZWxwcyB3aXRoIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzY2VuYXJpb3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBhYm91dCBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zIGFuZCB3aGV0aGVyIHRoZSBleGlzdGluZyBJT1RMQiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyBhcmUgYXdhcmUgb2YgdGhpcywgd2hpY2ggd291bGQgYmUgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlIGNoYW5nZSBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIHJpZ2h0IHBsYWNlcyBmb3IgcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zob3N0X2luaXRfZGV2aWNlX2lvdGxiJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92aG9zdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYz0yMzE5PUVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2NsZWFyX2RldmljZV9pb3RsYik7XG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMjMyMC1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzIxOmludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuZHJpdmVycy92aG9zdC92aG9zdC5jLTIzMjIte1xuLS1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzQ4LX1cbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzQ5OkVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzUwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTA4NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDQwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBSZWFzb25pbmcgZm9yIEZvY3VzaW5nIG9uIFRoZXNlIHZob3N0IFN5bWJvbHMqKgoKT2theSwgc28gSSYjMzk7bSBhbmFseXppbmcgdGhlIHZob3N0IGNvZGUgYW5kIGRldGVybWluaW5nIHRoZSBtb3N0IHJlbGV2YW50IHN5bWJvbHMgZm9yIGZ1enppbmcgb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHNvIEkmIzM5O20gbWFraW5nIGEgbWVudGFsIG5vdGUgb2YgdGhhdC4gQmFzZWQgb24gdGhhdCwgaGVyZSYjMzk7cyB3aGF0IEkmIzM5O20gdGhpbmtpbmcgYXJlIG15IHByaW1hcnkgdGFyZ2V0czoKCiogICBgdmhvc3RfbmV0X2lvY3RsYAoqICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAKKiAgIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgCiogICBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgCiogICBgdnFfbWV0YV9wcmVmZXRjaGAKCk5vdywgdGhlIHBhdGNoJiMzOTtzIGNvcmUgcmV2b2x2ZXMgYXJvdW5kIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkgbmVlZCB0byBjaGVjayBpZiB0aGVzZSBhcmUgZXhwb3J0ZWQgc3ltYm9scywgb3IgaWYgdGhleSBhcmUgc3RhdGljLiBBaCwgdGhleSBhcmUgc3RhdGljLiBCdXQsIGV2ZW4gdGhvdWdoIHRoZSBndWlkYW5jZSBwcmVmZXJzIG5vbi1zdGF0aWMgZW50cnlwb2ludHMsIGlmIHRoZXkgYXJlIG5vdCBpbmxpbmVkLCBzeXprYWxsZXIgKmNhbiogcmVzb2x2ZSBzdGF0aWMgZnVuY3Rpb25zLiBTbywgd2hpbGUgSSYjMzk7bSBiZWluZyBtaW5kZnVsIG9mIHRoZSBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucywgdGhlIHF1ZXN0aW9uIGJlY29tZXMsIGlzIGl0IGJldHRlciB0byBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiBhbmQgaW5jbHVkZSB0aGVtPwoKV2FpdCBhIG1pbnV0ZSwgdGhlIHByb21wdCAqc3BlY2lmaWNhbGx5KiBzYXlzIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMhIE9rYXksIGxldCBtZSB0cmltIHRoZSBsaXN0IGJhc2VkIG9uIHRoYXQuCgoqICAgYHZob3N0X25ldF9pb2N0bGAKKiAgIGB2aG9zdF92c29ja19kZXZfaW9jdGxgCiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYAoqICAgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYAoqICAgYHZxX21ldGFfcHJlZmV0Y2hgCgpOb3csIGxldCYjMzk7cyBkb3VibGUgY2hlY2sgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gUmlnaHQsIHRoZXkgYXJlIGNhbGxlZCBmcm9tIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCByZXNwZWN0aXZlbHkuIFNpbmNlIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGlvY3RsIGVudHJ5cG9pbnRzLCBpbmNsdWRpbmcgdGhlIHNldFxfZmVhdHVyZXMgZnVuY3Rpb25zIG1ha2VzIHNlbnNlLiBJIGNhbiBhbHdheXMgcmVtb3ZlIHRoZW0gbGF0ZXIgaWYgdGhleSBhcmUgaW5saW5lZCwgYnV0IGl0IGRvZXNuJiMzOTt0IGh1cnQgdG8gaW5jbHVkZSB0aGVtIGZvciBub3cuCgpTbywgSSYjMzk7bGwgYWRkIHRoZW0gdG8gdGhlIGxpc3QsIHdpdGggdGhhdCBjYXZlYXQuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IHRoZSBrZXJuZWwgY29uZmlncyByZXF1aXJlZC4gSSBzZWUgdGhhdCB0aGVzZSBhcmUgdGhlIHJlbGV2YW50IGNvbmZpZ3M6IGBWSE9TVF9ORVRgLCBgVkhPU1RfVlNPQ0tgLCBgVkhPU1RgICh3aGljaCBpcyBzZWxlY3RlZCBieSB0aGUgYWJvdmUgdHdvKSwgYFZTT0NLRVRTYCAod2hpY2ggVkhPU1RfVlNPQ0sgZGVwZW5kcyBvbiksIGFuZCBgRVZFTlRGRGAgKHdoaWNoIGJvdGggZGVwZW5kIG9uKS4gSXQmIzM5O3Mgd29ydGggZGlnZ2luZyBhIGJpdCBpbnRvIHRoZSBgVlNPQ0tFVFNgIGNvbmZpZyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBWU09DS0VUUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC92bXdfdnNvY2svS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdm13X3Zzb2NrL0tjb25maWctNS1cbm5ldC92bXdfdnNvY2svS2NvbmZpZzo2OmNvbmZpZyBWU09DS0VUU1xubmV0L3Ztd192c29jay9LY29uZmlnLTctXHR0cmlzdGF0ZSBcJiMzNDtWaXJ0dWFsIFNvY2tldCBwcm90b2NvbFwmIzM0O1xuLS1cbm5ldC92bXdfdnNvY2svS2NvbmZpZy0xOC1cbm5ldC92bXdfdnNvY2svS2NvbmZpZzoxOTpjb25maWcgVlNPQ0tFVFNfRElBR1xubmV0L3Ztd192c29jay9LY29uZmlnLTIwLVx0dHJpc3RhdGUgXCYjMzQ7VmlydHVhbCBTb2NrZXRzIG1vbml0b3JpbmcgaW50ZXJmYWNlXCYjMzQ7XG4tLVxubmV0L3Ztd192c29jay9LY29uZmlnLTI4LVxubmV0L3Ztd192c29jay9LY29uZmlnOjI5OmNvbmZpZyBWU09DS0VUU19MT09QQkFDS1xubmV0L3Ztd192c29jay9LY29uZmlnLTMwLVx0dHJpc3RhdGUgXCYjMzQ7VmlydHVhbCBTb2NrZXRzIGxvb3BiYWNrIHRyYW5zcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjI5NwoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkNoZWNraW5nIE15IEFzc3VtcHRpb25zKioKCkFscmlnaHQsIHNvIEkmIzM5O20gcHJldHR5IHN1cmUgYFZTT0NLRVRTYCBpcyB0aGUgcmlnaHQgZGlyZWN0aW9uIGhlcmUuIEhvd2V2ZXIsIGdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O3ZlIGxlYXJuZWQgdG8gYWx3YXlzIGRvdWJsZS1jaGVjayB0aGUgb2J2aW91cyBhc3N1bXB0aW9ucy4gSnVzdCBiZWNhdXNlIHNvbWV0aGluZyAqc2hvdWxkKiBiZSBkb2VzbiYjMzk7dCBtZWFuIGl0ICppcyouIFRpbWUgdG8gY29uZmlybSB0aGF0IGBFVkVOVEZEYCBpcyBhY3R1YWxseSBlbmFibGVkLiBJJiMzOTtkIHR5cGljYWxseSBleHBlY3QgaXQgdG8gYmUgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LCBlc3BlY2lhbGx5IHdoZW4gZGVidWdnaW5nLiBUaGlzIGNvbmZpcm1hdGlvbiBjb3VsZCBzYXZlIG1lIGZyb20gY2hhc2luZyBhIHJlZCBoZXJyaW5nIGxhdGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRVZFTlRGRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTg3OD1jb25maWcgVElNRVJGRFxuLS1cbmluaXQvS2NvbmZpZy0xODg2LVxuaW5pdC9LY29uZmlnOjE4ODc6Y29uZmlnIEVWRU5URkRcbmluaXQvS2NvbmZpZy0xODg4LVx0Ym9vbCBcJiMzNDtFbmFibGUgZXZlbnRmZCgpIHN5c3RlbSBjYWxsXCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjU0MwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGgga2VybmVsIGNvbmZpZ3VyYXRpb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIERpZ3Jlc3Npb25zKioKCkFscmlnaHQsIHNvIGBFVkVOVEZEYCBpcyBkZWZpbml0ZWx5IGEgY29yZSBmZWF0dXJlIGFuZCBwYXJ0IG9mIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCB3aGljaCBpcyBleGFjdGx5IHdoZXJlIEkmIzM5O2QgZXhwZWN0IGl0IHRvIGJlLiBOb3csIGxldCYjMzk7cyBzZWUsIHdoYXQgd2FzIHRoYXQgb3RoZXIgY29uZmlnIHN5bWJvbC4uLiBBaCwgeWVzLCBgVklSVElPX1ZTT0NLRVRTX0NPTU1PTmAuIEkgcmVtZW1iZXIgdGhhdCYjMzk7cyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBgVkhPU1RfVlNPQ0tgIG1vZHVsZS4gSXQmIzM5O3Mgc2VsZWN0ZWQgd2hlbiBgVkhPU1RfVlNPQ0tgIGlzIGFjdGl2YXRlZCwgd2hpY2ggbWFrZXMgc2Vuc2UgYmVjYXVzZSBpdCBwcm92aWRlcyB0aGUgdW5kZXJseWluZywgY29tbW9uIHBpZWNlcyBuZWNlc3NhcnkgZm9yIHRoZSB2aG9zdC1iYXNlZCB2aXJ0aW8tdnNvY2sgaW1wbGVtZW50YXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBkZXBlbmRlbmN5IHdoZW4gSSYjMzk7bSB3b3JraW5nIHdpdGggdGhlIFZTT0NLIHN0YWNrLiBNYWtlcyBzZW5zZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdm13X3Zzb2NrL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Ztd192c29jay9LY29uZmlnPTUzPWNvbmZpZyBWSVJUSU9fVlNPQ0tFVFNcbi0tXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNjUtXG5uZXQvdm13X3Zzb2NrL0tjb25maWc6NjY6Y29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT05cbm5ldC92bXdfdnNvY2svS2NvbmZpZy02Ny1cdHRyaXN0YXRlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2ODk2CgkJCQkJCQlvdXRwdXQ6IDIyNgoJCQkJCQkJdGhvdWdodHM6IDUzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFZob3N0IFN1YnN5c3RlbSBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBwYXRjaCBoZXJlIGFmZmVjdGluZyB0aGUgdmhvc3Qgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYHZob3N0LW5ldGAgYW5kIGB2aG9zdC12c29ja2AuIEkgc2VlIHRoYXQgc2luY2UgdGhlc2UgYXJlIHRoZSBzZWxlY3RlZCBjb21wb25lbnRzLCBJIGRvbiYjMzk7dCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGVpciBzZWxlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBwYXRjaCByZXF1aXJlcyB0aGF0IHRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZTT0NLRVRTYCwgYW5kIGBFVkVOVEZEYC4gSSBhbHNvIHNlZSB0aGF0IGBWSE9TVF9ORVRgIGltcGxpY2l0bHkgcmVsaWVzIG9uIGBORVRgLCB3aGljaCBpcyBzdGFuZGFyZCwgYW5kIHRoYXQgYFZIT1NUX1ZTT0NLYCBkZXBlbmRzIG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC4KCk5vdywgZGlnZ2luZyBpbnRvIHRoZSBjaGFuZ2VzLCBpdCBsb29rcyBsaWtlIHRoZXJlJiMzOTtzIGEgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIHdoZXJlIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIHdhcyBiZWluZyBjYWxsZWQgaW5hcHByb3ByaWF0ZWx5IHdoZW4gYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgd2FzbiYjMzk7dCBzZXQuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIHRvIGNvcnJlY3RseSBjbGVhciB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRlIHZpcnRxdWV1ZSBhY2Nlc3MuIFRoZXJlIGlzIGFsc28gYSByZXR1cm4gdmFsdWUgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBUaGVzZSBhcmUgZGVmaW5pdGVseSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0aW5nIHRoZSB2aG9zdCBzdWJzeXN0ZW0uIFRoZSBjb2RlIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gYC9kZXYvdmhvc3QtbmV0YCBhbmQgYC9kZXYvdmhvc3QtdnNvY2tgLCB3aGljaCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBmdXp6ZWQgdGhvcm91Z2hseS4KCkxvb2tpbmcgYXQgdGhlIGNvZGUgbG9jYXRpb25zIGZvciB0aGUga2V5IGZ1bmN0aW9ucywgSSBzZWUgdGhhdCBJJiMzOTtsbCBiZSBpbnRlcmVzdGVkIGluIGB2aG9zdF9uZXRfaW9jdGxgLCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCwgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAsIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAsIGB2cV9tZXRhX3ByZWZldGNoYCwgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgLCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCByZXNpZGVzIGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AgcmVzaWRlcyBpbiBgZHJpdmVycy92aG9zdC92c29jay5jYCwgc28gSSYjMzk7dmUgZ290IHRoZSBjb3JyZWN0IGxvY2F0aW9uLgoKVGhlIHBhdGNoIG1vZGlmaWVzIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBgZHJpdmVycy92aG9zdC9uZXQuY2AsIGFuZCBgZHJpdmVycy92aG9zdC92c29jay5jYC4gVGhlIGNoYW5nZXMgYXJlIHVuZG91YnRlZGx5IGZ1bmN0aW9uYWwgYW5kIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZS4gSSYjMzk7bSBzYXRpc2ZpZWQgdGhhdCB0aGlzIGlzIGEgd2VsbC1zY29wZWQgY2hhbmdlLgoKVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtWSE9TVF9ORVQmIzM0OywKICAgICYjMzQ7VkhPU1RfVlNPQ0smIzM0OywKICAgICYjMzQ7VlNPQ0tFVFMmIzM0OywKICAgICYjMzQ7RVZFTlRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Zob3N0X25ldF9pb2N0bCYjMzQ7LAogICAgJiMzNDt2aG9zdF92c29ja19kZXZfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiJiMzNDssCiAgICAmIzM0O3Zob3N0X2luaXRfZGV2aWNlX2lvdGxiJiMzNDssCiAgICAmIzM0O3ZxX21ldGFfcHJlZmV0Y2gmIzM0OywKICAgICYjMzQ7dmhvc3RfbmV0X3NldF9mZWF0dXJlcyYjMzQ7LAogICAgJiMzNDt2aG9zdF92c29ja19zZXRfZmVhdHVyZXMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VkhPU1RfTkVUJiMzNDssCiAgICAmIzM0O1ZIT1NUX1ZTT0NLJiMzNDssCiAgICAmIzM0O1ZTT0NLRVRTJiMzNDssCiAgICAmIzM0O0VWRU5URkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2aG9zdF9uZXRfaW9jdGwmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfZGV2X2lvY3RsJiMzNDssCiAgICAmIzM0O3Zob3N0X2NsZWFyX2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2aG9zdF9pbml0X2RldmljZV9pb3RsYiYjMzQ7LAogICAgJiMzNDt2cV9tZXRhX3ByZWZldGNoJiMzNDssCiAgICAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAgICYjMzQ7dmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjEzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTE2NzMsNiAmIzQzOzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogewogCXNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47CiYjNDM7CWludCByZXQgPSAtRUZBVUxUOwogCWludCBpOwogCiAJaGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHwKQEAgLTE3MDEsOCAmIzQzOzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHsKLQkJaWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KSkKJiM0MzsJCXJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIG91dF91bmxvY2s7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoJmFtcDtuLSZndDtkZXYpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgJmx0OyBWSE9TVF9ORVRfVlFfTUFYOyAmIzQzOyYjNDM7aSkgewpAQCAtMTcxOCw3ICYjNDM7MTcyMiw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKQogCiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYW1wO24tJmd0O2Rldi5tdXRleCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwppbmRleCA0YzUyNWIzZTE2ZWFkLi45Zjc0NTM3YjFjMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy92aG9zdC92aG9zdC5jCkBAIC0zNDQsNiAmIzQzOzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCiAJCXZxLSZndDttZXRhX2lvdGxiW2pdID0gTlVMTDsKIH0KIAomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIHZpcnRxdWV1ZSBtdXRleC4gKi8KJiM0MztzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSkKJiM0Mzt7CiYjNDM7CXZxLSZndDtkZXNjID0gTlVMTDsKJiM0MzsJdnEtJmd0O2F2YWlsID0gTlVMTDsKJiM0MzsJdnEtJmd0O3VzZWQgPSBOVUxMOwomIzQzOwl2cS0mZ3Q7bG9nX3VzZWQgPSBmYWxzZTsKJiM0MzsJdnEtJmd0O2xvZ19hZGRyID0gLTF1bGw7CiYjNDM7CV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCWludCBpOwpAQCAtMTkxMSw2ICYjNDM7MTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQogewogCXVuc2lnbmVkIGludCBudW0gPSB2cS0mZ3Q7bnVtOwogCiYjNDM7CWlmICghdnEtJmd0O2Rlc2MgfHwgIXZxLSZndDthdmFpbCB8fCAhdnEtJmd0O3VzZWQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAlpZiAoIXZxLSZndDtpb3RsYikKIAkJcmV0dXJuIDE7CiAKQEAgLTIyNzAsMTEgJiM0MzsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF92cmluZ19pb2N0bCk7CiAKJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovCiYjNDM7dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpb3RsYiA9IGQtJmd0O2lvdGxiOwomIzQzOwlpZiAoIWlvdGxiKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0cwomIzQzOwkgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LgomIzQzOwkgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzCiYjNDM7CSAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nCiYjNDM7CSAqIGZvciBpdHMgVlEgbXV0ZXguCiYjNDM7CSAqLwomIzQzOwlkLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkLSZndDtudnFzOyAmIzQzOyYjNDM7aSkgewomIzQzOwkJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLSZndDt2cXNbaV07CiYjNDM7CiYjNDM7CQltdXRleF9sb2NrKCZhbXA7dnEtJmd0O211dGV4KTsKJiM0MzsJCXZxLSZndDtpb3RsYiA9IE5VTEw7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXZob3N0X2NsZWFyX21zZyhkKTsKJiM0MzsJdmhvc3RfaW90bGJfZnJlZShpb3RsYik7CiYjNDM7CXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZhbXA7ZC0mZ3Q7d2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTsKJiM0MzsKIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogewogCXN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiOwogCWludCBpOwogCiYjNDM7CWlmIChkLSZndDtpb3RsYikKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCW5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7CiAJaWYgKCFuaW90bGIpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjI4Nyw3ICYjNDM7MjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQogCiAJCW11dGV4X2xvY2soJmFtcDt2cS0mZ3Q7bXV0ZXgpOwogCQl2cS0mZ3Q7aW90bGIgPSBuaW90bGI7Ci0JCV9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7CiYjNDM7CQl2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7CiAJCW11dGV4X3VubG9jaygmYW1wO3ZxLSZndDttdXRleCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKaW5kZXggMDE5MmFkZTZlNzQ5MS4uM2M3NWU4MDg5MzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaApAQCAtMjc3LDYgJiM0MzsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLAogCQkJICAgIGludCBub2Jsb2NrKTsKIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pOwomIzQzO3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpOwogCiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmMKaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suYwpAQCAtODU0LDYgJiM0Mzs4NTQsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9jaWQoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGd1ZXN0X2NpZCkKIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKJiM0MzsJaW50IHJldCA9IC1FRkFVTFQ7CiAJaW50IGk7CiAKIAlpZiAoZmVhdHVyZXMgJmFtcDsgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKQpAQCAtODY1LDkgJiM0Mzs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKQogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAoKGZlYXR1cmVzICZhbXA7ICgxVUxMICZsdDsmbHQ7IFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpKSB7Ci0JCWlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpKQomIzQzOwlpZiAoZmVhdHVyZXMgJmFtcDsgKDFVTEwgJmx0OyZsdDsgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkgewomIzQzOwkJcmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoJmFtcDt2c29jay0mZ3Q7ZGV2KTsKJiM0MzsJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXZob3N0X2NsZWFyX2RldmljZV9pb3RsYigmYW1wO3Zzb2NrLSZndDtkZXYpOwogCX0KIAogCXZzb2NrLSZndDtzZXFwYWNrZXRfYWxsb3cgPSBmZWF0dXJlcyAmYW1wOyAoMVVMTCAmbHQ7Jmx0OyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpOwpAQCAtODgzLDcgJiM0Mzs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpCiAKIGVycjoKIAltdXRleF91bmxvY2soJmFtcDt2c29jay0mZ3Q7ZGV2Lm11dGV4KTsKLQlyZXR1cm4gLUVGQVVMVDsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDM4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTUwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFZob3N0IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHRvdWNoZXMgc2V2ZXJhbCBgdmhvc3RgIGZpbGVzOiBgbmV0LmNgLCBgdmhvc3QuY2AsIGB2aG9zdC5oYCwgYW5kIGB2c29jay5jYC4gVGhlIGNvcmUgb2YgdGhlIGNoYW5nZXMgc2VlbSB0byByZXZvbHZlIGFyb3VuZCBJT1RMQiBjbGVhcmluZyAoYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYigpYCkgYW5kIGludmFsaWRhdGluZyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIHdpdGhpbiBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3MoKWAuIFRoZSBmdW5jdGlvbiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAgbm93IGNvcnJlY3RseSByZXR1cm5zIDAgaWYgdGhlIElPVExCIGlzIGFscmVhZHkgc2V0LiBJdCYjMzk7cyBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWAgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3QgZW5hYmxlZC4gQW5kIGl0JiMzOTtzIGRvaW5nIHNvbWUgcG9pbnRlciBjbGVhcmluZyB3aXRoaW4gdGhlIHZpcnRxdWV1ZSBzdHJ1Y3RzIHRvIGF2b2lkIGFjY2Vzcy4KCk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgb2YgY291cnNlLiBXZSBoYXZlIGEgZmFpciBhbW91bnQgb2YgcG9pbnRlciBjbGVhcmluZyBoYXBwZW5pbmcsIHNwZWNpZmljYWxseSB3aXRoIHRoZSB2aXJ0cXVldWUmIzM5O3MgZGVzY3JpcHRvciAoYHZxLSZndDtkZXNjYCksIGF2YWlsYWJsZSByaW5nIChgdnEtJmd0O2F2YWlsYCksIHVzZWQgcmluZyAoYHZxLSZndDt1c2VkYCksIGFuZCBzb21lIGxvZ2dpbmctcmVsYXRlZCBmaWVsZHMuIFRoaXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gaW50cm9kdWNlIGlzc3VlcyBpZiB0aGUgY2xlYXJlZCBwb2ludGVycyBhcmUgdGhlbiByZWFkLiBUaGVuIGl0IG1vZGlmaWVzIGB2cV9tZXRhX3ByZWZldGNoKClgLCB3aGljaCByZXR1cm5zIDAgaWYgYW55IG9mIHRob3NlIGFyZW4mIzM5O3QgdmFsaWQuIEJ1dCwgdGhhdCYjMzk7cyBleHBlY3RlZC4KCkFsc28sIGl0IGxvb2tzIGxpa2UgYHZob3N0X25ldF9zZXRfZmVhdHVyZXMoKWAgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoKWAgd2VyZSByZXR1cm5pbmcgYC1FRkFVTFRgIHVuY29uZGl0aW9uYWxseS4gVGhhdCYjMzk7cyBhIGh1Z2UgcmVkIGZsYWchIFRoZSBwYXRjaCBhcHBlYXJzIHRvIGJlICpmaXhpbmcqIHRoYXQgYW5kIG5vdyByZXR1cm5zIGEgdmFyaWFibGUgYHJldGAgd2hpY2ggZGVmYXVsdHMgdG8gYC1FRkFVTFRgIGJ1dCB3aGljaCBjYW4gYmUgdXBkYXRlZCBieSBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAuIFdhaXQsIGRvZXMgdGhpcyBtZWFuIHRoYXQgdGhvc2UgZnVuY3Rpb25zIHdlcmUgKmFsd2F5cyogcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gd2hlbiB0aGluZ3Mgd2VudCBjb3JyZWN0bHk/CgpMZXQgbWUgZG91YmxlLWNoZWNrIGBkcml2ZXJzL3Zob3N0L25ldC5jYC4gWWVzLCBpdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBgcmV0dXJuIC1FRkFVTFQ7YCB1bmNvbmRpdGlvbmFsbHkgYXQgdGhlIGVuZCBvZiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYC4gVGhhdCYjMzk7cyBhIG1ham9yIGJ1ZyEgSXQgbmVlZHMgdG8gYmUgcmV2aWV3ZWQgdG8gZW5zdXJlIHdlJiMzOTtyZSBub3QgbG9zaW5nIGltcG9ydGFudCBlcnJvciBpbmZvcm1hdGlvbi4gV2UgbmVlZCB0byBlbnN1cmUgdGhlIG9yaWdpbmFsIGNvZGUgY29ycmVjdGx5IGhhbmRsZWQgdGhlIHN1Y2Nlc3MgYW5kIGVycm9yIGNhc2VzLiBJdCBsb29rcyBsaWtlIGl0IHdhcyBwcm9iYWJseSBzdXBwb3NlZCB0byByZXR1cm4gMCBvbiBzdWNjZXNzLCBvciByZXR1cm4gYW55IGVycm9yIGNvZGUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgYnV0IGluc3RlYWQsIGl0IGFsd2F5cyByZXR1cm5lZCBhIGdlbmVyaWMgZXJyb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zob3N0X25ldF9zZXRfZmVhdHVyZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3QvbmV0LmM9MTY0Mz1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzItXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE2NzM6c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzQte1xuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmM9MTc0OT1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbi0tXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzctXHRcdHZpcnRpb19mZWF0dXJlc19mcm9tX3U2NChhbGxfZmVhdHVyZXMsIGZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc3ODpcdFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3OS1cdGNhc2UgVkhPU1RfR0VUX0ZFQVRVUkVTX0FSUkFZOlxuLS1cbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgxOS1cbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTgyMDpcdFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgyMS1cdGNhc2UgVkhPU1RfR0VUX0JBQ0tFTkRfRkVBVFVSRVM6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0NTcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdW5kZXJzdGFuZGluZyB0aGlzIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbiB3aXRoaW4gYGRyaXZlcnMvdmhvc3QvbmV0LmNgLgoKKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKioKCkFscmlnaHQsIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZ3JvayB3aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBkb2VzLiBGcm9tIHRoZSBuYW1lIGFsb25lLCBJIGNhbiBpbmZlciBpdCBsaWtlbHkgZGVhbHMgd2l0aCBjb25maWd1cmluZyBvciBlbmFibGluZy9kaXNhYmxpbmcgY2VydGFpbiBmdW5jdGlvbmFsaXRpZXMsIG9yICYjMzQ7ZmVhdHVyZXMsJiMzNDsgc3BlY2lmaWMgdG8gdGhlIHZpcnR1YWwgaG9zdCBuZXR3b3JrIGludGVyZmFjZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0IHByb2JhYmx5IHNpdHMgaW4gdGhlIGNvbnRyb2wgcGF0aCwgY2FsbGVkIHdoZW4gdGhlIGd1ZXN0IG9wZXJhdGluZyBzeXN0ZW0gb3IgdGhlIGh5cGVydmlzb3Igd2FudHMgdG8gbW9kaWZ5IHRoZSBjYXBhYmlsaXRpZXMgdGhlIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UgcHJlc2VudHMuIFRoaXMgaXMgbGlrZWx5IGFuIGltcG9ydGFudCBwb2ludCBvZiBjb21tdW5pY2F0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIHNlZSBob3cgaXQgaGFuZGxlcyBmZWF0dXJlIG5lZ290aWF0aW9uIOKAkyBpZiBpdCBhbGxvd3MgdGhlIGd1ZXN0IHRvIHByb3Bvc2UgZmVhdHVyZXMsIG9yIGlmIHRoZSBoeXBlcnZpc29yIGRpY3RhdGVzIHRoZW0uIEkmIzM5O20ga2VlbiB0byBzZWUgaWYgdGhlcmUgaXMgZXJyb3IgaGFuZGxpbmcuIEkgaG9wZSB0byBmaW5kIHVzZWZ1bCBjb21tZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIG9yIGJsb2NrIG9mIGNvZGUuIFRoaXMgaXMgbGlrZWx5IGEgY3JpdGljYWwgc2VjdGlvbiBvZiBjb2RlIGFzIGl0IHdpbGwgdG91Y2ggbmV0d29ya2luZy4gSG9wZWZ1bGx5LCBpdHMgd2VsbCB3cml0dGVuLCBhbmQgc2FmZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL3Zob3N0L25ldC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY3MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjczOlx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4xNjc0Olx0e1xuMTY3NTpcdFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcbjE2NzY6XHRcdGludCByZXQgPSAtRUZBVUxUO1xuMTY3NzpcdFx0aW50IGk7XG4xNjc4Olx0XG4xNjc5Olx0XHRoZHJfbGVuID0gdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGKSB8fFxuMTY4MDpcdFx0XHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XG4xNjgxOlx0XHRcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcbjE2ODI6XHRcdFx0ICBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyKTtcbjE2ODM6XHRcbjE2ODQ6XHRcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXG4xNjg1Olx0XHRcdFx0XHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxuMTY4NjpcdFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcbjE2ODc6XHRcdFx0XHRcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcbjE2ODg6XHRcdFx0aGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfdjFfaGFzaF90dW5uZWwpO1xuMTY4OTpcdFxuMTY5MDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XG4xNjkxOlx0XHRcdC8qIHZob3N0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjkyOlx0XHRcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xuMTY5MzpcdFx0XHRzb2NrX2hsZW4gPSAwO1xuMTY5NDpcdFx0fSBlbHNlIHtcbjE2OTU6XHRcdFx0Lyogc29ja2V0IHByb3ZpZGVzIHZuZXRfaGRyICovXG4xNjk2Olx0XHRcdHZob3N0X2hsZW4gPSAwO1xuMTY5NzpcdFx0XHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xuMTY5ODpcdFx0fVxuMTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NjcwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogOTE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgdmhvc3QtbmV0IFBhdGNoOiBBIERlZXAgRGl2ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHZob3N0LW5ldGAsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhlIGNoYW5nZSBpbiB0aGUgZXJyb3IgcmV0dXJuIGF0IGBvdXRfdW5sb2NrOmAuICBJdCYjMzk7cyBzd2l0Y2hpbmcgZnJvbSBhIGhhcmRjb2RlZCBgLUVGQVVMVGAgdG8gYHJldGAsIGFuZCBgcmV0YCBpcyBpbml0aWFsaXplZCB0byBgLUVGQVVMVGAgYW5kIHVwZGF0ZWQgYnkgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgLiAgVGhpcyBzdWdnZXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgbm93IG1vcmUgbnVhbmNlZCwgcG9zc2libHkgcmVmbGVjdGluZyBmYWlsdXJlcyB3aXRoaW4gdGhlIElPVExCIGluaXRpYWxpemF0aW9uLiBUaGF0IGNoYW5nZSBhbG9uZSBpcyBpbnRlcmVzdGluZywgYnV0IGl0JiMzOTtzIHRoZSBhZGRpdGlvbiBvZiBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKCZhbXA7bi0mZ3Q7ZGV2KTtgIHRoYXQmIzM5O3MgdGhlIGhlYXJ0IG9mIHRoaXMgcGF0Y2gsIGVzcGVjaWFsbHkgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24mIzM5O3Qgc2V0LgoKV2hhdCB0aGlzIGlzIGRvaW5nIGlzIGNsZWFuaW5nIHVwIHRoZSBJT1RMQiBhbmQsIGNydWNpYWxseSwgaW52YWxpZGF0aW5nIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzOiBgdnEtJmd0O2Rlc2NgLCBgdnEtJmd0O2F2YWlsYCwgYW5kIGB2cS0mZ3Q7dXNlZGAuIFRoaXMgaXMgY2xlYXJseSBhIGZpeCBmb3IgYSBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZSwgYSB2dWxuZXJhYmlsaXR5IHRoYXQgd291bGQgYmUgcXVpdGUgbmFzdHkgaWYgZXhwbG9pdGVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQmIzM5O3MgaGFuZGxpbmcgYSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIHNpdHVhdGlvbi4KCkRpdmluZyBpbnRvIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGNvbmZpcm1zIHRoZSBtZW1vcnkgc2FmZXR5IGZvY3VzLiBJdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSB2aXJ0cXVldWVzLCBsb2NrcyB0aGVpciBtdXRleGVzLCBjbGVhcnMgdGhlIGBpb3RsYmAgcG9pbnRlciBpbiBlYWNoIHZpcnRxdWV1ZSAoYHZxLSZndDtpb3RsYiA9IE5VTEw7YCksIGludmFsaWRhdGVzIGFjY2VzcyBwb2ludGVycyB2aWEgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKWAsIHVubG9ja3MgdGhlIG11dGV4LCBhbmQgZmluYWxseSwgZnJlZXMgdGhlIGBpb3RsYmAgbWVtb3J5LiBUaGUga2V5IGhlcmUgaXMgdGhlIGludmFsaWRhdGlvbiBhbmQgdGhlIGZyZWVpbmcuIEl0JiMzOTtzIGRlc2lnbmVkIHRvIHByZXZlbnQgZGFuZ2xpbmcgcG9pbnRlcnMgZnJvbSBjYXVzaW5nIGlzc3VlcyBhZnRlciB0aGUgSU9UTEIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gU28gaWYgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgY2xlYXJlZCB0aGlzIGZyZWVzIElPVExCIGFuZCBpbnZhbGlkYXRlcyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzLgoKVGhpcyByZWFsbHkgaXMgYSBtZW1vcnkgY29ycnVwdGlvbiBidWcgZml4LCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSBzaXR1YXRpb24sIG9yIGFuIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSBvciBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBjYXRjaCB0aGVzZSBlcnJvcnMuIEkmIzM5O20gbm90IHNlZWluZyBhbnkgaW1tZWRpYXRlIHJlZCBmbGFncyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBkaXJlY3RseS4gVGhlIGZvY3VzIGlzIG9uICpjbGVhcmluZyogcG9pbnRlcnMgYW5kICpmcmVlaW5nKiBtZW1vcnksIG5vdCBvbiAqaW5pdGlhbGl6aW5nKiBhbmQgdGhlbiBsZWFraW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gS01TQU4sIHdoaWNoIGlzIHJlYWxseSBnb29kIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSwgaXNuJiMzOTt0IG5lZWRlZCBoZXJlLgoKTm93LCBiYWNrIHRvIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIEl0IGFsbG9jYXRlcyBhIG5ldyBgaW90bGJgIHVzaW5nIGBpb3RsYl9hbGxvYygpYC4gSXQgcmV0dXJucyB6ZXJvIGlmIHRoZSBkZXZpY2UgYWxyZWFkeSBoYWQgYW4gSU9UTEIgc2V0LiBTbywgdGhlIG9sZCBiZWhhdmlvdXIgd291bGQgaGF2ZSBqdXN0IGFsbG9jYXRlZCBhbmQgb3ZlcndyaXR0ZW4/IFRoaXMgcGF0Y2ggc2VlbXMgdG8gYmUgYWRkcmVzc2luZyB0aG9zZSBzY2VuYXJpb3Mgd2hlcmUgdGhlIElPVExCIHdhc24mIzM5O3QgcHJvcGVybHkgY2xlYXJlZCB3aGVuIGl0IHdhcyBubyBsb25nZXIgcmVxdWlyZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC92aG9zdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjgwOlx0XG4yMjgxOlx0XHRpZiAocG9sbHN0b3AgXHUwMDI2XHUwMDI2IHZxLVx1MDAzZWhhbmRsZV9raWNrKVxuMjI4MjpcdFx0XHR2aG9zdF9kZXZfZmx1c2godnEtXHUwMDNlcG9sbC5kZXYpO1xuMjI4MzpcdFx0cmV0dXJuIHI7XG4yMjg0Olx0fVxuMjI4NTpcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X3ZyaW5nX2lvY3RsKTtcbjIyODY6XHRcbjIyODc6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXG4yMjg4Olx0dm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbjIyODk6XHR7XG4yMjkwOlx0XHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiO1xuMjI5MTpcdFx0aW50IGk7XG4yMjkyOlx0XG4yMjkzOlx0XHRpb3RsYiA9IGQtXHUwMDNlaW90bGI7XG4yMjk0Olx0XHRpZiAoIWlvdGxiKVxuMjI5NTpcdFx0XHRyZXR1cm47XG4yMjk2Olx0XG4yMjk3Olx0XHQvKlxuMjI5ODpcdFx0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcbjIyOTk6XHRcdCAqIHBlci1WUSB2aWV3IGFuZCBpdHMgY2FjaGVkIHJpbmcgYWNjZXNzIHVuZGVyIGl0cyBvd24gbXV0ZXguXG4yMzAwOlx0XHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4yMzAxOlx0XHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xuMjMwMjpcdFx0ICogZm9yIGl0cyBWUSBtdXRleC5cbjIzMDM6XHRcdCAqL1xuMjMwNDpcdFx0ZC1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4yMzA1Olx0XG4yMzA2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4yMzA3Olx0XHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4yMzA4Olx0XG4yMzA5Olx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjMxMDpcdFx0XHR2cS1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4yMzExOlx0XHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbjIzMTI6XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbjIzMTM6XHRcdH1cbjIzMTQ6XHRcbjIzMTU6XHRcdHZob3N0X2NsZWFyX21zZyhkKTtcbjIzMTY6XHRcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xuMjMxNzpcdFx0d2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoXHUwMDI2ZC1cdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xuMjMxODpcdH1cbjIzMTk6XHRFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xuMjMyMDpcdFxuMjMyMTpcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuMjMyMjpcdHtcbjIzMjM6XHRcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuMjMyNDpcdFx0aW50IGk7XG4yMzI1Olx0XG4yMzI2Olx0XHRpZiAoZC1cdTAwM2Vpb3RsYilcbjIzMjc6XHRcdFx0cmV0dXJuIDA7XG4yMzI4Olx0XG4yMzI5Olx0XHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTYzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqQW5hbHl6aW5nIHRoZSBQb3N0LVBhdGNoIFN0YXRlKioKCk9rYXksIHdhaXQgYSBtaW51dGUuLi4gSSYjMzk7bSBsb29raW5nIGF0IHRoZSBmaWxlICphZnRlciogdGhlIHBhdGNoIGhhcyBiZWVuIGFwcGxpZWQuIFRoYXQmIzM5O3MgY3J1Y2lhbCBjb250ZXh0LiBJIG5lZWQgdG8ga2VlcCB0aGF0IGZpcm1seSBpbiBtaW5kIGFzIEkgaW50ZXJwcmV0IHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgcHJlLXBhdGNoIHN0YXRlIGlzbiYjMzk7dCByZWxldmFudCBoZXJlOyBJJiMzOTttIGRlYWxpbmcgd2l0aCB0aGUgcmVzdWx0cy4KCkFscmlnaHQsIGxldCYjMzk7cyByZWZvY3VzLiBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAgZnVuY3Rpb24uIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvcmUgaW5pdGlhbGl6YXRpb24gbG9naWMgbGllcywgYW5kIGl0JiMzOTtzIGxpa2VseSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNoYW5nZXMgYW5kIHRoZWlyIGltcGFjdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggaXQsIGdpdmVuIHRoZSB1cGRhdGVkIGZpbGUmIzM5O3MgY3VycmVudCBzdGF0ZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBJL08gdHJhbnNsYXRpb24gaXMgYmVpbmcgaGFuZGxlZC4gVGhpcyBpcyB3aGVyZSB0aGUgbWFnaWMgaGFwcGVucywgc28gbGV0JiMzOTtzIGdldCB0byB0aGUgYm90dG9tIG9mIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzMjEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjMyMTpcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuMjMyMjpcdHtcbjIzMjM6XHRcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuMjMyNDpcdFx0aW50IGk7XG4yMzI1Olx0XG4yMzI2Olx0XHRpZiAoZC1cdTAwM2Vpb3RsYilcbjIzMjc6XHRcdFx0cmV0dXJuIDA7XG4yMzI4Olx0XG4yMzI5Olx0XHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuMjMzMDpcdFx0aWYgKCFuaW90bGIpXG4yMzMxOlx0XHRcdHJldHVybiAtRU5PTUVNO1xuMjMzMjpcdFxuMjMzMzpcdFx0b2lvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbjIzMzQ6XHRcdGQtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4yMzM1Olx0XG4yMzM2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICYjNDM7JiM0MztpKSB7XG4yMzM3Olx0XHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4yMzM4Olx0XG4yMzM5Olx0XHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjM0MDpcdFx0XHR2cS1cdTAwM2Vpb3RsYiA9IG5pb3RsYjtcbjIzNDE6XHRcdFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xuMjM0MjpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuMjM0MzpcdFx0fVxuMjM0NDpcdFxuMjM0NTpcdFx0dmhvc3RfaW90bGJfZnJlZShvaW90bGIpO1xuMjM0NjpcdFxuMjM0NzpcdFx0cmV0dXJuIDA7XG4yMzQ4Olx0fVxuMjM0OTpcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcbjIzNTA6XHRcbjIzNTE6XHQvKiBDYWxsZXIgbXVzdCBoYXZlIGRldmljZSBtdXRleCAqL1xuMjM1MjpcdGxvbmcgdmhvc3RfZGV2X2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ3ApXG4yMzUzOlx0e1xuMjM1NDpcdFx0c3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7XG4yMzU1Olx0XHR1NjQgcDtcbjIzNTY6XHRcdGxvbmcgcjtcbjIzNTc6XHRcdGludCBpLCBmZDtcbjIzNTg6XHRcbjIzNTk6XHRcdC8qIElmIHlvdSBhcmUgbm90IHRoZSBvd25lciwgeW91IGNhbiBiZWNvbWUgb25lICovXG4yMzYwOlx0XHRpZiAoaW9jdGwgPT0gVkhPU1RfU0VUX09XTkVSKSB7XG4yMzYxOlx0XHRcdHIgPSB2aG9zdF9kZXZfc2V0X293bmVyKGQpO1xuMjM2MjpcdFx0XHRnb3RvIGRvbmU7XG4yMzYzOlx0XHR9XG4yMzY0Olx0XG4yMzY1Olx0I2lmZGVmIENPTkZJR19WSE9TVF9FTkFCTEVfRk9SS19PV05FUl9DT05UUk9MXG4yMzY2Olx0XHRpZiAoaW9jdGwgPT0gVkhPU1RfU0VUX0ZPUktfRlJPTV9PV05FUikge1xuMjM2NzpcdFx0XHQvKiBPbmx5IGFsbG93IG1vZGlmaWNhdGlvbiBiZWZvcmUgb3duZXIgaXMgc2V0ICovXG4yMzY4Olx0XHRcdGlmICh2aG9zdF9kZXZfaGFzX293bmVyKGQpKSB7XG4yMzY5Olx0XHRcdFx0ciA9IC1FQlVTWTtcbjIzNzA6XHRcdFx0XHRnb3RvIGRvbmU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk5NjIKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMTk3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSU9UTEIgTGlmZWN5Y2xlIGFuZCBWaXJ0cXVldWUgQWNjZXNzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBmdW5jdGlvbiB3YXMgZmxhd2VkLiBJdCB3YXNuJiMzOTt0IGNoZWNraW5nIGlmIGFuIElPVExCIGFscmVhZHkgZXhpc3RlZCwgbGVhZGluZyB0byBhIHBvdGVudGlhbCBmb3IgY2xlYXJpbmcgdGhlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgdHJhbnNsYXRpb25zLCBhbmQgcG90ZW50aWFsbHkgbGVhdmluZyB0aGUgc3lzdGVtIGluIGEgY29uZnVzZWQgc3RhdGUgaWYgdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgd2FzIHRvZ2dsZWQuIFRoaXMgcGF0Y2ggYWRkcmVzc2VzIHRoYXQgYnkgaW5pdGlhbGl6aW5nIHRoZSBJT1RMQiBvbmx5IHdoZW4gdGhlIGZlYXR1cmUgaXMgKnNldCogYW5kIGNsZWFyaW5nIGl0IHdoZW4gdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLiAgVGhpcyBzZWVtcyB0byBmaXggYSBzY2VuYXJpbyB3aGVyZSB0aGUgSU9UTEIgY291bGQgYmUgdW5leHBlY3RlZGx5IGNsZWFyZWQsIHBlcmhhcHMgcmVzdWx0aW5nIGluIG1lbW9yeSBjb3JydXB0aW9uIG9yIHVzZS1hZnRlci1mcmVlLCBvciBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MuIEhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgYSBsaWZlY3ljbGUgbWFuYWdlbWVudCBpc3N1ZSwgcmF0aGVyIHRoYW4gYSBkaXJlY3QgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtBU0FOIGlzIHBlcmZlY3RseSBzdWl0YWJsZSBmb3IgY2F0Y2hpbmcgYW55IHJlc3VsdGluZyBhY2Nlc3MgZXJyb3JzIGR1ZSB0byBzdGFsZSBwb2ludGVycy4gV2UgZG9uJiMzOTt0IG5lZWQgS01TQU4gaGVyZS4KCk5vdywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIHBhdGNoJiMzOTtzIGNoYW5nZXMsIHN0YXJ0aW5nIHdpdGggYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYC4gIE9rYXksIHRoYXQgZnVuY3Rpb24gc2ltcGx5IG51bGxzIG91dCBwb2ludGVycyAoYHZxLSZndDtkZXNjYCwgYHZxLSZndDthdmFpbGAsIGB2cS0mZ3Q7dXNlZGApIGFuZCByZXNldHMgc3RhdGUsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSYjMzk7ZCBleHBlY3QgaW4gdGhpcyBzY2VuYXJpby4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIHRoZXJlLgoKTmV4dCB1cCwgYHZxX21ldGFfcHJlZmV0Y2hgLiBBaCwgZ29vZC4gVGhlIGFkZGVkIGNoZWNrIG5vdyBwcmV2ZW50cyBwcmVmZXRjaGluZyBpZiBhbnkgb2YgdGhvc2Ugdml0YWwgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBUaGlzIGlzIGEgY3J1Y2lhbCBkZWZlbnNlIGFnYWluc3QgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIHdoaWNoIGFyZSBlYXN5IHRvIGNhdGNoIHdpdGggc3RhbmRhcmQgdGVzdGluZyB0aGF0IEtBU0FOIHNob3VsZCBlYXNpbHkgZGV0ZWN0LgoKRmluYWxseSwgdGhlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbi4gVGhpcyBvbmUgaXMgbW9yZSBzdWJ0bGUuICBJIHNlZSBhIGJ1ZyBpbiB0aGUgY29kZSB0aGF0IHRoZSBwYXRjaCBmaXhlcy4gIEluaXRpYWxseSwgaXQgaW5pdGlhbGl6ZXMgdGhlIGByZXRgIHZhcmlhYmxlIHRvIGAtRUZBVUxUYC4gVGhlIGxvZ2ljIGlzIHN1Y2ggdGhhdCBpZiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpcyBzZXQsIGFuZCB0aGUgSU9UTEIgaW5pdGlhbGl6YXRpb24gZmFpbHMsIGl0IGdvZXMgdG8gYG91dF91bmxvY2tgIGFuZCByZXR1cm5zIHRoZSBlcnJvciBjb2RlLCB3aGljaCBpcyBjb3JyZWN0LiBJZiB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZHMsIGByZXRgIGlzIG5vdCB1cGRhdGVkLCBidXQgc2hvdWxkIGJlIHplcm8uIElmIHRoZSBmZWF0dXJlIGlzICpjbGVhcmVkKiwgaXQmIzM5O3Mgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIElPVExCLCB3aGljaCBtYXkgaGF2ZSBzdWNjZWVkZWQsIGJ1dCB0aGUgYHJldGAgcmVtYWlucyBgLUVGQVVMVGAuIFRoZSBwYXRjaCBub3cgY29ycmVjdGx5IHNldHMgYHJldGAgdG8gemVybyBhZnRlciBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLiAgVGhpcyBsb29rcyBsaWtlIGEgc2ltcGxlIGJ1dCBjcml0aWNhbCBlcnJvciBpbiB0aGUgb3JpZ2luYWwgY29kZSYjMzk7cyBlcnJvciBoYW5kbGluZyBhbmQgcmV0dXJuIHZhbHVlIGxvZ2ljLCBlbnN1cmluZyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG1lYW5pbmdmdWwgZXJyb3IgY29kZSBiYXNlZCBvbiB0aGUgSU9UTEIgb3BlcmF0aW9uJiMzOTtzIHN1Y2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA1OjE0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy92aG9zdC9uZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2OTksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTY5OTpcdFx0bXV0ZXhfbG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4xNzAwOlx0XHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFx1MDAyNlx1MDAyNlxuMTcwMTpcdFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFx1MDAyNm4tXHUwMDNlZGV2KSlcbjE3MDI6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwMzpcdFxuMTcwNDpcdFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xuMTcwNTpcdFx0XHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4xNzA2Olx0XHRcdGlmIChyZXQpXG4xNzA3Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTcwODpcdFx0fSBlbHNlIHtcbjE3MDk6XHRcdFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbjE3MTA6XHRcdH1cbjE3MTE6XHRcbjE3MTI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICYjNDM7JiM0MztpKSB7XG4xNzEzOlx0XHRcdG11dGV4X2xvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxNDpcdFx0XHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcbjE3MTU6XHRcdFx0XHRcdCAgICAgZmVhdHVyZXMpO1xuMTcxNjpcdFx0XHRuLVx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcbjE3MTc6XHRcdFx0bi1cdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xuMTcxODpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xuMTcxOTpcdFx0fVxuMTcyMDpcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbjE3MjE6XHRcdHJldHVybiAwO1xuMTcyMjpcdFxuMTcyMzpcdG91dF91bmxvY2s6XG4xNzI0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2bi1cdTAwM2VkZXYubXV0ZXgpO1xuMTcyNTpcdFx0cmV0dXJuIHJldDtcbjE3MjY6XHR9XG4xNzI3Olx0XG4xNzI4Olx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwNToxNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjI1NAoJCQkJCQkJb3V0cHV0OiAyMzYKCQkJCQkJCXRob3VnaHRzOiA2MzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSB2aG9zdCBuZXQvdnNvY2sgRmVhdHVyZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGF0IGRpZmYgc3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBhYm91dCBhIG1vcmUgcHJlY2lzZSBlcnJvciBjb2RlIHJldHVybiBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJIHNlZSwgaXQgcmVwbGFjZXMgdGhlIGhhcmRjb2RlZCBgLUVGQVVMVGAgd2l0aCBgcmV0YCwgd2hpY2ggcmVmbGVjdHMgdGhlIGFjdHVhbCBlcnJvciBmcm9tIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAuIE11Y2ggYmV0dGVyIQoKVGhlIHBhdGNoIGl0c2VsZiBpcyBtdWx0aWZhY2V0ZWQuIEl0JiMzOTtzIG5vdCBqdXN0IGEgc2luZ2xlIGZpeDsgaXQgdG91Y2hlcyBvbiBhIGZldyBrZXkgYXJlYXMgd2l0aGluIHRoZSB2aG9zdCBpbmZyYXN0cnVjdHVyZS4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgY2xlYXJpbmcgdGhlIGRldmljZSBJT1RMQiBhbmQgaW52YWxpZGF0aW5nIFZRIGFjY2VzcyB3aGVuIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGlzIGRpc2FibGVkLiBDbGV2ZXIuIEFuZCB0aGVyZSYjMzk7cyBhbHNvIGEgY2hlY2sgdG8gcHJldmVudCBwcmVmZXRjaGluZyB3aGVuIHRob3NlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIE5VTEwuIEdvb2QgZGVmZW5zaXZlIHByb2dyYW1taW5nLiBGaW5hbGx5LCBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIG5vdyBhIG5vLW9wIGlmIGl0JiMzOTtzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHdoaWNoIHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBvcHRpbWl6YXRpb24uCgpTbywgdGhlIGNydXggb2YgaXQgaXMgYWRkcmVzc2luZyBwb3RlbnRpYWwgaXNzdWVzIHJlbGF0ZWQgdG8gcG9pbnRlciBsaWZlY3ljbGUsIG1lbW9yeSBsZWFrcywgYW5kIHByZXZlbnRpbmcgaW52YWxpZCBtZW1vcnkgYWNjZXNzZXMuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhvc2UgcG9pbnRlciYjMzk7cyBsaWZlY3ljbGU6IGB2cS0mZ3Q7ZGVzY2AsIGB2cS0mZ3Q7YXZhaWxgLCBhbmQgYHZxLSZndDt1c2VkYC4gSXQmIzM5O3MgYWxsIGFib3V0IGVuc3VyaW5nIHRoYXQgdGhvc2UgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgcHJvcGVybHkgbWFuYWdlZCwgcGFydGljdWxhcmx5IHdoZW4gdGhhdCBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGdldHMgdG9nZ2xlZC4gVGhlIElPVExCIG5lZWRzIHRvIGJlIGZyZWVkLCBhbmQgdGhlIHBvaW50ZXJzIGhhdmUgdG8gYmUgbnVsbGlmaWVkLiBNYWtlcyBzZW5zZSB0byBhdm9pZCBkYW5nbGluZyBwb2ludGVycyBhbmQgdGhlIGhlYWRhY2hlcyB0aGV5IGJyaW5nLgoKTXkgYXNzZXNzbWVudD8gVGhlcmUgYXJlIG5vIG5ldyBhbGxvY2F0aW9ucyBvciBjb3BpZXMgb2Ygc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBhcmUgdGhlcmUgYW55IHBvdGVudGlhbCBsZWFrcyBvZiB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFRoZSBjaGFuZ2VzIGhlcmUgYXJlIGFib3V0IGhhbmRsaW5nIHBvaW50ZXIgc3RhdGUgY29ycmVjdGx5IGFuZCBndWFyZGluZyBhZ2FpbnN0IG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMuIFN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nIGFuZCBLQVNBTiDigJMgdGhlIGtlcm5lbCBhZGRyZXNzIHNhbml0aXplciDigJMgc2hvdWxkIGJlIHBlcmZlY3RseSBhZGVxdWF0ZSB0byBjYXRjaCBhbnkgYnVncyBpbiB0aGlzIHNwYWNlLCBlc3BlY2lhbGx5IHRob3NlIHJlbGF0ZWQgdG8gdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMuIEEgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGxpa2VseSB1bm5lY2Vzc2FyeS4gVGhhdCBsZXZlbCBvZiBkZWRpY2F0ZWQgZnV6emluZyBpcyBub3QgcmVxdWlyZWQgaGVyZS4gS0FTQU4gaXMgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoZXNlIHBhcnRpY3VsYXIgaXNzdWVzLiBXZSYjMzk7cmUgZ29vZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDU6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBgdnEtXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMjo0MC41MDEyMDI2MzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjkyMjEzOTg4MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVkhPU1RfTkVUXCIsXG4gICAgXCJWSE9TVF9WU09DS1wiLFxuICAgIFwiVlNPQ0tFVFNcIixcbiAgICBcIkVWRU5URkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2aG9zdF9uZXRfaW9jdGxcIixcbiAgICBcInZob3N0X3Zzb2NrX2Rldl9pb2N0bFwiLFxuICAgIFwidmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiXCIsXG4gICAgXCJ2aG9zdF9pbml0X2RldmljZV9pb3RsYlwiLFxuICAgIFwidnFfbWV0YV9wcmVmZXRjaFwiLFxuICAgIFwidmhvc3RfbmV0X3NldF9mZWF0dXJlc1wiLFxuICAgIFwidmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgdmhvc3QgZGV2aWNlIElPVExCIGFuZCB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIChgdnEtXFx1MDAzZWRlc2NgLCBgdnEtXFx1MDAzZWF2YWlsYCwgYHZxLVxcdTAwM2V1c2VkYCkuIEl0IGVuc3VyZXMgdGhhdCB3aGVuIHRoZSBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGlzIGNsZWFyZWQsIHRoZSBJT1RMQiBpcyBwcm9wZXJseSBmcmVlZCBhbmQgdGhlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIGludmFsaWRhdGVkIChzZXQgdG8gTlVMTCkuIEl0IGFsc28gYWRkcyBhIGNoZWNrIGluIGB2cV9tZXRhX3ByZWZldGNoYCB0byBwcmV2ZW50IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgaWYgdGhlIGFjY2VzcyBwb2ludGVycyBhcmUgbm90IHNldC4gVGhlc2UgY2hhbmdlcyBmaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0aWVzLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGNhdXNlZCBieSBzdGFsZSBwb2ludGVycy4gVGhlcmUgYXJlIG5vIG5ldyBzdHJ1Y3R1cmVzIGJlaW5nIGFsbG9jYXRlZCBhbmQgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbiwgbm9yIGlzIHRoZXJlIGFueSBsb2dpYyB0aGF0IGV4cG9zZXMgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBTdGFuZGFyZCBLQVNBTiAod2hpY2ggZGV0ZWN0cyB1c2UtYWZ0ZXItZnJlZSBhbmQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcykgYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nICh3aGljaCBjYXRjaGVzIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMpIGFyZSBmdWxseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGUgYnVncyB0aGlzIHBhdGNoIGFpbXMgdG8gZml4LiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGZpeGluZyBJT1RMQiBjbGVhcmluZyBsb2dpYyB3aGVuIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSBpcyBub3Qgc2V0IGluIHZob3N0LW5ldCBhbmQgdmhvc3QtdnNvY2suIEl0IGFsc28gZml4ZXMgYSByZXR1cm4gdmFsdWUgYnVnIGluIHRoZSBmZWF0dXJlIHNldHRpbmcgZnVuY3Rpb25zLiBUaGUgbW9kaWZpZWQgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvZGV2L3Zob3N0LW5ldCBhbmQgL2Rldi92aG9zdC12c29jaywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDAuNTAxMjA3Nzg1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDEwNzgxOTgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOTJhMmFhOGY0ZTM3NjE0YmEzMTE3MmVmYzIzYzM5ZDcyY2M5ZjgwNlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xcbmluZGV4IDc3YjU5ZjQ5YmRkYjMuLjY0NjcxY2Y3N2EzNWUgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy92aG9zdC9uZXQuY1xcbisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcXG5AQCAtMTY3Myw2ICsxNjczLDcgQEAgc3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbiB7XFxuIFxcdHNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47XFxuK1xcdGludCByZXQgPSAtRUZBVUxUO1xcbiBcXHRpbnQgaTtcXG4gXFxuIFxcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XFxuQEAgLTE3MDEsOCArMTcwMiwxMSBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiBcXG4gXFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbi1cXHRcXHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldikpXFxuK1xcdFxcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbitcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4gXFx0fVxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICsraSkge1xcbkBAIC0xNzE4LDcgKzE3MjIsNyBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcXG4gXFxuIG91dF91bmxvY2s6XFxuIFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4tXFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5jIGIvZHJpdmVycy92aG9zdC92aG9zdC5jXFxuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcXG5AQCAtMzQ0LDYgKzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXFxuIFxcdFxcdHZxLVxcdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcXG4gfVxcbiBcXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgdmlydHF1ZXVlIG11dGV4LiAqL1xcbitzdGF0aWMgdm9pZCB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcXG4re1xcbitcXHR2cS1cXHUwMDNlZGVzYyA9IE5VTEw7XFxuK1xcdHZxLVxcdTAwM2VhdmFpbCA9IE5VTEw7XFxuK1xcdHZxLVxcdTAwM2V1c2VkID0gTlVMTDtcXG4rXFx0dnEtXFx1MDAzZWxvZ191c2VkID0gZmFsc2U7XFxuK1xcdHZxLVxcdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xcbitcXHRfX3Zob3N0X3ZxX21ldGFfcmVzZXQodnEpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCB2aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIHtcXG4gXFx0aW50IGk7XFxuQEAgLTE5MTEsNiArMTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxcbiB7XFxuIFxcdHVuc2lnbmVkIGludCBudW0gPSB2cS1cXHUwMDNlbnVtO1xcbiBcXG4rXFx0aWYgKCF2cS1cXHUwMDNlZGVzYyB8fCAhdnEtXFx1MDAzZWF2YWlsIHx8ICF2cS1cXHUwMDNldXNlZClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbiBcXHRpZiAoIXZxLVxcdTAwM2Vpb3RsYilcXG4gXFx0XFx0cmV0dXJuIDE7XFxuIFxcbkBAIC0yMjcwLDExICsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnXFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xcbiBcXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgZGV2aWNlIG11dGV4LiAqL1xcbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbit7XFxuK1xcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aW90bGIgPSBkLVxcdTAwM2Vpb3RsYjtcXG4rXFx0aWYgKCFpb3RsYilcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0LypcXG4rXFx0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcXG4rXFx0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cXG4rXFx0ICogS2VlcCB0aGUgb2xkIHRhYmxlIGFsaXZlIHVudGlsIGV2ZXJ5IFZRIGhhcyBjb21wbGV0ZWQgdGhpc1xcbitcXHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xcbitcXHQgKiBmb3IgaXRzIFZRIG11dGV4LlxcbitcXHQgKi9cXG4rXFx0ZC1cXHUwMDNlaW90bGIgPSBOVUxMO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGQtXFx1MDAzZW52cXM7ICsraSkge1xcbitcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXFx1MDAzZXZxc1tpXTtcXG4rXFxuK1xcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuK1xcdFxcdHZxLVxcdTAwM2Vpb3RsYiA9IE5VTEw7XFxuK1xcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbitcXHR9XFxuK1xcbitcXHR2aG9zdF9jbGVhcl9tc2coZCk7XFxuK1xcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xcbitcXHR3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbChcXHUwMDI2ZC1cXHUwMDNld2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xcbitcXG4gaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIHtcXG4gXFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XFxuIFxcdGludCBpO1xcbiBcXG4rXFx0aWYgKGQtXFx1MDAzZWlvdGxiKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuIFxcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XFxuIFxcdGlmICghbmlvdGxiKVxcbiBcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG5AQCAtMjI4Nyw3ICsyMzM4LDcgQEAgaW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuIFxcbiBcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbiBcXHRcXHR2cS1cXHUwMDNlaW90bGIgPSBuaW90bGI7XFxuLVxcdFxcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XFxuK1xcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4gXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxcbkBAIC0yNzcsNiArMjc3LDcgQEAgc3NpemVfdCB2aG9zdF9jaHJfcmVhZF9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IGlvdl9pdGVyICp0byxcXG4gXFx0XFx0XFx0ICAgIGludCBub2Jsb2NrKTtcXG4gc3NpemVfdCB2aG9zdF9jaHJfd3JpdGVfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsXFxuIFxcdFxcdFxcdCAgICAgc3RydWN0IGlvdl9pdGVyICpmcm9tKTtcXG4rdm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCk7XFxuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcXG4gXFxuIHZvaWQgdmhvc3RfaW90bGJfbWFwX2ZyZWUoc3RydWN0IHZob3N0X2lvdGxiICppb3RsYixcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXFxuaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcXG5AQCAtODU0LDYgKzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxcbiBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIHtcXG4gXFx0c3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnE7XFxuK1xcdGludCByZXQgPSAtRUZBVUxUO1xcbiBcXHRpbnQgaTtcXG4gXFxuIFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcXG5AQCAtODY1LDkgKzg2NiwxMiBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIFxcdFxcdGdvdG8gZXJyO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoKGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpIHtcXG4tXFx0XFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2KSlcXG4rXFx0aWYgKGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbitcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2dnNvY2stXFx1MDAzZWRldik7XFxuK1xcdFxcdGlmIChyZXQpXFxuIFxcdFxcdFxcdGdvdG8gZXJyO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYpO1xcbiBcXHR9XFxuIFxcbiBcXHR2c29jay1cXHUwMDNlc2VxcGFja2V0X2FsbG93ID0gZmVhdHVyZXMgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpO1xcbkBAIC04ODMsNyArODg3LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxcbiBcXG4gZXJyOlxcbiBcXHRtdXRleF91bmxvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbi1cXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4gc3RhdGljIGxvbmcgdmhvc3RfdnNvY2tfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEyOjQxLjkxMjc4Nzg0N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjc3NTU0ODkzNDk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlZIT1NUX05FVFwiLFxuICAgIFwiVkhPU1RfVlNPQ0tcIixcbiAgICBcIlZTT0NLRVRTXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidmhvc3RfbmV0X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgICBcInZob3N0X2NsZWFyX2RldmljZV9pb3RsYlwiLFxuICAgIFwidmhvc3RfaW5pdF9kZXZpY2VfaW90bGJcIixcbiAgICBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgICBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgICBcInZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDkyYTJhYThmNGUzNzYxNGJhMzExNzJlZmMyM2MzOWQ3MmNjOWY4MDZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwNToxMjozOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jXG5pbmRleCA3N2I1OWY0OWJkZGIzLi42NDY3MWNmNzdhMzVlIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC9uZXQuY1xuKysrIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuQEAgLTE2NzMsNiArMTY3Myw3IEBAIHN0YXRpYyBsb25nIHZob3N0X25ldF9yZXNldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIHtcbiBcdHNpemVfdCB2aG9zdF9obGVuLCBzb2NrX2hsZW4sIGhkcl9sZW47XG4rXHRpbnQgcmV0ID0gLUVGQVVMVDtcbiBcdGludCBpO1xuIFxuIFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcbkBAIC0xNzAxLDggKzE3MDIsMTEgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcbiBcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcbi1cdFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KSlcbitcdFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2bi1cdTAwM2VkZXYpO1xuK1x0XHRpZiAocmV0KVxuIFx0XHRcdGdvdG8gb3V0X3VubG9jaztcbitcdH0gZWxzZSB7XG4rXHRcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7XG4gXHR9XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBWSE9TVF9ORVRfVlFfTUFYOyArK2kpIHtcbkBAIC0xNzE4LDcgKzE3MjIsNyBAQCBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcbiBcbiBvdXRfdW5sb2NrOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm4tXHUwMDNlZGV2Lm11dGV4KTtcbi1cdHJldHVybiAtRUZBVUxUO1xuK1x0cmV0dXJuIHJldDtcbiB9XG4gXG4gc3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuaW5kZXggNGM1MjViM2UxNmVhZC4uOWY3NDUzN2IxYzFjOCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5jXG5AQCAtMzQ0LDYgKzM0NCwxNyBAQCBzdGF0aWMgdm9pZCBfX3Zob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4gXHRcdHZxLVx1MDAzZW1ldGFfaW90bGJbal0gPSBOVUxMO1xuIH1cbiBcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSB2aXJ0cXVldWUgbXV0ZXguICovXG4rc3RhdGljIHZvaWQgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpXG4re1xuK1x0dnEtXHUwMDNlZGVzYyA9IE5VTEw7XG4rXHR2cS1cdTAwM2VhdmFpbCA9IE5VTEw7XG4rXHR2cS1cdTAwM2V1c2VkID0gTlVMTDtcbitcdHZxLVx1MDAzZWxvZ191c2VkID0gZmFsc2U7XG4rXHR2cS1cdTAwM2Vsb2dfYWRkciA9IC0xdWxsO1xuK1x0X192aG9zdF92cV9tZXRhX3Jlc2V0KHZxKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdmhvc3RfdnFfbWV0YV9yZXNldChzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdGludCBpO1xuQEAgLTE5MTEsNiArMTkyMiw5IEBAIGludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIHtcbiBcdHVuc2lnbmVkIGludCBudW0gPSB2cS1cdTAwM2VudW07XG4gXG4rXHRpZiAoIXZxLVx1MDAzZWRlc2MgfHwgIXZxLVx1MDAzZWF2YWlsIHx8ICF2cS1cdTAwM2V1c2VkKVxuK1x0XHRyZXR1cm4gMDtcbitcbiBcdGlmICghdnEtXHUwMDNlaW90bGIpXG4gXHRcdHJldHVybiAxO1xuIFxuQEAgLTIyNzAsMTEgKzIyODQsNDggQEAgbG9uZyB2aG9zdF92cmluZ19pb2N0bChzdHJ1Y3Qgdmhvc3RfZGV2ICpkLCB1bnNpZ25lZCBpbnQgaW9jdGwsIHZvaWQgX191c2VyICphcmdcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xuIFxuKy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIGRldmljZSBtdXRleC4gKi9cbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuK3tcbitcdHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGI7XG4rXHRpbnQgaTtcbitcbitcdGlvdGxiID0gZC1cdTAwM2Vpb3RsYjtcbitcdGlmICghaW90bGIpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBEcm9wIHRoZSBkZXZpY2Utd2lkZSB2aWV3IGZpcnN0LiAgRWFjaCBWUSB0aGVuIGRyb3BzIGl0c1xuK1x0ICogcGVyLVZRIHZpZXcgYW5kIGl0cyBjYWNoZWQgcmluZyBhY2Nlc3MgdW5kZXIgaXRzIG93biBtdXRleC5cbitcdCAqIEtlZXAgdGhlIG9sZCB0YWJsZSBhbGl2ZSB1bnRpbCBldmVyeSBWUSBoYXMgY29tcGxldGVkIHRoaXNcbitcdCAqIGhhbmRvZmYsIHNpbmNlIGEgd29ya2VyIG1heSBzdGlsbCBiZSB1c2luZyBpdCB3aGlsZSB3YWl0aW5nXG4rXHQgKiBmb3IgaXRzIFZRIG11dGV4LlxuK1x0ICovXG4rXHRkLVx1MDAzZWlvdGxiID0gTlVMTDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGQtXHUwMDNlbnZxczsgKytpKSB7XG4rXHRcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZC1cdTAwM2V2cXNbaV07XG4rXG4rXHRcdG11dGV4X2xvY2soXHUwMDI2dnEtXHUwMDNlbXV0ZXgpO1xuK1x0XHR2cS1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4rXHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbitcdH1cbitcbitcdHZob3N0X2NsZWFyX21zZyhkKTtcbitcdHZob3N0X2lvdGxiX2ZyZWUoaW90bGIpO1xuK1x0d2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoXHUwMDI2ZC1cdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xuK1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIHtcbiBcdHN0cnVjdCB2aG9zdF9pb3RsYiAqbmlvdGxiLCAqb2lvdGxiO1xuIFx0aW50IGk7XG4gXG4rXHRpZiAoZC1cdTAwM2Vpb3RsYilcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHRuaW90bGIgPSBpb3RsYl9hbGxvYygpO1xuIFx0aWYgKCFuaW90bGIpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuQEAgLTIyODcsNyArMjMzOCw3IEBAIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxuIFxuIFx0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdFx0dnEtXHUwMDNlaW90bGIgPSBuaW90bGI7XG4tXHRcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4rXHRcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcbiBcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbmluZGV4IDAxOTJhZGU2ZTc0OTEuLjNjNzVlODA4OTM3MzAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaFxuQEAgLTI3Nyw2ICsyNzcsNyBAQCBzc2l6ZV90IHZob3N0X2Nocl9yZWFkX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLFxuIFx0XHRcdCAgICBpbnQgbm9ibG9jayk7XG4gc3NpemVfdCB2aG9zdF9jaHJfd3JpdGVfaXRlcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pO1xuK3ZvaWQgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpO1xuIGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBcbiB2b2lkIHZob3N0X2lvdGxiX21hcF9mcmVlKHN0cnVjdCB2aG9zdF9pb3RsYiAqaW90bGIsXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92c29jay5jIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5pbmRleCA5YWFhYjZiYjgwNjFjLi43N2E1YTY3NzVjODZmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92c29jay5jXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zzb2NrLmNcbkBAIC04NTQsNiArODU0LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfY2lkKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBndWVzdF9jaWQpXG4gc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIHtcbiBcdHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxO1xuK1x0aW50IHJldCA9IC1FRkFVTFQ7XG4gXHRpbnQgaTtcbiBcbiBcdGlmIChmZWF0dXJlcyBcdTAwMjYgflZIT1NUX1ZTT0NLX0ZFQVRVUkVTKVxuQEAgLTg2NSw5ICs4NjYsMTIgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFx0XHRnb3RvIGVycjtcbiBcdH1cbiBcbi1cdGlmICgoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSkge1xuLVx0XHRpZiAodmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KSlcbitcdGlmIChmZWF0dXJlcyBcdTAwMjYgKDFVTEwgXHUwMDNjXHUwMDNjIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcbitcdFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbitcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIGVycjtcbitcdH0gZWxzZSB7XG4rXHRcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZ2c29jay1cdTAwM2VkZXYpO1xuIFx0fVxuIFxuIFx0dnNvY2stXHUwMDNlc2VxcGFja2V0X2FsbG93ID0gZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fVlNPQ0tfRl9TRVFQQUNLRVQpO1xuQEAgLTg4Myw3ICs4ODcsNyBAQCBzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXG4gXG4gZXJyOlxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnZzb2NrLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDEuOTEyNzg5MTM3WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjIwNzg3OTM1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIFRob3VnaHRzIG9uIFRoaXMgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIGhlcmUsIGFuZCBpdCdzIHRvdWNoaW5nIHNldmVyYWwgZmlsZXMgd2l0aGluIHRoZSBgZHJpdmVycy92aG9zdGAgZGlyZWN0b3J5OiBgbmV0LmNgLCBgdmhvc3QuY2AsIGB2aG9zdC5oYCwgYW5kIGB2c29jay5jYC4gVGhlIGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0J3MgZGVhbGluZyB3aXRoIHNvbWUgaW50ZXJhY3Rpb24gb2YgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAuIEl0IGxvb2tzIGxpa2UgdGhlcmUncyBhbiBpc3N1ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGV2ZW4gd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBlbmFibGVkLCB3aGljaCBpcyBhIGJpdCBjb25jZXJuaW5nLCBiZWNhdXNlIGl0IGltcGxpZXMgc29tZXRoaW5nIG1pZ2h0IGJlIGdldHRpbmcgY2xlYXJlZCB0aGF0IHNob3VsZG4ndCBiZS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYW5kIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgdG8gYWRkcmVzcyB0aGlzLlxuXG5Ib3dldmVyLCBhIG1vcmUgZ2xhcmluZyBpc3N1ZSBzdGFuZHMgb3V0LiBUaGUgcGF0Y2ggbWVudGlvbnMgYSByZXR1cm4gdmFsdWUgYnVnIGluIGJvdGggYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gSXQgY2xhaW1zIHRoZXkgd2VyZSBhbHdheXMgcmV0dXJuaW5nIGAtRUZBVUxUYCBvbiBzdWNjZXNzLi4uIFRoYXQncyBhIGh1Z2UgcmVkIGZsYWcuIGAtRUZBVUxUYCBpbmRpY2F0ZXMgYSBwcm9ncmFtbWluZyBlcnJvciwgbm90IGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24sIHNvIHRoaXMgd291bGQgaGF2ZSBlZmZlY3RpdmVseSBicm9rZW4gdGhlIGZ1bmN0aW9uYWxpdHkuIEhvdyBkaWQgKnRoYXQqIGV2ZXIgd29yaz9cblxuSSdtIGdvaW5nIHRvIGRvdWJsZS1jaGVjayB0aGUgZGlmZiBmb3IgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIHRvIGNvbmZpcm0uIEhlcmUgaXQgaXMuLi4gSXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBkaWQgaW5kZWVkIGhhdmUgYHJldHVybiAtRUZBVUxUO2AgYXQgdGhlIGVuZCEgVGhhdOKAmXMgaW5jcmVkaWJseSBzdHJhbmdlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgdGhpcyB3YXNuJ3QgY2F1Z2h0IGVhcmxpZXIsIGFuZCB3aGF0IGltcGFjdCB0aGlzIGJ1ZyBoYWQgaW4gcHJhY3RpY2UuIFRoaXMgY291bGQgYmUgYSBzaWduaWZpY2FudCBvdmVyc2lnaHQuIExldCBtZSBzZWUgaG93IHRoZSBmdW5jdGlvbiB3b3JrZWQsIGluIHRoZSBmaXJzdCBwbGFjZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDQxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDguMTIwNjcxNzQ2WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk1NzE0MjU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jPTE2NDM9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3Jlc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE2NzItXFxuZHJpdmVycy92aG9zdC9uZXQuYzoxNjczOnN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTY3NC17XFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jPTE3NDk9c3RhdGljIGxvbmcgdmhvc3RfbmV0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgaW9jdGwsXFxuLS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NzctXFx0XFx0dmlydGlvX2ZlYXR1cmVzX2Zyb21fdTY0KGFsbF9mZWF0dXJlcywgZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc3ODpcXHRcXHRyZXR1cm4gdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhuLCBhbGxfZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3OS1cXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFU19BUlJBWTpcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgxOS1cXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4MjA6XFx0XFx0cmV0dXJuIHZob3N0X25ldF9zZXRfZmVhdHVyZXMobiwgYWxsX2ZlYXR1cmVzKTtcXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE4MjEtXFx0Y2FzZSBWSE9TVF9HRVRfQkFDS0VORF9GRUFUVVJFUzpcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NDguMjE2Mzg5MDk1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDg1NTg4NzYyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBmdW5jdGlvbiwgYXMgYSBzZWFzb25lZCBuZXR3b3JrIHZpcnR1YWxpemF0aW9uIGV4cGVydDpcblxuKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKipcblxuT2theSwgbGV0J3MgcHVsbCB1cCBgZHJpdmVycy92aG9zdC9uZXQuY2AgYW5kIHNwZWNpZmljYWxseSwgdGhhdCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24uIEltbWVkaWF0ZWx5LCBteSBtaW5kIHN0YXJ0cyBzaWZ0aW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gVGhpcyBmdW5jdGlvbiAqaGFzKiB0byBiZSB0aGUgY3JpdGljYWwgcG9pbnQgd2hlcmUgd2UgbmVnb3RpYXRlIGFuZCBhcHBseSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB2aXJ0aW8gbmV0IGRldmljZSB3aXRoaW4gYSB2aG9zdCBlbnZpcm9ubWVudCwgcmlnaHQ/IEknbSBhbnRpY2lwYXRpbmcgd2UnbGwgYmUgZGVhbGluZyB3aXRoIHRoZSB1c3VhbCBzdXNwZWN0czogZmVhdHVyZSBuZWdvdGlhdGlvbiwgZHJpdmVyLXNwZWNpZmljIGNhcGFiaWxpdGllcywgbWF5YmUgc29tZSBmZWF0dXJlIG1hc2tpbmcsIGFuZCBkZWZpbml0ZWx5IHNvbWUgY3J1Y2lhbCBjaGVja3MgdG8gZW5zdXJlIHRoZSBob3N0IGFuZCBndWVzdCBhbGlnbiBvbiB3aGF0J3Mgc3VwcG9ydGVkLlxuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzLCBwcm9iYWJseSB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIGFuZCBpdHMgcmVsYXRlZCBmaWVsZHMuIFdlJ3JlIGdvaW5nIHRvIHNlZSBob3cgdGhlIG5lZ290aWF0ZWQgZmVhdHVyZXMgYXJlIHN0b3JlZCwgYW5kIGhvdyB0aGF0IGFmZmVjdHMgcGFja2V0IHByb2Nlc3NpbmcgZG93bnN0cmVhbS4gRG9lcyBpdCB1c2UgYSBiaXRtYXAgdG8gcmVwcmVzZW50IGVuYWJsZWQgZmVhdHVyZXM/IEhvdyBhcmUgY29uZmxpY3RpbmcgZmVhdHVyZXMgaGFuZGxlZD8gSSdtIGhvcGluZyB0byBzZWUgZWxlZ2FudCBhbmQgZWZmaWNpZW50IGJpdHdpc2Ugb3BlcmF0aW9ucyBoZXJlLCBnaXZlbiB0aGUgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZpdHkgb2YgbmV0d29yayB2aXJ0dWFsaXphdGlvbi5cblxuSSdtIGFsc28gY3VyaW91cyBhYm91dCBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIHRoZSBndWVzdCBhdHRlbXB0cyB0byBlbmFibGUgYSBmZWF0dXJlIHRoZSBob3N0IGRvZXNuJ3Qgc3VwcG9ydD8gSXMgdGhlcmUgYSBncmFjZWZ1bCBmYWxsYmFjayBtZWNoYW5pc20sIG9yIGRvZXMgaXQgdHJpZ2dlciBhbiBlcnJvcj8gVGhlIGVycm9yIHBhdGhzIGFyZSBqdXN0IGFzIGltcG9ydGFudCBhcyB0aGUgaGFwcHkgcGF0aC4gSSdtIGxvb2tpbmcgZm9yIHJvYnVzdCBlcnJvciBjaGVja2luZywgcGFydGljdWxhcmx5IGFyb3VuZCBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgbWlnaHQgYXJpc2UgZHVyaW5nIGZlYXR1cmUgbmVnb3RpYXRpb24uXG5cbkZpbmFsbHksIEknbGwgYmUgcmVhbGx5IGludGVyZXN0ZWQgaW4gaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YXBhdGguIEknbSBpbWFnaW5pbmcgaXQgd2lsbCB1cGRhdGUgcmVsZXZhbnQgcGFyYW1ldGVycyBvbiB0aGUgYHZob3N0X25ldGAgc3RydWN0dXJlIG9yIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ6IGhvdyBkb2VzIGZlYXR1cmUgbmVnb3RpYXRpb24gYWN0dWFsbHkgYWZmZWN0IHBhY2tldCBmb3J3YXJkaW5nLCBjaGVja3N1bSBvZmZsb2FkLCBvciBhbnkgb3RoZXIgYWNjZWxlcmF0ZWQgZnVuY3Rpb25hbGl0eT8gSSBleHBlY3QgdG8gc2VlIGNhbGxiYWNrcyB0byBvdGhlciBmdW5jdGlvbnMgb3Igc3Vic3lzdGVtcyB0byBhY3R1YWxseSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZmVhdHVyZXMuIE9rYXksIHRpbWUgdG8gc2VlIGlmIG15IGludHVpdGlvbnMgYXJlIG9uIHRoZSBtb25leS4gTGV0J3MgZGlnIGluLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MDk0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTI6NTMuMDcyMjc5MTU5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE3MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTY3MyxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2NzM6XFx0c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXFxuMTY3NDpcXHR7XFxuMTY3NTpcXHRcXHRzaXplX3Qgdmhvc3RfaGxlbiwgc29ja19obGVuLCBoZHJfbGVuO1xcbjE2NzY6XFx0XFx0aW50IHJldCA9IC1FRkFVTFQ7XFxuMTY3NzpcXHRcXHRpbnQgaTtcXG4xNjc4OlxcdFxcbjE2Nzk6XFx0XFx0aGRyX2xlbiA9IHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX05FVF9GX01SR19SWEJVRikgfHxcXG4xNjgwOlxcdFxcdFxcdCAgdmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9WRVJTSU9OXzEpID9cXG4xNjgxOlxcdFxcdFxcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpIDpcXG4xNjgyOlxcdFxcdFxcdCAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7XFxuMTY4MzpcXHRcXG4xNjg0OlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXFxuMTY4NTpcXHRcXHRcXHRcXHRcXHQgICAgIFZJUlRJT19ORVRfRl9IT1NUX1VEUF9UVU5ORUxfR1NPKSB8fFxcbjE2ODY6XFx0XFx0ICAgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcyxcXG4xNjg3OlxcdFxcdFxcdFxcdFxcdCAgICAgVklSVElPX05FVF9GX0dVRVNUX1VEUF9UVU5ORUxfR1NPKSlcXG4xNjg4OlxcdFxcdFxcdGhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyX3YxX2hhc2hfdHVubmVsKTtcXG4xNjg5OlxcdFxcbjE2OTA6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfTkVUX0ZfVklSVElPX05FVF9IRFIpKSB7XFxuMTY5MTpcXHRcXHRcXHQvKiB2aG9zdCBwcm92aWRlcyB2bmV0X2hkciAqL1xcbjE2OTI6XFx0XFx0XFx0dmhvc3RfaGxlbiA9IGhkcl9sZW47XFxuMTY5MzpcXHRcXHRcXHRzb2NrX2hsZW4gPSAwO1xcbjE2OTQ6XFx0XFx0fSBlbHNlIHtcXG4xNjk1OlxcdFxcdFxcdC8qIHNvY2tldCBwcm92aWRlcyB2bmV0X2hkciAqL1xcbjE2OTY6XFx0XFx0XFx0dmhvc3RfaGxlbiA9IDA7XFxuMTY5NzpcXHRcXHRcXHRzb2NrX2hsZW4gPSBoZHJfbGVuO1xcbjE2OTg6XFx0XFx0fVxcbjE2OTk6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4xNzAwOlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZIT1NUX0ZfTE9HX0FMTCkgXFx1MDAyNlxcdTAwMjZcXG4xNzAxOlxcdFxcdCAgICAhdmhvc3RfbG9nX2FjY2Vzc19vayhcXHUwMDI2bi1cXHUwMDNlZGV2KSlcXG4xNzAyOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xNzAzOlxcdFxcbjE3MDQ6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkge1xcbjE3MDU6XFx0XFx0XFx0cmV0ID0gdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldik7XFxuMTcwNjpcXHRcXHRcXHRpZiAocmV0KVxcbjE3MDc6XFx0XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjE3MDg6XFx0XFx0fSBlbHNlIHtcXG4xNzA5OlxcdFxcdFxcdHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4xNzEwOlxcdFxcdH1cXG4xNzExOlxcdFxcbjE3MTI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFZIT1NUX05FVF9WUV9NQVg7ICsraSkge1xcbjE3MTM6XFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2bi1cXHUwMDNldnFzW2ldLnZxLm11dGV4KTtcXG4xNzE0OlxcdFxcdFxcdHZpcnRpb19mZWF0dXJlc19jb3B5KG4tXFx1MDAzZXZxc1tpXS52cS5hY2tlZF9mZWF0dXJlc19hcnJheSxcXG4xNzE1OlxcdFxcdFxcdFxcdFxcdCAgICAgZmVhdHVyZXMpO1xcbjE3MTY6XFx0XFx0XFx0bi1cXHUwMDNldnFzW2ldLnZob3N0X2hsZW4gPSB2aG9zdF9obGVuO1xcbjE3MTc6XFx0XFx0XFx0bi1cXHUwMDNldnFzW2ldLnNvY2tfaGxlbiA9IHNvY2tfaGxlbjtcXG4xNzE4OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNldnFzW2ldLnZxLm11dGV4KTtcXG4xNzE5OlxcdFxcdH1cXG4xNzIwOlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bi1cXHUwMDNlZGV2Lm11dGV4KTtcXG4xNzIxOlxcdFxcdHJldHVybiAwO1xcbjE3MjI6XFx0XFxuMTcyMzpcXHRvdXRfdW5sb2NrOlxcbjE3MjQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MjU6XFx0XFx0cmV0dXJuIHJldDtcXG4xNzI2OlxcdH1cXG4xNzI3OlxcdFxcbjE3Mjg6XFx0c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxcbjE3Mjk6XFx0e1xcbjE3MzA6XFx0XFx0aW50IHI7XFxuMTczMTpcXHRcXG4xNzMyOlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTczMzpcXHRcXHRpZiAodmhvc3RfZGV2X2hhc19vd25lcihcXHUwMDI2bi1cXHUwMDNlZGV2KSkge1xcbjE3MzQ6XFx0XFx0XFx0ciA9IC1FQlVTWTtcXG4xNzM1OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE3MzY6XFx0XFx0fVxcbjE3Mzc6XFx0XFx0ciA9IHZob3N0X25ldF9zZXRfdWJ1Zl9pbmZvKG4pO1xcbjE3Mzg6XFx0XFx0aWYgKHIpXFxuMTczOTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xNzQwOlxcdFxcdHIgPSB2aG9zdF9kZXZfc2V0X293bmVyKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3NDE6XFx0XFx0aWYgKHIpXFxuMTc0MjpcXHRcXHRcXHR2aG9zdF9uZXRfY2xlYXJfdWJ1Zl9pbmZvKG4pO1xcbjE3NDM6XFx0XFx0dmhvc3RfbmV0X2ZsdXNoKG4pO1xcbjE3NDQ6XFx0b3V0OlxcbjE3NDU6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3NDY6XFx0XFx0cmV0dXJuIHI7XFxuMTc0NzpcXHR9XFxuMTc0ODpcXHRcXG4xNzQ5OlxcdHN0YXRpYyBsb25nIHZob3N0X25ldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbjE3NTA6XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbjE3NTE6XFx0e1xcbjE3NTI6XFx0XFx0Y29uc3QgREVGSU5FX1ZIT1NUX0ZFQVRVUkVTX0FSUkFZKHZob3N0X25ldF9mZWF0dXJlcywgdmhvc3RfbmV0X2JpdHMpO1xcbjE3NTM6XFx0XFx0dTY0IGFsbF9mZWF0dXJlc1tWSVJUSU9fRkVBVFVSRVNfVTY0U107XFxuMTc1NDpcXHRcXHRzdHJ1Y3Qgdmhvc3RfbmV0ICpuID0gZi1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbjE3NTU6XFx0XFx0dm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7XFxuMTc1NjpcXHRcXHR1NjQgX191c2VyICpmZWF0dXJlcCA9IGFyZ3A7XFxuMTc1NzpcXHRcXHRzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSBiYWNrZW5kO1xcbjE3NTg6XFx0XFx0dTY0IGZlYXR1cmVzLCBjb3VudCwgY29waWVkO1xcbjE3NTk6XFx0XFx0aW50IHIsIGk7XFxuMTc2MDpcXHRcXG4xNzYxOlxcdFxcdHN3aXRjaCAoaW9jdGwpIHtcXG4xNzYyOlxcdFxcdGNhc2UgVkhPU1RfTkVUX1NFVF9CQUNLRU5EOlxcbjE3NjM6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZiYWNrZW5kLCBhcmdwLCBzaXplb2YgYmFja2VuZCkpXFxuMTc2NDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4xNzY1OlxcdFxcdFxcdHJldHVybiB2aG9zdF9uZXRfc2V0X2JhY2tlbmQobiwgYmFja2VuZC5pbmRleCwgYmFja2VuZC5mZCk7XFxuMTc2NjpcXHRcXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcXG4xNzY3OlxcdFxcdFxcdGZlYXR1cmVzID0gdmhvc3RfbmV0X2ZlYXR1cmVzWzBdO1xcbjE3Njg6XFx0XFx0XFx0aWYgKGNvcHlfdG9fdXNlcihmZWF0dXJlcCwgXFx1MDAyNmZlYXR1cmVzLCBzaXplb2YgZmVhdHVyZXMpKVxcbjE3Njk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuMTc3MDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4xNzcxOlxcdFxcdGNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOlxcbjE3NzI6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZmZWF0dXJlcywgZmVhdHVyZXAsIHNpemVvZiBmZWF0dXJlcykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEyOjUzLjA3MjM5ODEzOVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgzNDM0ODc3OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSB2aG9zdCBGZWF0dXJlIFNldHRpbmcgQ2hhbmdlcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgZGlmZiBhbmQgaW1tZWRpYXRlbHkgcmVjb2duaXplIGEgY29ycmVjdGlvbiBpbiB0aGUgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBJdCBzZWVtcyB0aGUgb3JpZ2luYWwgY29kZSBoYWQgYSBzdHJhbmdlIGByZXR1cm4gMDtgIGJlZm9yZSB0aGUgYG91dF91bmxvY2s6YCBsYWJlbCwgd2hpY2ggd291bGQndmUgYnlwYXNzZWQgdGhlIGludGVuZGVkIGVycm9yIGhhbmRsaW5nLiBUaGUgY2hhbmdlIGNsZWFybHkgZml4ZXMgdGhpcyBieSByZXBsYWNpbmcgYHJldHVybiAtRUZBVUxUO2Agd2l0aCBgcmV0dXJuIHJldDtgLCB3aGljaCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2Ugc2luY2UgaXQgcHJlc2VydmVzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBlYXJsaWVyIGluIHRoZSBmdW5jdGlvbiwgbGlrZWx5IGluZGljYXRpbmcgaWYgZmVhdHVyZSBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gVGhpcyBjaGFuZ2Uga2VlcHMgdGhlIHByb3BlciByZXR1cm4gcGF0aC5cblxuRnVydGhlcm1vcmUsIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyByZWxhdGVkIHRvIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gLiBJIHNlZSB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2Agbm93IGNhbGwgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgd2hlbiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogc2V0LiBUaGUgbmV3IGZ1bmN0aW9uIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIGFyZSBiZWluZyBhZGRlZCB0byBgZHJpdmVycy92aG9zdC92aG9zdC5jYCwgaW1wbHlpbmcgSS9PIFRyYW5zbGF0aW9uIExvb2thc2lkZSBCdWZmZXIgKElPVExCKSBpbnZhbGlkYXRpb24gbG9naWMuXG5cbkdpdmVuIHRoZXNlIGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucywgSSdkIHNheSB0aGUgZm9jdXMgb2YgZnV6emluZyBlZmZvcnRzIHNob3VsZCBjZW50ZXIgb24gdGhlIG5ldyBmdW5jdGlvbnMgYWxvbmdzaWRlIHRoZSBleGlzdGluZyBpb2N0bCBoYW5kbGVycy4gU3BlY2lmaWNhbGx5LCBJJ2xsIG5lZWQgdG8gdGFyZ2V0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYC4gQWx0aG91Z2ggYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBpcyBzdGF0aWMsIG15IHRlc3Qgd2lsbCBzdGlsbCBuZWVkIHRvIGV4ZXJjaXNlIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWYgaXQgaXMgaW5kaXJlY3RseSB2aWEgaXRzIGNhbGwgc2l0ZXMuIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCBtYWtpbmcgaXQgYWNjZXNzaWJsZSBhcyB3ZWxsLiBTaW5jZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGFyZSBzdGF0aWMsIEkgY2FuIGFjY2VzcyB0aGVtIHRocm91Z2ggdGhlaXIgaW9jdGwgZW50cnkgcG9pbnRzLCBuYW1lbHkgYHZob3N0X25ldF9pb2N0bGAgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgLCByZXNwZWN0aXZlbHkuXG5cbk5vdywgSSdsbCBleGFtaW5lIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgIGluIGBkcml2ZXJzL3Zob3N0L3Zzb2NrLmNgIHRvIHNlZSBob3cgaXQgYWxpZ25zIHdpdGggdGhlIGNoYW5nZXMgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NzI2NCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYwMywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjAxLjQxNTkwMzA4MloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNjI4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L3Zzb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogODU0LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDg1NDpcXHRzdGF0aWMgaW50IHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZmVhdHVyZXMpXFxuIDg1NTpcXHR7XFxuIDg1NjpcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcXG4gODU3OlxcdFxcdGludCByZXQgPSAtRUZBVUxUO1xcbiA4NTg6XFx0XFx0aW50IGk7XFxuIDg1OTpcXHRcXG4gODYwOlxcdFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcXG4gODYxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gODYyOlxcdFxcbiA4NjM6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldi5tdXRleCk7XFxuIDg2NDpcXHRcXHRpZiAoKGZlYXR1cmVzIFxcdTAwMjYgKDEgXFx1MDAzY1xcdTAwM2MgVkhPU1RfRl9MT0dfQUxMKSkgXFx1MDAyNlxcdTAwMjZcXG4gODY1OlxcdFxcdCAgICAhdmhvc3RfbG9nX2FjY2Vzc19vayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldikpIHtcXG4gODY2OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA4Njc6XFx0XFx0fVxcbiA4Njg6XFx0XFxuIDg2OTpcXHRcXHRpZiAoZmVhdHVyZXMgXFx1MDAyNiAoMVVMTCBcXHUwMDNjXFx1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XFxuIDg3MDpcXHRcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2dnNvY2stXFx1MDAzZWRldik7XFxuIDg3MTpcXHRcXHRcXHRpZiAocmV0KVxcbiA4NzI6XFx0XFx0XFx0XFx0Z290byBlcnI7XFxuIDg3MzpcXHRcXHR9IGVsc2Uge1xcbiA4NzQ6XFx0XFx0XFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2KTtcXG4gODc1OlxcdFxcdH1cXG4gODc2OlxcdFxcbiA4Nzc6XFx0XFx0dnNvY2stXFx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFxcdTAwMjYgKDFVTEwgXFx1MDAzY1xcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcXG4gODc4OlxcdFxcbiA4Nzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUodnNvY2stXFx1MDAzZXZxcyk7IGkrKykge1xcbiA4ODA6XFx0XFx0XFx0dnEgPSBcXHUwMDI2dnNvY2stXFx1MDAzZXZxc1tpXTtcXG4gODgxOlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuIDg4MjpcXHRcXHRcXHR2cS1cXHUwMDNlYWNrZWRfZmVhdHVyZXMgPSBmZWF0dXJlcztcXG4gODgzOlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4gODg0OlxcdFxcdH1cXG4gODg1OlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnNvY2stXFx1MDAzZWRldi5tdXRleCk7XFxuIDg4NjpcXHRcXHRyZXR1cm4gMDtcXG4gODg3OlxcdFxcbiA4ODg6XFx0ZXJyOlxcbiA4ODk6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2Lm11dGV4KTtcXG4gODkwOlxcdFxcdHJldHVybiByZXQ7XFxuIDg5MTpcXHR9XFxuIDg5MjpcXHRcXG4gODkzOlxcdHN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbiA4OTQ6XFx0XFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFyZylcXG4gODk1OlxcdHtcXG4gODk2OlxcdFxcdHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2sgPSBmLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDg5NzpcXHRcXHR2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZztcXG4gODk4OlxcdFxcdHU2NCBndWVzdF9jaWQ7XFxuIDg5OTpcXHRcXHR1NjQgZmVhdHVyZXM7XFxuIDkwMDpcXHRcXHRpbnQgc3RhcnQ7XFxuIDkwMTpcXHRcXHRpbnQgcjtcXG4gOTAyOlxcdFxcbiA5MDM6XFx0XFx0c3dpdGNoIChpb2N0bCkge1xcbiA5MDQ6XFx0XFx0Y2FzZSBWSE9TVF9WU09DS19TRVRfR1VFU1RfQ0lEOlxcbiA5MDU6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZndWVzdF9jaWQsIGFyZ3AsIHNpemVvZihndWVzdF9jaWQpKSlcXG4gOTA2OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5MDc6XFx0XFx0XFx0cmV0dXJuIHZob3N0X3Zzb2NrX3NldF9jaWQodnNvY2ssIGd1ZXN0X2NpZCk7XFxuIDkwODpcXHRcXHRjYXNlIFZIT1NUX1ZTT0NLX1NFVF9SVU5OSU5HOlxcbiA5MDk6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZzdGFydCwgYXJncCwgc2l6ZW9mKHN0YXJ0KSkpXFxuIDkxMDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTExOlxcdFxcdFxcdGlmIChzdGFydClcXG4gOTEyOlxcdFxcdFxcdFxcdHJldHVybiB2aG9zdF92c29ja19zdGFydCh2c29jayk7XFxuIDkxMzpcXHRcXHRcXHRlbHNlXFxuIDkxNDpcXHRcXHRcXHRcXHRyZXR1cm4gdmhvc3RfdnNvY2tfc3RvcCh2c29jaywgdHJ1ZSk7XFxuIDkxNTpcXHRcXHRjYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzpcXG4gOTE2OlxcdFxcdFxcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfRkVBVFVSRVM7XFxuIDkxNzpcXHRcXHRcXHRpZiAoY29weV90b191c2VyKGFyZ3AsIFxcdTAwMjZmZWF0dXJlcywgc2l6ZW9mKGZlYXR1cmVzKSkpXFxuIDkxODpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTE5OlxcdFxcdFxcdHJldHVybiAwO1xcbiA5MjA6XFx0XFx0Y2FzZSBWSE9TVF9TRVRfRkVBVFVSRVM6XFxuIDkyMTpcXHRcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNmZlYXR1cmVzLCBhcmdwLCBzaXplb2YoZmVhdHVyZXMpKSlcXG4gOTIyOlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5MjM6XFx0XFx0XFx0cmV0dXJuIHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcyh2c29jaywgZmVhdHVyZXMpO1xcbiA5MjQ6XFx0XFx0Y2FzZSBWSE9TVF9HRVRfQkFDS0VORF9GRUFUVVJFUzpcXG4gOTI1OlxcdFxcdFxcdGZlYXR1cmVzID0gVkhPU1RfVlNPQ0tfQkFDS0VORF9GRUFUVVJFUztcXG4gOTI2OlxcdFxcdFxcdGlmIChjb3B5X3RvX3VzZXIoYXJncCwgXFx1MDAyNmZlYXR1cmVzLCBzaXplb2YoZmVhdHVyZXMpKSlcXG4gOTI3OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA5Mjg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDkyOTpcXHRcXHRjYXNlIFZIT1NUX1NFVF9CQUNLRU5EX0ZFQVRVUkVTOlxcbiA5MzA6XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZmZWF0dXJlcywgYXJncCwgc2l6ZW9mKGZlYXR1cmVzKSkpXFxuIDkzMTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gOTMyOlxcdFxcdFxcdGlmIChmZWF0dXJlcyBcXHUwMDI2IH5WSE9TVF9WU09DS19CQUNLRU5EX0ZFQVRVUkVTKVxcbiA5MzM6XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbiA5MzQ6XFx0XFx0XFx0dmhvc3Rfc2V0X2JhY2tlbmRfZmVhdHVyZXMoXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYsIGZlYXR1cmVzKTtcXG4gOTM1OlxcdFxcdFxcdHJldHVybiAwO1xcbiA5MzY6XFx0XFx0ZGVmYXVsdDpcXG4gOTM3OlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbiA5Mzg6XFx0XFx0XFx0ciA9IHZob3N0X2Rldl9pb2N0bChcXHUwMDI2dnNvY2stXFx1MDAzZWRldiwgaW9jdGwsIGFyZ3ApO1xcbiA5Mzk6XFx0XFx0XFx0aWYgKHIgPT0gLUVOT0lPQ1RMQ01EKVxcbiA5NDA6XFx0XFx0XFx0XFx0ciA9IHZob3N0X3ZyaW5nX2lvY3RsKFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2LCBpb2N0bCwgYXJncCk7XFxuIDk0MTpcXHRcXHRcXHRlbHNlXFxuIDk0MjpcXHRcXHRcXHRcXHR2aG9zdF92c29ja19mbHVzaCh2c29jayk7XFxuIDk0MzpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnZzb2NrLVxcdTAwM2VkZXYubXV0ZXgpO1xcbiA5NDQ6XFx0XFx0XFx0cmV0dXJuIHI7XFxuIDk0NTpcXHRcXHR9XFxuIDk0NjpcXHR9XFxuIDk0NzpcXHRcXG4gOTQ4OlxcdHN0YXRpYyBzc2l6ZV90IHZob3N0X3Zzb2NrX2Nocl9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKVxcbiA5NDk6XFx0e1xcbiA5NTA6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLVxcdTAwM2VraV9maWxwO1xcbiA5NTE6XFx0XFx0c3RydWN0IHZob3N0X3Zzb2NrICp2c29jayA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gOTUyOlxcdFxcdHN0cnVjdCB2aG9zdF9kZXYgKmRldiA9IFxcdTAwMjZ2c29jay1cXHUwMDNlZGV2O1xcbiA5NTM6XFx0XFx0aW50IG5vYmxvY2sgPSBmaWxlLVxcdTAwM2VmX2ZsYWdzIFxcdTAwMjYgT19OT05CTE9DSztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MDEuNDE2MDEwNjIyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Nzc3NzEzNTA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRvIGJlc3QgZnV6eiB0aGUgYHZob3N0LW5ldGAgYW5kIGB2aG9zdC12c29ja2AgY29kZS4gVGhlIGVudHJ5IHBvaW50cyBzZWVtIHRvIGJlIHJlYWNoYWJsZSB0aHJvdWdoIGBWSE9TVF9TRVRfRkVBVFVSRVNgIGlvY3RscyBvbiBgL2Rldi92aG9zdC1uZXRgIGFuZCBgL2Rldi92aG9zdC12c29ja2AuIEkgc2hvdWxkIHRhcmdldCBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGFuZCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhcyBteSBwcmltYXJ5IGZ1enppbmcgdGFyZ2V0cy5cblxuU3BlY2lmaWNhbGx5LCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICppb2N0bCBoYW5kbGVycyouIFRoYXQncyBncmVhdDsgdGhvc2UgYXJlIGlkZWFsIGVudHJ5IHBvaW50cy4gIEkgbmVlZCB0byByZW1lbWJlciB0aGUgc3BlY2lmaWMgdW5kZXJseWluZyBmdW5jdGlvbnMgdGhhdCB3ZXJlIG1vZGlmaWVkIGluIHRoaXMgY29udGV4dCwgd2hpY2ggYXJlIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AsIGFuZCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC5cblxuVGhlIHByb21wdCB0ZWxscyBtZSB0byBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zLCBidXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCBhcmUgc3RhdGljLiBTaG91bGQgSSBzdGlsbCBsaXN0IHRoZW0/IEhtbSwgdGhlIHByb21wdCAqZG9lcyogc2F5IHRvIHByZWZlciBub24tc3RhdGljIG9uZXMgYnV0IGRvZXNuJ3QgZm9yYmlkIHN0YXRpYyBvbmVzLCBhbmQgaXQgZG9lcyBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGF0aWMgYW5kIGlubGluZWQuIFNpbmNlIHRoZXkgYXJlbid0ICp0aW55KiBmdW5jdGlvbnMsIHRoZXkgbWlnaHQgbm90IGJlIGlubGluZWQuIEJ1dCB0aGVuIGFnYWluLCBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlICphbHNvKiBzdGF0aWMhIFVnaC4gU28gSSBzaG91bGQgbGlzdCB0aGVtIGFueXdheT9cblxuV2FpdCwgZ29vZCBuZXdzISBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBpcyBleHBvcnRlZCwgd2l0aCBgRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKWAuIFRoYXQgbWFrZXMgdGhpbmdzIGVhc2llci5cblxuTm93LCBsZXQncyBjb25maXJtIHRoZSBlbnRyeSBwb2ludHMuIEkgc2hvdWxkIGNoZWNrIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCBpbiB0aGVpciBzb3VyY2UgZmlsZXMgdG8gc2VlIGhvdyB0aGV5J3JlIHVzZWQuIEFoYSEgVGhleSBhcmUgYXNzaWduZWQgdG8gYGZpbGVfb3BlcmF0aW9ucy51bmxvY2tlZF9pb2N0bGAuIFBlcmZlY3QsIHRoYXQncyB3aGF0IEkgbmVlZGVkIHRvIHNlZS4gVGhleSBhcmUgaW5kZWVkIGVudHJ5IHBvaW50cy5cblxuRmluYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSByZXF1aXJlZCBrZXJuZWwgY29uZmlndXJhdGlvbnMgZm9yIGB2aG9zdF9uZXRgIGFuZCBgdmhvc3RfdnNvY2tgIHRvIG1ha2Ugc3VyZSB0aGUgZnV6emluZyBzZXR1cCBpcyBjb3JyZWN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDAxNywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjA5LjE5MzE0ODQzMVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA3OTk2NDEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVkhPU1RfTkVUXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvdmhvc3QvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L0tjb25maWc9MzI9aWYgVkhPU1RfTUVOVVxcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zMy1cXG5kcml2ZXJzL3Zob3N0L0tjb25maWc6MzQ6Y29uZmlnIFZIT1NUX05FVFxcbmRyaXZlcnMvdmhvc3QvS2NvbmZpZy0zNS1cXHR0cmlzdGF0ZSBcXFwiSG9zdCBrZXJuZWwgYWNjZWxlcmF0b3IgZm9yIHZpcnRpbyBuZXRcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjEwLjI3MzExNzY4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NjQ1NDc0ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipLY29uZmlnIERpdmUgZm9yIFZIT1NUIFN1cHBvcnQqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0aGlzIHNvcnRlZC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVmaW5lZC4gVGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQgaXMgd2l0aGluIHRoZSByZWxldmFudCBkcml2ZXIgY29uZmlndXJhdGlvbi4gR2l2ZW4gdGhhdCB3ZSdyZSB0YWxraW5nIGFib3V0IHZpcnR1YWwgaG9zdCBuZXR3b3JrIGZ1bmN0aW9uYWxpdHksIHRoZSBgZHJpdmVycy92aG9zdGAgZGlyZWN0b3J5IGlzIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50LiBJJ2xsIG5lZWQgdG8gb3BlbiBhbmQgZXhhbWluZSB0aGUgYEtjb25maWdgIGZpbGUgd2l0aGluIHRoYXQgZGlyZWN0b3J5IChgZHJpdmVycy92aG9zdC9LY29uZmlnYCkgYW5kIHNlZSBob3cgdGhvc2UgdHdvIHNwZWNpZmljIG9wdGlvbnMgYXJlIGRlY2xhcmVkLiBUaGF0J3Mgd2hlcmUgdGhlIGNvbmRpdGlvbmFsIGxvZ2ljLCBkZXBlbmRlbmNpZXMsIGFuZCBkZWZhdWx0IHZhbHVlcyB3aWxsIHJlc2lkZSwgd2hpY2ggaXMgZXNzZW50aWFsIGluZm9ybWF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTA5NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjEzLjkzNzY2Nzc0M1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MzQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgVkhPU1RfSU9UTEJcXG4gICAzOlxcdFxcdHRyaXN0YXRlXFxuICAgNDpcXHRcXHRoZWxwXFxuICAgNTpcXHRcXHQgIEdlbmVyaWMgSU9UTEIgaW1wbGVtZW50YXRpb24gZm9yIHZob3N0IGFuZCB2cmluZ2guXFxuICAgNjpcXHRcXHQgIFRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGFueSBkcml2ZXIgd2hpY2ggbmVlZHMgdG8gc3VwcG9ydFxcbiAgIDc6XFx0XFx0ICBhbiBJT01NVSBpbiBzb2Z0d2FyZS5cXG4gICA4OlxcdFxcbiAgIDk6XFx0Y29uZmlnIFZIT1NUX1JJTkdcXG4gIDEwOlxcdFxcdHRyaXN0YXRlXFxuICAxMTpcXHRcXHRzZWxlY3QgVkhPU1RfSU9UTEJcXG4gIDEyOlxcdFxcdGhlbHBcXG4gIDEzOlxcdFxcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcXG4gIDE0OlxcdFxcdCAgdGhlIGhvc3Qgc2lkZSBvZiBhIHZpcnRpbyByaW5nLlxcbiAgMTU6XFx0XFxuICAxNjpcXHRjb25maWcgVkhPU1RfVEFTS1xcbiAgMTc6XFx0XFx0Ym9vbFxcbiAgMTg6XFx0XFx0ZGVmYXVsdCBuXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBWSE9TVFxcbiAgMjE6XFx0XFx0dHJpc3RhdGVcXG4gIDIyOlxcdFxcdHNlbGVjdCBWSE9TVF9JT1RMQlxcbiAgMjM6XFx0XFx0c2VsZWN0IFZIT1NUX1RBU0tcXG4gIDI0OlxcdFxcdGhlbHBcXG4gIDI1OlxcdFxcdCAgVGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgYW55IGRyaXZlciB3aGljaCBuZWVkcyB0byBhY2Nlc3NcXG4gIDI2OlxcdFxcdCAgdGhlIGNvcmUgb2Ygdmhvc3QuXFxuICAyNzpcXHRcXG4gIDI4OlxcdG1lbnVjb25maWcgVkhPU1RfTUVOVVxcbiAgMjk6XFx0XFx0Ym9vbCBcXFwiVkhPU1QgZHJpdmVyc1xcXCJcXG4gIDMwOlxcdFxcdGRlZmF1bHQgeVxcbiAgMzE6XFx0XFxuICAzMjpcXHRpZiBWSE9TVF9NRU5VXFxuICAzMzpcXHRcXG4gIDM0OlxcdGNvbmZpZyBWSE9TVF9ORVRcXG4gIDM1OlxcdFxcdHRyaXN0YXRlIFxcXCJIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldFxcXCJcXG4gIDM2OlxcdFxcdGRlcGVuZHMgb24gTkVUIFxcdTAwMjZcXHUwMDI2IEVWRU5URkQgXFx1MDAyNlxcdTAwMjYgKFRVTiB8fCAhVFVOKSBcXHUwMDI2XFx1MDAyNiAoVEFQIHx8ICFUQVApXFxuICAzNzpcXHRcXHRzZWxlY3QgVkhPU1RcXG4gIDM4OlxcdFxcdGhlbHBcXG4gIDM5OlxcdFxcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxcbiAgNDA6XFx0XFx0ICBndWVzdCBuZXR3b3JraW5nIHdpdGggdmlydGlvX25ldC4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdmlydGlvX25ldFxcbiAgNDE6XFx0XFx0ICBtb2R1bGUgaXRzZWxmIHdoaWNoIG5lZWRzIHRvIGJlIGxvYWRlZCBpbiBndWVzdCBrZXJuZWwuXFxuICA0MjpcXHRcXG4gIDQzOlxcdFxcdCAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsXFxuICA0NDpcXHRcXHQgIGJlIGNhbGxlZCB2aG9zdF9uZXQuXFxuICA0NTpcXHRcXG4gIDQ2OlxcdGNvbmZpZyBWSE9TVF9TQ1NJXFxuICA0NzpcXHRcXHR0cmlzdGF0ZSBcXFwiVkhPU1RfU0NTSSBUQ00gZmFicmljIGRyaXZlclxcXCJcXG4gIDQ4OlxcdFxcdGRlcGVuZHMgb24gVEFSR0VUX0NPUkUgXFx1MDAyNlxcdTAwMjYgRVZFTlRGRFxcbiAgNDk6XFx0XFx0c2VsZWN0IFZIT1NUXFxuICA1MDpcXHRcXHRzZWxlY3QgU0dfUE9PTFxcbiAgNTE6XFx0XFx0ZGVmYXVsdCBuXFxuICA1MjpcXHRcXHRoZWxwXFxuICA1MzpcXHRcXHRTYXkgTSBoZXJlIHRvIGVuYWJsZSB0aGUgdmhvc3Rfc2NzaSBUQ00gZmFicmljIG1vZHVsZVxcbiAgNTQ6XFx0XFx0Zm9yIHVzZSB3aXRoIHZpcnRpby1zY3NpIGd1ZXN0c1xcbiAgNTU6XFx0XFxuICA1NjpcXHRjb25maWcgVkhPU1RfVlNPQ0tcXG4gIDU3OlxcdFxcdHRyaXN0YXRlIFxcXCJ2aG9zdCB2aXJ0aW8tdnNvY2sgZHJpdmVyXFxcIlxcbiAgNTg6XFx0XFx0ZGVwZW5kcyBvbiBWU09DS0VUUyBcXHUwMDI2XFx1MDAyNiBFVkVOVEZEXFxuICA1OTpcXHRcXHRzZWxlY3QgVkhPU1RcXG4gIDYwOlxcdFxcdHNlbGVjdCBWSVJUSU9fVlNPQ0tFVFNfQ09NTU9OXFxuICA2MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDYyOlxcdFxcdGhlbHBcXG4gIDYzOlxcdFxcdFRoaXMga2VybmVsIG1vZHVsZSBjYW4gYmUgbG9hZGVkIGluIHRoZSBob3N0IGtlcm5lbCB0byBwcm92aWRlIEFGX1ZTT0NLXFxuICA2NDpcXHRcXHRzb2NrZXRzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggZ3Vlc3RzLiAgVGhlIGd1ZXN0cyBtdXN0IGhhdmUgdGhlXFxuICA2NTpcXHRcXHR2aXJ0aW9fdHJhbnNwb3J0LmtvIGRyaXZlciBsb2FkZWQgdG8gdXNlIHRoZSB2aXJ0aW8tdnNvY2sgZGV2aWNlLlxcbiAgNjY6XFx0XFxuICA2NzpcXHRcXHRUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkXFxuICA2ODpcXHRcXHR2aG9zdF92c29jay5cXG4gIDY5OlxcdFxcbiAgNzA6XFx0Y29uZmlnIFZIT1NUX1ZEUEFcXG4gIDcxOlxcdFxcdHRyaXN0YXRlIFxcXCJWaG9zdCBkcml2ZXIgZm9yIHZEUEEtYmFzZWQgYmFja2VuZFxcXCJcXG4gIDcyOlxcdFxcdGRlcGVuZHMgb24gRVZFTlRGRFxcbiAgNzM6XFx0XFx0c2VsZWN0IFZIT1NUXFxuICA3NDpcXHRcXHRzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSXFxuICA3NTpcXHRcXHRkZXBlbmRzIG9uIFZEUEFcXG4gIDc2OlxcdFxcdGhlbHBcXG4gIDc3OlxcdFxcdCAgVGhpcyBrZXJuZWwgbW9kdWxlIGNhbiBiZSBsb2FkZWQgaW4gaG9zdCBrZXJuZWwgdG8gYWNjZWxlcmF0ZVxcbiAgNzg6XFx0XFx0ICBndWVzdCB2aXJ0aW8gZGV2aWNlcyB3aXRoIHRoZSB2RFBBLWJhc2VkIGJhY2tlbmRzLlxcbiAgNzk6XFx0XFxuICA4MDpcXHRcXHQgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGVcXG4gIDgxOlxcdFxcdCAgd2lsbCBiZSBjYWxsZWQgdmhvc3RfdmRwYS5cXG4gIDgyOlxcdFxcbiAgODM6XFx0Y29uZmlnIFZIT1NUX0NST1NTX0VORElBTl9MRUdBQ1lcXG4gIDg0OlxcdFxcdGJvb2wgXFxcIkNyb3NzLWVuZGlhbiBzdXBwb3J0IGZvciB2aG9zdFxcXCJcXG4gIDg1OlxcdFxcdGRlZmF1bHQgblxcbiAgODY6XFx0XFx0aGVscFxcbiAgODc6XFx0XFx0ICBUaGlzIG9wdGlvbiBhbGxvd3Mgdmhvc3QgdG8gc3VwcG9ydCBndWVzdHMgd2l0aCBhIGRpZmZlcmVudCBieXRlXFxuICA4ODpcXHRcXHQgIG9yZGVyaW5nIGZyb20gaG9zdCB3aGlsZSB1c2luZyBsZWdhY3kgdmlydGlvLlxcbiAgODk6XFx0XFxuICA5MDpcXHRcXHQgIFVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gY29udHJvbCB0aGUgZmVhdHVyZSB1c2luZyB0aGVcXG4gIDkxOlxcdFxcdCAgVkhPU1RfU0VUX1ZSSU5HX0VORElBTiBhbmQgVkhPU1RfR0VUX1ZSSU5HX0VORElBTiBpb2N0bHMuXFxuICA5MjpcXHRcXG4gIDkzOlxcdFxcdCAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBhIGZldyBwbGF0Zm9ybXMgKHBwYzY0IGFuZCBhcm02NCkuIFNpbmNlIGl0XFxuICA5NDpcXHRcXHQgIGFkZHMgc29tZSBvdmVyaGVhZCwgaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC5cXG4gIDk1OlxcdFxcbiAgOTY6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBcXFwiTlxcXCIuXFxuICA5NzpcXHRcXG4gIDk4OlxcdGNvbmZpZyBWSE9TVF9FTkFCTEVfRk9SS19PV05FUl9DT05UUk9MXFxuICA5OTpcXHRcXHRib29sIFxcXCJFbmFibGUgVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxcXCJcXG4gMTAwOlxcdFxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoxMy45Mzc3NTM2MjNaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjE0ODEzMzk2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgVkhPU1QgTW9kdWxlIERlcGVuZGVuY2llcyBhbmQgQVBJIERlc2lnbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIHZob3N0IG1vZHVsZXMuIEkgbmVlZCBib3RoIGBWSE9TVF9ORVRgIGFuZCBgVkhPU1RfVlNPQ0tgIHRvIGJlIGVuYWJsZWQuIEkgc2VlIHRoYXQgYFZIT1NUX05FVGAgcmVsaWVzIG9uIGEgZmV3IG90aGVyczogYE5FVGAsIGBFVkVOVEZEYCwgYW5kIGBUVU5gL2BUQVBgLiBUaGF0IGAoVFVOIHx8ICFUVU4pIFx1MDAyNlx1MDAyNiAoVEFQIHx8ICFUQVApYCBjb25zdHJ1Y3QgaXMgaW50ZXJlc3RpbmcsIGl0IGltcGxpZXMgdGhhdCBpdCBkb2Vzbid0ICpzdHJpY3RseSogZGVwZW5kIG9uIGVpdGhlciwgYnV0IGlmIGVpdGhlciBgVFVOYCBvciBgVEFQYCBhcmUgY29tcGlsZWQgYXMgbW9kdWxlcywgdGhlbiBgVkhPU1RfTkVUYCBhbHNvICptdXN0KiBiZSBhIG1vZHVsZS4gR29vZCB0byBrZWVwIGluIG1pbmQuIFRoZW4gdGhlcmUncyBgVkhPU1RfVlNPQ0tgLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gYFZTT0NLRVRTYCBhbmQgYEVWRU5URkRgLiBTdHJhaWdodGZvcndhcmQgZW5vdWdoIHNvIGZhci5cblxuTm93LCBJJ20gZ29pbmcgdG8gbG9vayBhIGJpdCBkZWVwZXIgYXQgc29tZSBpbnRlcm5hbCBmdW5jdGlvbnMuIExldCdzIHNlZSwgd2hhdCBhYm91dCBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCBhbmQgYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYD8gQWgsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGlzIGV4cG9ydGVkLCB0aGF0J3MgZ29vZC4gYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzYCBpcyBzdGF0aWMuIEhtbSwgd2hhdCBhYm91dCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AsIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLCBgdmhvc3RfbmV0X2lvY3RsYCwgYW5kIGB2aG9zdF92c29ja19kZXZfaW9jdGxgPyBUaGV5J3JlIGFsbCBtYXJrZWQgc3RhdGljLlxuXG5XYWl0IGEgc2Vjb25kLCB0aGUgcHJvbXB0IGlzIHJlbWluZGluZyBtZSBhYm91dCBhIHBvdGVudGlhbCBpc3N1ZSBoZXJlLiBJdCBzYXlzIHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGUgc3RhdGljIGZ1bmN0aW9ucyBhcmUgcHJvbmUgdG8gYmVpbmcgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIHRoZXJlZm9yZSBkb24ndCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMuIFNvLCBldmVuIHRob3VnaCBgdmhvc3RfbmV0X2lvY3RsYCBpcyBzdGF0aWMsIGl0ICptaWdodCogbm90IGJlIGlubGluZWQgaWYgaXQncyBhc3NpZ25lZCB0byBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGBmaWxlX29wZXJhdGlvbnNgIHN0cnVjdHVyZS4gVGhhdCdzIGEga2V5IGRpc3RpbmN0aW9uLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBmaWxlIGFuZCBzZWUgaG93IGB2aG9zdF9uZXRfaW9jdGxgIGlzIGFjdHVhbGx5IHVzZWQuIFRoYXQgd2lsbCBjbGFyaWZ5IHdoZXRoZXIgaXQncyB0cnVseSBhbiBBUEkgZW50cnlwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI2MDIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyMC4wODU4ODk3MzdaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0NDIzODIyNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aG9zdF9uZXRfaW9jdGxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jPTE3Mjg9c3RhdGljIGxvbmcgdmhvc3RfbmV0X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfbmV0ICpuKVxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzQ4LVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTc0OTpzdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcXG5kcml2ZXJzL3Zob3N0L25ldC5jLTE3NTAtXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYz0xODc3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZob3N0X25ldF9mb3BzID0ge1xcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xODgyLVxcdC5wb2xsICAgICAgICAgICA9IHZob3N0X25ldF9jaHJfcG9sbCxcXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE4ODM6XFx0LnVubG9ja2VkX2lvY3RsID0gdmhvc3RfbmV0X2lvY3RsLFxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTg4NC1cXHQuY29tcGF0X2lvY3RsICAgPSBjb21wYXRfcHRyX2lvY3RsLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyMC4zMzAxMzI0MDJaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI4NTc2OTEzOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHNpdHVhdGlvbjpcblxuKipSZXZpZXdpbmcgdGhlIHZob3N0IElvY3RsIEltcGxlbWVudGF0aW9ucyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBgdmhvc3RfbmV0X2lvY3RsYCBhbmQgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAgYXJlIGhhbmRsZWQsIGFuZCB0aGUga2V5IG9ic2VydmF0aW9uIGlzIHRoYXQgdGhleSdyZSBib3RoIGFzc2lnbmVkIHRvIHRoZSBgdW5sb2NrZWRfaW9jdGxgIGZpZWxkIHdpdGhpbiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGV5J3JlIG5vdCBpbmxpbmVkLiBUaGF0J3MgZ29vZCB0byBrbm93OyBpdCBjb25maXJtcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBhcmNoaXRlY3R1cmUuIEl0IGFsc28gbWVhbnMgSSBuZWVkIHRvIGtlZXAgdGhpcyBmYWN0IGluIG1pbmQgd2hlbiBJIGFtIGxvb2tpbmcgZm9yIHRoZSBtYWluIGNvbnRyb2wgZmxvdywgYXMgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgSSB3YW50IHRvIGZvY3VzIG9uIHRvIGZ1cnRoZXIgdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQ2LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MjQuNjE1OTA0OTE4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDIwMTI5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC92c29jay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3QvdnNvY2suYz04NTQ9c3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxcbi0tXFxuZHJpdmVycy92aG9zdC92c29jay5jLTg5Mi1cXG5kcml2ZXJzL3Zob3N0L3Zzb2NrLmM6ODkzOnN0YXRpYyBsb25nIHZob3N0X3Zzb2NrX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGlvY3RsLFxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYy04OTQtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYz05NzY9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmhvc3RfdnNvY2tfZm9wcyA9IHtcXG4tLVxcbmRyaXZlcnMvdmhvc3QvdnNvY2suYy05ODAtXFx0Lmxsc2Vla1xcdFxcdD0gbm9vcF9sbHNlZWssXFxuZHJpdmVycy92aG9zdC92c29jay5jOjk4MTpcXHQudW5sb2NrZWRfaW9jdGwgPSB2aG9zdF92c29ja19kZXZfaW9jdGwsXFxuZHJpdmVycy92aG9zdC92c29jay5jLTk4Mi1cXHQuY29tcGF0X2lvY3RsICAgPSBjb21wYXRfcHRyX2lvY3RsLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyNC42NjYxMDk2NTRaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQyODI3Njc2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLCBteSBpbml0aWFsIGFzc2Vzc21lbnQgc3VnZ2VzdHMgdGhhdCBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGFuZCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgYXJlIHByb21pc2luZyBjYW5kaWRhdGVzIGZvciBpbmNsdXNpb24gaW4gdGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QuXG5cbk5vdywgbGV0J3MgYnJvYWRlbiB0aGUgc2NvcGUuIEknbGwgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSBoYXZlbid0IG92ZXJsb29rZWQgYW55IG90aGVyIG1vZGlmaWVkIGZ1bmN0aW9ucy4gRGlnZ2luZyBpbnRvIGBkcml2ZXJzL3Zob3N0L3Zob3N0LmNgLCBJIHNlZSBhIGNvdXBsZSBvZiB0aGluZ3Mgb2YgaW50ZXJlc3QuIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzc2AgaXMgc3RhdGljLCB3aGljaCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZCwgYW5kIHRoZW4gYHZxX21ldGFfcHJlZmV0Y2hgIGlzIGFsc28gc2hvd2luZyBhcyBtb2RpZmllZCwgd2hpY2ggSSB3aWxsIG5lZWQgdG8gY29uc2lkZXIgYXMgd2VsbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMjMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzoyOS4wOTQzODk4MzZaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3ODM0NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy92aG9zdC92aG9zdC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuYz0xODg3PXN0YXRpYyBib29sIGlvdGxiX2FjY2Vzc19vayhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSxcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIwLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoxOTIxOmludCB2cV9tZXRhX3ByZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTIyLXtcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0xOTM4LX1cXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MTkzOTpFWFBPUlRfU1lNQk9MX0dQTCh2cV9tZXRhX3ByZWZldGNoKTtcXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmMtMTk0MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6MjkuMTQyMjMwMTFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQxNDY3OTE0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipNeSBJbW1lZGlhdGUgQXNzZXNzbWVudCoqXG5cbkFscmlnaHQsICpgdnFfbWV0YV9wcmVmZXRjaGAqIGlzIGZpbmFsbHkgZXhwb3J0ZWQhIFRoYXQncyBleGNlbGxlbnQgbmV3cy4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtLCB0aGF0IGRlZmluaXRlbHkgbWVhbnMgd2UgbmVlZCB0byBpbW1lZGlhdGVseSBhZGQgaXQgdG8gYEZvY3VzU3ltYm9sc2AuIFRoYXQncyBhIG5vLWJyYWluZXIuIFRoaXMgb3BlbnMgdXAgc29tZSBpbnRlcmVzdGluZyBwb3NzaWJpbGl0aWVzIGZvciBvcHRpbWl6YXRpb247IEkgc2hvdWxkIHByb2JhYmx5IGtlZXAgYSBydW5uaW5nIGxpc3Qgb2YgcG90ZW50aWFsIGFyZWFzIG9mIGltcHJvdmVtZW50LCBub3cgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdmFpbGFibGUgdG8gdXMuXG5cbk5leHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kICpob3cqIGl0J3MgYmVpbmcgdXNlZC4gTGV0J3Mgc2hpZnQgZ2VhcnMgYW5kIGV4YW1pbmUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gSSdtIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGUgSS9PIHRyYW5zbGF0aW9uIGxheWVyIGlzIGludGVyYWN0aW5nIHdpdGggdGhpcyBuZXcgcHJlZmV0Y2ggY2FwYWJpbGl0eS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IHRoZSBtZXRhZGF0YSBwcmVmZXRjaCBjb3VsZCBzdHJlYW1saW5lIG9yIHBvdGVudGlhbGx5IGJvdHRsZW5lY2sgdGhlIEkvTyBvcGVyYXRpb25zIGZyb20gdmlydHVhbCBtYWNoaW5lcywgYW5kIHdoZXRoZXIgdGhpcyBoZWxwcyB3aXRoIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzY2VuYXJpb3MuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IG1lbW9yeSBhY2Nlc3MgcGF0dGVybnMgYW5kIHdoZXRoZXIgdGhlIGV4aXN0aW5nIElPVExCIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIGFyZSBhd2FyZSBvZiB0aGlzLCB3aGljaCB3b3VsZCBiZSBjcnVjaWFsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGUgY2hhbmdlIGlzIGludGVncmF0ZWQgaW50byB0aGUgcmlnaHQgcGxhY2VzIGZvciBwZXJmb3JtYW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzozMi41NTY5MTE2ODJaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MjQ4NDk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZob3N0X2luaXRfZGV2aWNlX2lvdGxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL3Zob3N0L3Zob3N0LmM9MjMxOT1FWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIpO1xcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzIwLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYzoyMzIxOmludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzIyLXtcXG4tLVxcbmRyaXZlcnMvdmhvc3Qvdmhvc3QuYy0yMzQ4LX1cXG5kcml2ZXJzL3Zob3N0L3Zob3N0LmM6MjM0OTpFWFBPUlRfU1lNQk9MX0dQTCh2aG9zdF9pbml0X2RldmljZV9pb3RsYik7XFxuZHJpdmVycy92aG9zdC92aG9zdC5jLTIzNTAtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjMyLjYwMzE2MjgyN1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MDk4OTU2NTA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFJlYXNvbmluZyBmb3IgRm9jdXNpbmcgb24gVGhlc2Ugdmhvc3QgU3ltYm9scyoqXG5cbk9rYXksIHNvIEknbSBhbmFseXppbmcgdGhlIHZob3N0IGNvZGUgYW5kIGRldGVybWluaW5nIHRoZSBtb3N0IHJlbGV2YW50IHN5bWJvbHMgZm9yIGZ1enppbmcgb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLiBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHNvIEknbSBtYWtpbmcgYSBtZW50YWwgbm90ZSBvZiB0aGF0LiBCYXNlZCBvbiB0aGF0LCBoZXJlJ3Mgd2hhdCBJJ20gdGhpbmtpbmcgYXJlIG15IHByaW1hcnkgdGFyZ2V0czpcblxuKiAgIGB2aG9zdF9uZXRfaW9jdGxgXG4qICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGBcbiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYFxuKiAgIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmBcbiogICBgdnFfbWV0YV9wcmVmZXRjaGBcblxuTm93LCB0aGUgcGF0Y2gncyBjb3JlIHJldm9sdmVzIGFyb3VuZCBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlc2UgYXJlIGV4cG9ydGVkIHN5bWJvbHMsIG9yIGlmIHRoZXkgYXJlIHN0YXRpYy4gQWgsIHRoZXkgYXJlIHN0YXRpYy4gQnV0LCBldmVuIHRob3VnaCB0aGUgZ3VpZGFuY2UgcHJlZmVycyBub24tc3RhdGljIGVudHJ5cG9pbnRzLCBpZiB0aGV5IGFyZSBub3QgaW5saW5lZCwgc3l6a2FsbGVyICpjYW4qIHJlc29sdmUgc3RhdGljIGZ1bmN0aW9ucy4gU28sIHdoaWxlIEknbSBiZWluZyBtaW5kZnVsIG9mIHRoZSBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucywgdGhlIHF1ZXN0aW9uIGJlY29tZXMsIGlzIGl0IGJldHRlciB0byBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiBhbmQgaW5jbHVkZSB0aGVtP1xuXG5XYWl0IGEgbWludXRlLCB0aGUgcHJvbXB0ICpzcGVjaWZpY2FsbHkqIHNheXMgdG8gcHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyEgT2theSwgbGV0IG1lIHRyaW0gdGhlIGxpc3QgYmFzZWQgb24gdGhhdC5cblxuKiAgIGB2aG9zdF9uZXRfaW9jdGxgXG4qICAgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGBcbiogICBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYFxuKiAgIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmBcbiogICBgdnFfbWV0YV9wcmVmZXRjaGBcblxuTm93LCBsZXQncyBkb3VibGUgY2hlY2sgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYC4gUmlnaHQsIHRoZXkgYXJlIGNhbGxlZCBmcm9tIGB2aG9zdF9uZXRfaW9jdGxgIGFuZCBgdmhvc3RfdnNvY2tfZGV2X2lvY3RsYCByZXNwZWN0aXZlbHkuIFNpbmNlIEknbSBmb2N1c2luZyBvbiB0aGUgaW9jdGwgZW50cnlwb2ludHMsIGluY2x1ZGluZyB0aGUgc2V0XFxfZmVhdHVyZXMgZnVuY3Rpb25zIG1ha2VzIHNlbnNlLiBJIGNhbiBhbHdheXMgcmVtb3ZlIHRoZW0gbGF0ZXIgaWYgdGhleSBhcmUgaW5saW5lZCwgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBpbmNsdWRlIHRoZW0gZm9yIG5vdy5cblxuU28sIEknbGwgYWRkIHRoZW0gdG8gdGhlIGxpc3QsIHdpdGggdGhhdCBjYXZlYXQuXG5cbk5vdywgbGV0J3MgbG9vayBhdCB0aGUga2VybmVsIGNvbmZpZ3MgcmVxdWlyZWQuIEkgc2VlIHRoYXQgdGhlc2UgYXJlIHRoZSByZWxldmFudCBjb25maWdzOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZIT1NUYCAod2hpY2ggaXMgc2VsZWN0ZWQgYnkgdGhlIGFib3ZlIHR3byksIGBWU09DS0VUU2AgKHdoaWNoIFZIT1NUX1ZTT0NLIGRlcGVuZHMgb24pLCBhbmQgYEVWRU5URkRgICh3aGljaCBib3RoIGRlcGVuZCBvbikuIEl0J3Mgd29ydGggZGlnZ2luZyBhIGJpdCBpbnRvIHRoZSBgVlNPQ0tFVFNgIGNvbmZpZyB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIGl0cyBpbXBsaWNhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDg3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQwLjcwMjEyMjIwNVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODY2NDQ1ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFZTT0NLRVRTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC92bXdfdnNvY2svS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdm13X3Zzb2NrL0tjb25maWctNS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWc6Njpjb25maWcgVlNPQ0tFVFNcXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiVmlydHVhbCBTb2NrZXQgcHJvdG9jb2xcXFwiXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctMTgtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjE5OmNvbmZpZyBWU09DS0VUU19ESUFHXFxubmV0L3Ztd192c29jay9LY29uZmlnLTIwLVxcdHRyaXN0YXRlIFxcXCJWaXJ0dWFsIFNvY2tldHMgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctMjgtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjI5OmNvbmZpZyBWU09DS0VUU19MT09QQkFDS1xcbm5ldC92bXdfdnNvY2svS2NvbmZpZy0zMC1cXHR0cmlzdGF0ZSBcXFwiVmlydHVhbCBTb2NrZXRzIGxvb3BiYWNrIHRyYW5zcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6NDAuNzg4NzcxNDQ0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4ODI5NDc4MDgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIE15IEFzc3VtcHRpb25zKipcblxuQWxyaWdodCwgc28gSSdtIHByZXR0eSBzdXJlIGBWU09DS0VUU2AgaXMgdGhlIHJpZ2h0IGRpcmVjdGlvbiBoZXJlLiBIb3dldmVyLCBnaXZlbiBteSBleHBlcmllbmNlLCBJJ3ZlIGxlYXJuZWQgdG8gYWx3YXlzIGRvdWJsZS1jaGVjayB0aGUgb2J2aW91cyBhc3N1bXB0aW9ucy4gSnVzdCBiZWNhdXNlIHNvbWV0aGluZyAqc2hvdWxkKiBiZSBkb2Vzbid0IG1lYW4gaXQgKmlzKi4gVGltZSB0byBjb25maXJtIHRoYXQgYEVWRU5URkRgIGlzIGFjdHVhbGx5IGVuYWJsZWQuIEknZCB0eXBpY2FsbHkgZXhwZWN0IGl0IHRvIGJlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgZXNwZWNpYWxseSB3aGVuIGRlYnVnZ2luZy4gVGhpcyBjb25maXJtYXRpb24gY291bGQgc2F2ZSBtZSBmcm9tIGNoYXNpbmcgYSByZWQgaGVycmluZyBsYXRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYyOTcsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzo0NC42NzE3MjE1OTJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjE1ODQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBFVkVOVEZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluaXQvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbml0L0tjb25maWc9MTg3OD1jb25maWcgVElNRVJGRFxcbi0tXFxuaW5pdC9LY29uZmlnLTE4ODYtXFxuaW5pdC9LY29uZmlnOjE4ODc6Y29uZmlnIEVWRU5URkRcXG5pbml0L0tjb25maWctMTg4OC1cXHRib29sIFxcXCJFbmFibGUgZXZlbnRmZCgpIHN5c3RlbSBjYWxsXFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTM6NDQuNzE2OTQyMjE2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzNDkzNzUxOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSBmYW1pbGlhciB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uOlxuXG4qKktlcm5lbCBDb25maWd1cmF0aW9uIERpZ3Jlc3Npb25zKipcblxuQWxyaWdodCwgc28gYEVWRU5URkRgIGlzIGRlZmluaXRlbHkgYSBjb3JlIGZlYXR1cmUgYW5kIHBhcnQgb2YgdGhlIGBpbml0L0tjb25maWdgIGZpbGUsIHdoaWNoIGlzIGV4YWN0bHkgd2hlcmUgSSdkIGV4cGVjdCBpdCB0byBiZS4gTm93LCBsZXQncyBzZWUsIHdoYXQgd2FzIHRoYXQgb3RoZXIgY29uZmlnIHN5bWJvbC4uLiBBaCwgeWVzLCBgVklSVElPX1ZTT0NLRVRTX0NPTU1PTmAuIEkgcmVtZW1iZXIgdGhhdCdzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGBWSE9TVF9WU09DS2AgbW9kdWxlLiBJdCdzIHNlbGVjdGVkIHdoZW4gYFZIT1NUX1ZTT0NLYCBpcyBhY3RpdmF0ZWQsIHdoaWNoIG1ha2VzIHNlbnNlIGJlY2F1c2UgaXQgcHJvdmlkZXMgdGhlIHVuZGVybHlpbmcsIGNvbW1vbiBwaWVjZXMgbmVjZXNzYXJ5IGZvciB0aGUgdmhvc3QtYmFzZWQgdmlydGlvLXZzb2NrIGltcGxlbWVudGF0aW9uLiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBkZXBlbmRlbmN5IHdoZW4gSSdtIHdvcmtpbmcgd2l0aCB0aGUgVlNPQ0sgc3RhY2suIE1ha2VzIHNlbnNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjU0MywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQ4LjA2NjMxOTc3OVoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU1NDAyMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFZJUlRJT19WU09DS0VUU19DT01NT05cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Ztd192c29jay9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC92bXdfdnNvY2svS2NvbmZpZz01Mz1jb25maWcgVklSVElPX1ZTT0NLRVRTXFxuLS1cXG5uZXQvdm13X3Zzb2NrL0tjb25maWctNjUtXFxubmV0L3Ztd192c29jay9LY29uZmlnOjY2OmNvbmZpZyBWSVJUSU9fVlNPQ0tFVFNfQ09NTU9OXFxubmV0L3Ztd192c29jay9LY29uZmlnLTY3LVxcdHRyaXN0YXRlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjQ4LjExMTg2NTI4M1oiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTI4MTA2NDA0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFZob3N0IFN1YnN5c3RlbSBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IGEgcGF0Y2ggaGVyZSBhZmZlY3RpbmcgdGhlIHZob3N0IHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGB2aG9zdC1uZXRgIGFuZCBgdmhvc3QtdnNvY2tgLiBJIHNlZSB0aGF0IHNpbmNlIHRoZXNlIGFyZSB0aGUgc2VsZWN0ZWQgY29tcG9uZW50cywgSSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGVpciBzZWxlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBwYXRjaCByZXF1aXJlcyB0aGF0IHRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkOiBgVkhPU1RfTkVUYCwgYFZIT1NUX1ZTT0NLYCwgYFZTT0NLRVRTYCwgYW5kIGBFVkVOVEZEYC4gSSBhbHNvIHNlZSB0aGF0IGBWSE9TVF9ORVRgIGltcGxpY2l0bHkgcmVsaWVzIG9uIGBORVRgLCB3aGljaCBpcyBzdGFuZGFyZCwgYW5kIHRoYXQgYFZIT1NUX1ZTT0NLYCBkZXBlbmRzIG9uIGBWU09DS0VUU2AgYW5kIGBFVkVOVEZEYC5cblxuTm93LCBkaWdnaW5nIGludG8gdGhlIGNoYW5nZXMsIGl0IGxvb2tzIGxpa2UgdGhlcmUncyBhIGJ1ZyBmaXggaW4gYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGFuZCBgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzYCB3aGVyZSBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYCB3YXMgYmVpbmcgY2FsbGVkIGluYXBwcm9wcmlhdGVseSB3aGVuIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIHdhc24ndCBzZXQuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgIGFuZCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgIHRvIGNvcnJlY3RseSBjbGVhciB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRlIHZpcnRxdWV1ZSBhY2Nlc3MuIFRoZXJlIGlzIGFsc28gYSByZXR1cm4gdmFsdWUgYnVnIGZpeCBpbiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBUaGVzZSBhcmUgZGVmaW5pdGVseSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0aW5nIHRoZSB2aG9zdCBzdWJzeXN0ZW0uIFRoZSBjb2RlIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gYC9kZXYvdmhvc3QtbmV0YCBhbmQgYC9kZXYvdmhvc3QtdnNvY2tgLCB3aGljaCBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBmdXp6ZWQgdGhvcm91Z2hseS5cblxuTG9va2luZyBhdCB0aGUgY29kZSBsb2NhdGlvbnMgZm9yIHRoZSBrZXkgZnVuY3Rpb25zLCBJIHNlZSB0aGF0IEknbGwgYmUgaW50ZXJlc3RlZCBpbiBgdmhvc3RfbmV0X2lvY3RsYCwgYHZob3N0X3Zzb2NrX2Rldl9pb2N0bGAsIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJgLCBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGJgLCBgdnFfbWV0YV9wcmVmZXRjaGAsIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCwgYW5kIGB2aG9zdF92c29ja19zZXRfZmVhdHVyZXNgLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCByZXNpZGVzIGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AgcmVzaWRlcyBpbiBgZHJpdmVycy92aG9zdC92c29jay5jYCwgc28gSSd2ZSBnb3QgdGhlIGNvcnJlY3QgbG9jYXRpb24uXG5cblRoZSBwYXRjaCBtb2RpZmllcyBgZHJpdmVycy92aG9zdC92aG9zdC5jYCwgYGRyaXZlcnMvdmhvc3QvbmV0LmNgLCBhbmQgYGRyaXZlcnMvdmhvc3QvdnNvY2suY2AuIFRoZSBjaGFuZ2VzIGFyZSB1bmRvdWJ0ZWRseSBmdW5jdGlvbmFsIGFuZCByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UuIEknbSBzYXRpc2ZpZWQgdGhhdCB0aGlzIGlzIGEgd2VsbC1zY29wZWQgY2hhbmdlLlxuXG5UaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY4OTYsIk91dHB1dFRva2VucyI6MjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjM5MjkzMTc0OFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc0NzQ3NDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJWSE9TVF9ORVRcIixcbiAgICBcIlZIT1NUX1ZTT0NLXCIsXG4gICAgXCJWU09DS0VUU1wiLFxuICAgIFwiRVZFTlRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZob3N0X25ldF9pb2N0bFwiLFxuICAgIFwidmhvc3RfdnNvY2tfZGV2X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGJcIixcbiAgICBcInZob3N0X2luaXRfZGV2aWNlX2lvdGxiXCIsXG4gICAgXCJ2cV9tZXRhX3ByZWZldGNoXCIsXG4gICAgXCJ2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzXCIsXG4gICAgXCJ2aG9zdF92c29ja19zZXRfZmVhdHVyZXNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgdmhvc3Qgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgZml4aW5nIElPVExCIGNsZWFyaW5nIGxvZ2ljIHdoZW4gVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNIGlzIG5vdCBzZXQgaW4gdmhvc3QtbmV0IGFuZCB2aG9zdC12c29jay4gSXQgYWxzbyBmaXhlcyBhIHJldHVybiB2YWx1ZSBidWcgaW4gdGhlIGZlYXR1cmUgc2V0dGluZyBmdW5jdGlvbnMuIFRoZSBtb2RpZmllZCBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9kZXYvdmhvc3QtbmV0IGFuZCAvZGV2L3Zob3N0LXZzb2NrLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlZIT1NUX05FVFwiLFxuICAgIFwiVkhPU1RfVlNPQ0tcIixcbiAgICBcIlZTT0NLRVRTXCIsXG4gICAgXCJFVkVOVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidmhvc3RfbmV0X2lvY3RsXCIsXG4gICAgXCJ2aG9zdF92c29ja19kZXZfaW9jdGxcIixcbiAgICBcInZob3N0X2NsZWFyX2RldmljZV9pb3RsYlwiLFxuICAgIFwidmhvc3RfaW5pdF9kZXZpY2VfaW90bGJcIixcbiAgICBcInZxX21ldGFfcHJlZmV0Y2hcIixcbiAgICBcInZob3N0X25ldF9zZXRfZmVhdHVyZXNcIixcbiAgICBcInZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSB2aG9zdCBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBmaXhpbmcgSU9UTEIgY2xlYXJpbmcgbG9naWMgd2hlbiBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0gaXMgbm90IHNldCBpbiB2aG9zdC1uZXQgYW5kIHZob3N0LXZzb2NrLiBJdCBhbHNvIGZpeGVzIGEgcmV0dXJuIHZhbHVlIGJ1ZyBpbiB0aGUgZmVhdHVyZSBzZXR0aW5nIGZ1bmN0aW9ucy4gVGhlIG1vZGlmaWVkIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL2Rldi92aG9zdC1uZXQgYW5kIC9kZXYvdmhvc3QtdnNvY2ssIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjQ2NzY4NDI3NVoiLCJTZXEiOjI5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAyNTQ5MDUyOTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxMzo1OS40NjgxMzc3MTVaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NTAyNTQ0NDc5NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHJlc3NlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSB2aG9zdCBkZXZpY2UgSU9UTEIgYW5kIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgKGB2cS1cXHUwMDNlZGVzY2AsIGB2cS1cXHUwMDNlYXZhaWxgLCBgdnEtXFx1MDAzZXVzZWRgKS4gSXQgZW5zdXJlcyB0aGF0IHdoZW4gdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgaXMgY2xlYXJlZCwgdGhlIElPVExCIGlzIHByb3Blcmx5IGZyZWVkIGFuZCB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyBhcmUgaW52YWxpZGF0ZWQgKHNldCB0byBOVUxMKS4gSXQgYWxzbyBhZGRzIGEgY2hlY2sgaW4gYHZxX21ldGFfcHJlZmV0Y2hgIHRvIHByZXZlbnQgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpZiB0aGUgYWNjZXNzIHBvaW50ZXJzIGFyZSBub3Qgc2V0LiBUaGVzZSBjaGFuZ2VzIGZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXRpZXMsIG9yIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgY2F1c2VkIGJ5IHN0YWxlIHBvaW50ZXJzLiBUaGVyZSBhcmUgbm8gbmV3IHN0cnVjdHVyZXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBjb3BpZWQgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgaXMgdGhlcmUgYW55IGxvZ2ljIHRoYXQgZXhwb3NlcyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuIFN0YW5kYXJkIEtBU0FOICh3aGljaCBkZXRlY3RzIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzKSBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcgKHdoaWNoIGNhdGNoZXMgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcykgYXJlIGZ1bGx5IGNhcGFibGUgb2YgZGV0ZWN0aW5nIHRoZSBidWdzIHRoaXMgcGF0Y2ggYWltcyB0byBmaXguIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5MmEyYWE4ZjRlMzc2MTRiYTMxMTcyZWZjMjNjMzlkNzJjYzlmODA2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMDU6MTI6MzggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuY1xuaW5kZXggNzdiNTlmNDliZGRiMy4uNjQ2NzFjZjc3YTM1ZSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmNcbisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmNcbkBAIC0xNjczLDYgKzE2NzMsNyBAQCBzdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbiBzdGF0aWMgaW50IHZob3N0X25ldF9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X25ldCAqbiwgY29uc3QgdTY0ICpmZWF0dXJlcylcbiB7XG4gXHRzaXplX3Qgdmhvc3RfaGxlbiwgc29ja19obGVuLCBoZHJfbGVuO1xuK1x0aW50IHJldCA9IC1FRkFVTFQ7XG4gXHRpbnQgaTtcbiBcbiBcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XG5AQCAtMTcwMSw4ICsxNzAyLDExIEBAIHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4gXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4tXHRcdGlmICh2aG9zdF9pbml0X2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldikpXG4rXHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNm4tXHUwMDNlZGV2KTtcbitcdFx0aWYgKHJldClcbiBcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4rXHR9IGVsc2Uge1xuK1x0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2bi1cdTAwM2VkZXYpO1xuIFx0fVxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgVkhPU1RfTkVUX1ZRX01BWDsgKytpKSB7XG5AQCAtMTcxOCw3ICsxNzIyLDcgQEAgc3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXG4gXG4gb3V0X3VubG9jazpcbiBcdG11dGV4X3VubG9jayhcdTAwMjZuLVx1MDAzZWRldi5tdXRleCk7XG4tXHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyBsb25nIHZob3N0X25ldF9zZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcbmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcbmluZGV4IDRjNTI1YjNlMTZlYWQuLjlmNzQ1MzdiMWMxYzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmNcbisrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuY1xuQEAgLTM0NCw2ICszNDQsMTcgQEAgc3RhdGljIHZvaWQgX192aG9zdF92cV9tZXRhX3Jlc2V0KHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuIFx0XHR2cS1cdTAwM2VtZXRhX2lvdGxiW2pdID0gTlVMTDtcbiB9XG4gXG4rLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgdmlydHF1ZXVlIG11dGV4LiAqL1xuK3N0YXRpYyB2b2lkIHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKVxuK3tcbitcdHZxLVx1MDAzZWRlc2MgPSBOVUxMO1xuK1x0dnEtXHUwMDNlYXZhaWwgPSBOVUxMO1xuK1x0dnEtXHUwMDNldXNlZCA9IE5VTEw7XG4rXHR2cS1cdTAwM2Vsb2dfdXNlZCA9IGZhbHNlO1xuK1x0dnEtXHUwMDNlbG9nX2FkZHIgPSAtMXVsbDtcbitcdF9fdmhvc3RfdnFfbWV0YV9yZXNldCh2cSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHZob3N0X3ZxX21ldGFfcmVzZXQoc3RydWN0IHZob3N0X2RldiAqZClcbiB7XG4gXHRpbnQgaTtcbkBAIC0xOTExLDYgKzE5MjIsOSBAQCBpbnQgdnFfbWV0YV9wcmVmZXRjaChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSlcbiB7XG4gXHR1bnNpZ25lZCBpbnQgbnVtID0gdnEtXHUwMDNlbnVtO1xuIFxuK1x0aWYgKCF2cS1cdTAwM2VkZXNjIHx8ICF2cS1cdTAwM2VhdmFpbCB8fCAhdnEtXHUwMDNldXNlZClcbitcdFx0cmV0dXJuIDA7XG4rXG4gXHRpZiAoIXZxLVx1MDAzZWlvdGxiKVxuIFx0XHRyZXR1cm4gMTtcbiBcbkBAIC0yMjcwLDExICsyMjg0LDQ4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnXG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X3ZyaW5nX2lvY3RsKTtcbiBcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXG4rdm9pZCB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbit7XG4rXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiO1xuK1x0aW50IGk7XG4rXG4rXHRpb3RsYiA9IGQtXHUwMDNlaW90bGI7XG4rXHRpZiAoIWlvdGxiKVxuK1x0XHRyZXR1cm47XG4rXG4rXHQvKlxuK1x0ICogRHJvcCB0aGUgZGV2aWNlLXdpZGUgdmlldyBmaXJzdC4gIEVhY2ggVlEgdGhlbiBkcm9wcyBpdHNcbitcdCAqIHBlci1WUSB2aWV3IGFuZCBpdHMgY2FjaGVkIHJpbmcgYWNjZXNzIHVuZGVyIGl0cyBvd24gbXV0ZXguXG4rXHQgKiBLZWVwIHRoZSBvbGQgdGFibGUgYWxpdmUgdW50aWwgZXZlcnkgVlEgaGFzIGNvbXBsZXRlZCB0aGlzXG4rXHQgKiBoYW5kb2ZmLCBzaW5jZSBhIHdvcmtlciBtYXkgc3RpbGwgYmUgdXNpbmcgaXQgd2hpbGUgd2FpdGluZ1xuK1x0ICogZm9yIGl0cyBWUSBtdXRleC5cbitcdCAqL1xuK1x0ZC1cdTAwM2Vpb3RsYiA9IE5VTEw7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkLVx1MDAzZW52cXM7ICsraSkge1xuK1x0XHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXHUwMDNldnFzW2ldO1xuK1xuK1x0XHRtdXRleF9sb2NrKFx1MDAyNnZxLVx1MDAzZW11dGV4KTtcbitcdFx0dnEtXHUwMDNlaW90bGIgPSBOVUxMO1xuK1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4rXHR9XG4rXG4rXHR2aG9zdF9jbGVhcl9tc2coZCk7XG4rXHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcbitcdHdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKFx1MDAyNmQtXHUwMDNld2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcbitcbiBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKm5pb3RsYiwgKm9pb3RsYjtcbiBcdGludCBpO1xuIFxuK1x0aWYgKGQtXHUwMDNlaW90bGIpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0bmlvdGxiID0gaW90bGJfYWxsb2MoKTtcbiBcdGlmICghbmlvdGxiKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbkBAIC0yMjg3LDcgKzIzMzgsNyBAQCBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZClcbiBcbiBcdFx0bXV0ZXhfbG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHRcdHZxLVx1MDAzZWlvdGxiID0gbmlvdGxiO1xuLVx0XHRfX3Zob3N0X3ZxX21ldGFfcmVzZXQodnEpO1xuK1x0XHR2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSk7XG4gXHRcdG11dGV4X3VubG9jayhcdTAwMjZ2cS1cdTAwM2VtdXRleCk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5oIGIvZHJpdmVycy92aG9zdC92aG9zdC5oXG5pbmRleCAwMTkyYWRlNmU3NDkxLi4zYzc1ZTgwODkzNzMwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy92aG9zdC92aG9zdC5oXG4rKysgYi9kcml2ZXJzL3Zob3N0L3Zob3N0LmhcbkBAIC0yNzcsNiArMjc3LDcgQEAgc3NpemVfdCB2aG9zdF9jaHJfcmVhZF9pdGVyKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgc3RydWN0IGlvdl9pdGVyICp0byxcbiBcdFx0XHQgICAgaW50IG5vYmxvY2spO1xuIHNzaXplX3Qgdmhvc3RfY2hyX3dyaXRlX2l0ZXIoc3RydWN0IHZob3N0X2RldiAqZGV2LFxuIFx0XHRcdCAgICAgc3RydWN0IGlvdl9pdGVyICpmcm9tKTtcbit2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKTtcbiBpbnQgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoc3RydWN0IHZob3N0X2RldiAqZCk7XG4gXG4gdm9pZCB2aG9zdF9pb3RsYl9tYXBfZnJlZShzdHJ1Y3Qgdmhvc3RfaW90bGIgKmlvdGxiLFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvdnNvY2suYyBiL2RyaXZlcnMvdmhvc3QvdnNvY2suY1xuaW5kZXggOWFhYWI2YmI4MDYxYy4uNzdhNWE2Nzc1Yzg2ZiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvdmhvc3QvdnNvY2suY1xuKysrIGIvZHJpdmVycy92aG9zdC92c29jay5jXG5AQCAtODU0LDYgKzg1NCw3IEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2NpZChzdHJ1Y3Qgdmhvc3RfdnNvY2sgKnZzb2NrLCB1NjQgZ3Vlc3RfY2lkKVxuIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiB7XG4gXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTtcbitcdGludCByZXQgPSAtRUZBVUxUO1xuIFx0aW50IGk7XG4gXG4gXHRpZiAoZmVhdHVyZXMgXHUwMDI2IH5WSE9TVF9WU09DS19GRUFUVVJFUylcbkBAIC04NjUsOSArODY2LDEyIEBAIHN0YXRpYyBpbnQgdmhvc3RfdnNvY2tfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF92c29jayAqdnNvY2ssIHU2NCBmZWF0dXJlcylcbiBcdFx0Z290byBlcnI7XG4gXHR9XG4gXG4tXHRpZiAoKGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNKSkpIHtcbi1cdFx0aWYgKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldikpXG4rXHRpZiAoZmVhdHVyZXMgXHUwMDI2ICgxVUxMIFx1MDAzY1x1MDAzYyBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XG4rXHRcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFx1MDAyNnZzb2NrLVx1MDAzZWRldik7XG4rXHRcdGlmIChyZXQpXG4gXHRcdFx0Z290byBlcnI7XG4rXHR9IGVsc2Uge1xuK1x0XHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXHUwMDI2dnNvY2stXHUwMDNlZGV2KTtcbiBcdH1cbiBcbiBcdHZzb2NrLVx1MDAzZXNlcXBhY2tldF9hbGxvdyA9IGZlYXR1cmVzIFx1MDAyNiAoMVVMTCBcdTAwM2NcdTAwM2MgVklSVElPX1ZTT0NLX0ZfU0VRUEFDS0VUKTtcbkBAIC04ODMsNyArODg3LDcgQEAgc3RhdGljIGludCB2aG9zdF92c29ja19zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3Zzb2NrICp2c29jaywgdTY0IGZlYXR1cmVzKVxuIFxuIGVycjpcbiBcdG11dGV4X3VubG9jayhcdTAwMjZ2c29jay1cdTAwM2VkZXYubXV0ZXgpO1xuLVx0cmV0dXJuIC1FRkFVTFQ7XG4rXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgbG9uZyB2aG9zdF92c29ja19kZXZfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjEzOjU5LjQ2ODEzODU4NloiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NDI0NzM1MzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFZob3N0IFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0b3VjaGVzIHNldmVyYWwgYHZob3N0YCBmaWxlczogYG5ldC5jYCwgYHZob3N0LmNgLCBgdmhvc3QuaGAsIGFuZCBgdnNvY2suY2AuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2VzIHNlZW0gdG8gcmV2b2x2ZSBhcm91bmQgSU9UTEIgY2xlYXJpbmcgKGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWApIGFuZCBpbnZhbGlkYXRpbmcgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyB3aXRoaW4gYHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKClgLiBUaGUgZnVuY3Rpb24gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgIG5vdyBjb3JyZWN0bHkgcmV0dXJucyAwIGlmIHRoZSBJT1RMQiBpcyBhbHJlYWR5IHNldC4gSXQncyBjYWxsaW5nIGB2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoKWAgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBlbmFibGVkLiBBbmQgaXQncyBkb2luZyBzb21lIHBvaW50ZXIgY2xlYXJpbmcgd2l0aGluIHRoZSB2aXJ0cXVldWUgc3RydWN0cyB0byBhdm9pZCBhY2Nlc3MuXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgb2YgY291cnNlLiBXZSBoYXZlIGEgZmFpciBhbW91bnQgb2YgcG9pbnRlciBjbGVhcmluZyBoYXBwZW5pbmcsIHNwZWNpZmljYWxseSB3aXRoIHRoZSB2aXJ0cXVldWUncyBkZXNjcmlwdG9yIChgdnEtXHUwMDNlZGVzY2ApLCBhdmFpbGFibGUgcmluZyAoYHZxLVx1MDAzZWF2YWlsYCksIHVzZWQgcmluZyAoYHZxLVx1MDAzZXVzZWRgKSwgYW5kIHNvbWUgbG9nZ2luZy1yZWxhdGVkIGZpZWxkcy4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBpbnRyb2R1Y2UgaXNzdWVzIGlmIHRoZSBjbGVhcmVkIHBvaW50ZXJzIGFyZSB0aGVuIHJlYWQuIFRoZW4gaXQgbW9kaWZpZXMgYHZxX21ldGFfcHJlZmV0Y2goKWAsIHdoaWNoIHJldHVybnMgMCBpZiBhbnkgb2YgdGhvc2UgYXJlbid0IHZhbGlkLiBCdXQsIHRoYXQncyBleHBlY3RlZC5cblxuQWxzbywgaXQgbG9va3MgbGlrZSBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlcygpYCB3ZXJlIHJldHVybmluZyBgLUVGQVVMVGAgdW5jb25kaXRpb25hbGx5LiBUaGF0J3MgYSBodWdlIHJlZCBmbGFnISBUaGUgcGF0Y2ggYXBwZWFycyB0byBiZSAqZml4aW5nKiB0aGF0IGFuZCBub3cgcmV0dXJucyBhIHZhcmlhYmxlIGByZXRgIHdoaWNoIGRlZmF1bHRzIHRvIGAtRUZBVUxUYCBidXQgd2hpY2ggY2FuIGJlIHVwZGF0ZWQgYnkgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKClgLiBXYWl0LCBkb2VzIHRoaXMgbWVhbiB0aGF0IHRob3NlIGZ1bmN0aW9ucyB3ZXJlICphbHdheXMqIHJldHVybmluZyBhbiBlcnJvciBldmVuIHdoZW4gdGhpbmdzIHdlbnQgY29ycmVjdGx5P1xuXG5MZXQgbWUgZG91YmxlLWNoZWNrIGBkcml2ZXJzL3Zob3N0L25ldC5jYC4gWWVzLCBpdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGhhZCBgcmV0dXJuIC1FRkFVTFQ7YCB1bmNvbmRpdGlvbmFsbHkgYXQgdGhlIGVuZCBvZiBgdmhvc3RfbmV0X3NldF9mZWF0dXJlcygpYC4gVGhhdCdzIGEgbWFqb3IgYnVnISBJdCBuZWVkcyB0byBiZSByZXZpZXdlZCB0byBlbnN1cmUgd2UncmUgbm90IGxvc2luZyBpbXBvcnRhbnQgZXJyb3IgaW5mb3JtYXRpb24uIFdlIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmlnaW5hbCBjb2RlIGNvcnJlY3RseSBoYW5kbGVkIHRoZSBzdWNjZXNzIGFuZCBlcnJvciBjYXNlcy4gSXQgbG9va3MgbGlrZSBpdCB3YXMgcHJvYmFibHkgc3VwcG9zZWQgdG8gcmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgcmV0dXJuIGFueSBlcnJvciBjb2RlIGZyb20gZWFybGllciBpbiB0aGUgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkLCBpdCBhbHdheXMgcmV0dXJuZWQgYSBnZW5lcmljIGVycm9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDM4LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTUwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MDcuODkyODc3Mjc2WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDQ2Njk2MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidmhvc3RfbmV0X3NldF9mZWF0dXJlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL3Zob3N0L25ldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmM9MTY0Mz1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfcmVzZXRfb3duZXIoc3RydWN0IHZob3N0X25ldCAqbilcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTY3Mi1cXG5kcml2ZXJzL3Zob3N0L25ldC5jOjE2NzM6c3RhdGljIGludCB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCB2aG9zdF9uZXQgKm4sIGNvbnN0IHU2NCAqZmVhdHVyZXMpXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNjc0LXtcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM9MTc0OT1zdGF0aWMgbG9uZyB2aG9zdF9uZXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBpb2N0bCxcXG4tLVxcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTc3Ny1cXHRcXHR2aXJ0aW9fZmVhdHVyZXNfZnJvbV91NjQoYWxsX2ZlYXR1cmVzLCBmZWF0dXJlcyk7XFxuZHJpdmVycy92aG9zdC9uZXQuYzoxNzc4OlxcdFxcdHJldHVybiB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKG4sIGFsbF9mZWF0dXJlcyk7XFxuZHJpdmVycy92aG9zdC9uZXQuYy0xNzc5LVxcdGNhc2UgVkhPU1RfR0VUX0ZFQVRVUkVTX0FSUkFZOlxcbi0tXFxuZHJpdmVycy92aG9zdC9uZXQuYy0xODE5LVxcbmRyaXZlcnMvdmhvc3QvbmV0LmM6MTgyMDpcXHRcXHRyZXR1cm4gdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhuLCBhbGxfZmVhdHVyZXMpO1xcbmRyaXZlcnMvdmhvc3QvbmV0LmMtMTgyMS1cXHRjYXNlIFZIT1NUX0dFVF9CQUNLRU5EX0ZFQVRVUkVTOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDowNy45OTc1NTE2NzdaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzY0OTIxNzkzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgdmhvc3RfbmV0X3NldF9mZWF0dXJlc2AgZnVuY3Rpb24gd2l0aGluIGBkcml2ZXJzL3Zob3N0L25ldC5jYC5cblxuKipEaXZpbmcgaW50byB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzKipcblxuQWxyaWdodCwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBncm9rIHdoYXQgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGRvZXMuIEZyb20gdGhlIG5hbWUgYWxvbmUsIEkgY2FuIGluZmVyIGl0IGxpa2VseSBkZWFscyB3aXRoIGNvbmZpZ3VyaW5nIG9yIGVuYWJsaW5nL2Rpc2FibGluZyBjZXJ0YWluIGZ1bmN0aW9uYWxpdGllcywgb3IgXCJmZWF0dXJlcyxcIiBzcGVjaWZpYyB0byB0aGUgdmlydHVhbCBob3N0IG5ldHdvcmsgaW50ZXJmYWNlLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgaXQgcHJvYmFibHkgc2l0cyBpbiB0aGUgY29udHJvbCBwYXRoLCBjYWxsZWQgd2hlbiB0aGUgZ3Vlc3Qgb3BlcmF0aW5nIHN5c3RlbSBvciB0aGUgaHlwZXJ2aXNvciB3YW50cyB0byBtb2RpZnkgdGhlIGNhcGFiaWxpdGllcyB0aGUgdmlydHVhbCBuZXR3b3JrIGludGVyZmFjZSBwcmVzZW50cy4gVGhpcyBpcyBsaWtlbHkgYW4gaW1wb3J0YW50IHBvaW50IG9mIGNvbW11bmljYXRpb24uIEknbGwgbmVlZCB0byBzZWUgaG93IGl0IGhhbmRsZXMgZmVhdHVyZSBuZWdvdGlhdGlvbiDigJMgaWYgaXQgYWxsb3dzIHRoZSBndWVzdCB0byBwcm9wb3NlIGZlYXR1cmVzLCBvciBpZiB0aGUgaHlwZXJ2aXNvciBkaWN0YXRlcyB0aGVtLiBJJ20ga2VlbiB0byBzZWUgaWYgdGhlcmUgaXMgZXJyb3IgaGFuZGxpbmcuIEkgaG9wZSB0byBmaW5kIHVzZWZ1bCBjb21tZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIG9yIGJsb2NrIG9mIGNvZGUuIFRoaXMgaXMgbGlrZWx5IGEgY3JpdGljYWwgc2VjdGlvbiBvZiBjb2RlIGFzIGl0IHdpbGwgdG91Y2ggbmV0d29ya2luZy4gSG9wZWZ1bGx5LCBpdHMgd2VsbCB3cml0dGVuLCBhbmQgc2FmZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ1NywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjE0OjExLjY0Njc3MjkyMVoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjY1MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy92aG9zdC9uZXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjczLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjczOlxcdHN0YXRpYyBpbnQgdmhvc3RfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3Qgdmhvc3RfbmV0ICpuLCBjb25zdCB1NjQgKmZlYXR1cmVzKVxcbjE2NzQ6XFx0e1xcbjE2NzU6XFx0XFx0c2l6ZV90IHZob3N0X2hsZW4sIHNvY2tfaGxlbiwgaGRyX2xlbjtcXG4xNjc2OlxcdFxcdGludCByZXQgPSAtRUZBVUxUO1xcbjE2Nzc6XFx0XFx0aW50IGk7XFxuMTY3ODpcXHRcXG4xNjc5OlxcdFxcdGhkcl9sZW4gPSB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpIHx8XFxuMTY4MDpcXHRcXHRcXHQgIHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVklSVElPX0ZfVkVSU0lPTl8xKSA/XFxuMTY4MTpcXHRcXHRcXHQgIHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4YnVmKSA6XFxuMTY4MjpcXHRcXHRcXHQgIHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpO1xcbjE2ODM6XFx0XFxuMTY4NDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLFxcbjE2ODU6XFx0XFx0XFx0XFx0XFx0ICAgICBWSVJUSU9fTkVUX0ZfSE9TVF9VRFBfVFVOTkVMX0dTTykgfHxcXG4xNjg2OlxcdFxcdCAgICB2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsXFxuMTY4NzpcXHRcXHRcXHRcXHRcXHQgICAgIFZJUlRJT19ORVRfRl9HVUVTVF9VRFBfVFVOTkVMX0dTTykpXFxuMTY4ODpcXHRcXHRcXHRoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl92MV9oYXNoX3R1bm5lbCk7XFxuMTY4OTpcXHRcXG4xNjkwOlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZIT1NUX05FVF9GX1ZJUlRJT19ORVRfSERSKSkge1xcbjE2OTE6XFx0XFx0XFx0Lyogdmhvc3QgcHJvdmlkZXMgdm5ldF9oZHIgKi9cXG4xNjkyOlxcdFxcdFxcdHZob3N0X2hsZW4gPSBoZHJfbGVuO1xcbjE2OTM6XFx0XFx0XFx0c29ja19obGVuID0gMDtcXG4xNjk0OlxcdFxcdH0gZWxzZSB7XFxuMTY5NTpcXHRcXHRcXHQvKiBzb2NrZXQgcHJvdmlkZXMgdm5ldF9oZHIgKi9cXG4xNjk2OlxcdFxcdFxcdHZob3N0X2hsZW4gPSAwO1xcbjE2OTc6XFx0XFx0XFx0c29ja19obGVuID0gaGRyX2xlbjtcXG4xNjk4OlxcdFxcdH1cXG4xNjk5OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcwMDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSE9TVF9GX0xPR19BTEwpIFxcdTAwMjZcXHUwMDI2XFxuMTcwMTpcXHRcXHQgICAgIXZob3N0X2xvZ19hY2Nlc3Nfb2soXFx1MDAyNm4tXFx1MDAzZWRldikpXFxuMTcwMjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTcwMzpcXHRcXG4xNzA0OlxcdFxcdGlmICh2aXJ0aW9fZmVhdHVyZXNfdGVzdF9iaXQoZmVhdHVyZXMsIFZJUlRJT19GX0FDQ0VTU19QTEFURk9STSkpIHtcXG4xNzA1OlxcdFxcdFxcdHJldCA9IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3MDY6XFx0XFx0XFx0aWYgKHJldClcXG4xNzA3OlxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xNzA4OlxcdFxcdH0gZWxzZSB7XFxuMTcwOTpcXHRcXHRcXHR2aG9zdF9jbGVhcl9kZXZpY2VfaW90bGIoXFx1MDAyNm4tXFx1MDAzZWRldik7XFxuMTcxMDpcXHRcXHR9XFxuMTcxMTpcXHRcXG4xNzEyOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBWSE9TVF9ORVRfVlFfTUFYOyArK2kpIHtcXG4xNzEzOlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm4tXFx1MDAzZXZxc1tpXS52cS5tdXRleCk7XFxuMTcxNDpcXHRcXHRcXHR2aXJ0aW9fZmVhdHVyZXNfY29weShuLVxcdTAwM2V2cXNbaV0udnEuYWNrZWRfZmVhdHVyZXNfYXJyYXksXFxuMTcxNTpcXHRcXHRcXHRcXHRcXHQgICAgIGZlYXR1cmVzKTtcXG4xNzE2OlxcdFxcdFxcdG4tXFx1MDAzZXZxc1tpXS52aG9zdF9obGVuID0gdmhvc3RfaGxlbjtcXG4xNzE3OlxcdFxcdFxcdG4tXFx1MDAzZXZxc1tpXS5zb2NrX2hsZW4gPSBzb2NrX2hsZW47XFxuMTcxODpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZXZxc1tpXS52cS5tdXRleCk7XFxuMTcxOTpcXHRcXHR9XFxuMTcyMDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcyMTpcXHRcXHRyZXR1cm4gMDtcXG4xNzIyOlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDoxMS42NDY5NDExNDFaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTExNTQ2NjA1NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSB2aG9zdC1uZXQgUGF0Y2g6IEEgRGVlcCBEaXZlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHZob3N0LW5ldGAsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhlIGNoYW5nZSBpbiB0aGUgZXJyb3IgcmV0dXJuIGF0IGBvdXRfdW5sb2NrOmAuICBJdCdzIHN3aXRjaGluZyBmcm9tIGEgaGFyZGNvZGVkIGAtRUZBVUxUYCB0byBgcmV0YCwgYW5kIGByZXRgIGlzIGluaXRpYWxpemVkIHRvIGAtRUZBVUxUYCBhbmQgdXBkYXRlZCBieSBgdmhvc3RfaW5pdF9kZXZpY2VfaW90bGIoKWAuICBUaGlzIHN1Z2dlc3RzIHRoZSBlcnJvciBoYW5kbGluZyBpcyBub3cgbW9yZSBudWFuY2VkLCBwb3NzaWJseSByZWZsZWN0aW5nIGZhaWx1cmVzIHdpdGhpbiB0aGUgSU9UTEIgaW5pdGlhbGl6YXRpb24uIFRoYXQgY2hhbmdlIGFsb25lIGlzIGludGVyZXN0aW5nLCBidXQgaXQncyB0aGUgYWRkaXRpb24gb2YgYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihcdTAwMjZuLVx1MDAzZWRldik7YCB0aGF0J3MgdGhlIGhlYXJ0IG9mIHRoaXMgcGF0Y2gsIGVzcGVjaWFsbHkgd2hlbiBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBpc24ndCBzZXQuXG5cbldoYXQgdGhpcyBpcyBkb2luZyBpcyBjbGVhbmluZyB1cCB0aGUgSU9UTEIgYW5kLCBjcnVjaWFsbHksIGludmFsaWRhdGluZyB0aGUgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVyczogYHZxLVx1MDAzZWRlc2NgLCBgdnEtXHUwMDNlYXZhaWxgLCBhbmQgYHZxLVx1MDAzZXVzZWRgLiBUaGlzIGlzIGNsZWFybHkgYSBmaXggZm9yIGEgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWUsIGEgdnVsbmVyYWJpbGl0eSB0aGF0IHdvdWxkIGJlIHF1aXRlIG5hc3R5IGlmIGV4cGxvaXRlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIGl0J3MgaGFuZGxpbmcgYSB1c2UtYWZ0ZXItZnJlZSwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIHNpdHVhdGlvbi5cblxuRGl2aW5nIGludG8gYHZob3N0X2NsZWFyX2RldmljZV9pb3RsYmAgY29uZmlybXMgdGhlIG1lbW9yeSBzYWZldHkgZm9jdXMuIEl0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIHZpcnRxdWV1ZXMsIGxvY2tzIHRoZWlyIG11dGV4ZXMsIGNsZWFycyB0aGUgYGlvdGxiYCBwb2ludGVyIGluIGVhY2ggdmlydHF1ZXVlIChgdnEtXHUwMDNlaW90bGIgPSBOVUxMO2ApLCBpbnZhbGlkYXRlcyBhY2Nlc3MgcG9pbnRlcnMgdmlhIGB2aG9zdF92cV9pbnZhbGlkYXRlX2FjY2Vzcyh2cSlgLCB1bmxvY2tzIHRoZSBtdXRleCwgYW5kIGZpbmFsbHksIGZyZWVzIHRoZSBgaW90bGJgIG1lbW9yeS4gVGhlIGtleSBoZXJlIGlzIHRoZSBpbnZhbGlkYXRpb24gYW5kIHRoZSBmcmVlaW5nLiBJdCdzIGRlc2lnbmVkIHRvIHByZXZlbnQgZGFuZ2xpbmcgcG9pbnRlcnMgZnJvbSBjYXVzaW5nIGlzc3VlcyBhZnRlciB0aGUgSU9UTEIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gU28gaWYgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgY2xlYXJlZCB0aGlzIGZyZWVzIElPVExCIGFuZCBpbnZhbGlkYXRlcyB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzLlxuXG5UaGlzIHJlYWxseSBpcyBhIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyBmaXgsIGFuZCB0aGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIHNpdHVhdGlvbiwgb3IgYW4gaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiBLQVNBTiB3b3VsZCBkZWZpbml0ZWx5IGNhdGNoIHRoZXNlIGVycm9ycy4gSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBleHBvc2VkIHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIFRoZSBmb2N1cyBpcyBvbiAqY2xlYXJpbmcqIHBvaW50ZXJzIGFuZCAqZnJlZWluZyogbWVtb3J5LCBub3Qgb24gKmluaXRpYWxpemluZyogYW5kIHRoZW4gbGVha2luZyB1bmluaXRpYWxpemVkIGRhdGEuIEtNU0FOLCB3aGljaCBpcyByZWFsbHkgZ29vZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnksIGlzbid0IG5lZWRlZCBoZXJlLlxuXG5Ob3csIGJhY2sgdG8gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gSXQgYWxsb2NhdGVzIGEgbmV3IGBpb3RsYmAgdXNpbmcgYGlvdGxiX2FsbG9jKClgLiBJdCByZXR1cm5zIHplcm8gaWYgdGhlIGRldmljZSBhbHJlYWR5IGhhZCBhbiBJT1RMQiBzZXQuIFNvLCB0aGUgb2xkIGJlaGF2aW91ciB3b3VsZCBoYXZlIGp1c3QgYWxsb2NhdGVkIGFuZCBvdmVyd3JpdHRlbj8gVGhpcyBwYXRjaCBzZWVtcyB0byBiZSBhZGRyZXNzaW5nIHRob3NlIHNjZW5hcmlvcyB3aGVyZSB0aGUgSU9UTEIgd2Fzbid0IHByb3Blcmx5IGNsZWFyZWQgd2hlbiBpdCB3YXMgbm8gbG9uZ2VyIHJlcXVpcmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NjcwLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjIuODAxNjAzNzk0WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMTE3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL3Zob3N0L3Zob3N0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjI4MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjI4MDpcXHRcXG4yMjgxOlxcdFxcdGlmIChwb2xsc3RvcCBcXHUwMDI2XFx1MDAyNiB2cS1cXHUwMDNlaGFuZGxlX2tpY2spXFxuMjI4MjpcXHRcXHRcXHR2aG9zdF9kZXZfZmx1c2godnEtXFx1MDAzZXBvbGwuZGV2KTtcXG4yMjgzOlxcdFxcdHJldHVybiByO1xcbjIyODQ6XFx0fVxcbjIyODU6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfdnJpbmdfaW9jdGwpO1xcbjIyODY6XFx0XFxuMjI4NzpcXHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkZXZpY2UgbXV0ZXguICovXFxuMjI4ODpcXHR2b2lkIHZob3N0X2NsZWFyX2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbjIyODk6XFx0e1xcbjIyOTA6XFx0XFx0c3RydWN0IHZob3N0X2lvdGxiICppb3RsYjtcXG4yMjkxOlxcdFxcdGludCBpO1xcbjIyOTI6XFx0XFxuMjI5MzpcXHRcXHRpb3RsYiA9IGQtXFx1MDAzZWlvdGxiO1xcbjIyOTQ6XFx0XFx0aWYgKCFpb3RsYilcXG4yMjk1OlxcdFxcdFxcdHJldHVybjtcXG4yMjk2OlxcdFxcbjIyOTc6XFx0XFx0LypcXG4yMjk4OlxcdFxcdCAqIERyb3AgdGhlIGRldmljZS13aWRlIHZpZXcgZmlyc3QuICBFYWNoIFZRIHRoZW4gZHJvcHMgaXRzXFxuMjI5OTpcXHRcXHQgKiBwZXItVlEgdmlldyBhbmQgaXRzIGNhY2hlZCByaW5nIGFjY2VzcyB1bmRlciBpdHMgb3duIG11dGV4LlxcbjIzMDA6XFx0XFx0ICogS2VlcCB0aGUgb2xkIHRhYmxlIGFsaXZlIHVudGlsIGV2ZXJ5IFZRIGhhcyBjb21wbGV0ZWQgdGhpc1xcbjIzMDE6XFx0XFx0ICogaGFuZG9mZiwgc2luY2UgYSB3b3JrZXIgbWF5IHN0aWxsIGJlIHVzaW5nIGl0IHdoaWxlIHdhaXRpbmdcXG4yMzAyOlxcdFxcdCAqIGZvciBpdHMgVlEgbXV0ZXguXFxuMjMwMzpcXHRcXHQgKi9cXG4yMzA0OlxcdFxcdGQtXFx1MDAzZWlvdGxiID0gTlVMTDtcXG4yMzA1OlxcdFxcbjIzMDY6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGQtXFx1MDAzZW52cXM7ICsraSkge1xcbjIzMDc6XFx0XFx0XFx0c3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSBkLVxcdTAwM2V2cXNbaV07XFxuMjMwODpcXHRcXG4yMzA5OlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnZxLVxcdTAwM2VtdXRleCk7XFxuMjMxMDpcXHRcXHRcXHR2cS1cXHUwMDNlaW90bGIgPSBOVUxMO1xcbjIzMTE6XFx0XFx0XFx0dmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3ModnEpO1xcbjIzMTI6XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ2cS1cXHUwMDNlbXV0ZXgpO1xcbjIzMTM6XFx0XFx0fVxcbjIzMTQ6XFx0XFxuMjMxNTpcXHRcXHR2aG9zdF9jbGVhcl9tc2coZCk7XFxuMjMxNjpcXHRcXHR2aG9zdF9pb3RsYl9mcmVlKGlvdGxiKTtcXG4yMzE3OlxcdFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKFxcdTAwMjZkLVxcdTAwM2V3YWl0LCBFUE9MTElOIHwgRVBPTExSRE5PUk0pO1xcbjIzMTg6XFx0fVxcbjIzMTk6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKTtcXG4yMzIwOlxcdFxcbjIzMjE6XFx0aW50IHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKHN0cnVjdCB2aG9zdF9kZXYgKmQpXFxuMjMyMjpcXHR7XFxuMjMyMzpcXHRcXHRzdHJ1Y3Qgdmhvc3RfaW90bGIgKm5pb3RsYiwgKm9pb3RsYjtcXG4yMzI0OlxcdFxcdGludCBpO1xcbjIzMjU6XFx0XFxuMjMyNjpcXHRcXHRpZiAoZC1cXHUwMDNlaW90bGIpXFxuMjMyNzpcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMzI4OlxcdFxcbjIzMjk6XFx0XFx0bmlvdGxiID0gaW90bGJfYWxsb2MoKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjIuODAxODE2NDQ0WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzNjMyMTEyODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgUG9zdC1QYXRjaCBTdGF0ZSoqXG5cbk9rYXksIHdhaXQgYSBtaW51dGUuLi4gSSdtIGxvb2tpbmcgYXQgdGhlIGZpbGUgKmFmdGVyKiB0aGUgcGF0Y2ggaGFzIGJlZW4gYXBwbGllZC4gVGhhdCdzIGNydWNpYWwgY29udGV4dC4gSSBuZWVkIHRvIGtlZXAgdGhhdCBmaXJtbHkgaW4gbWluZCBhcyBJIGludGVycHJldCB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgcHJlLXBhdGNoIHN0YXRlIGlzbid0IHJlbGV2YW50IGhlcmU7IEknbSBkZWFsaW5nIHdpdGggdGhlIHJlc3VsdHMuXG5cbkFscmlnaHQsIGxldCdzIHJlZm9jdXMuIEkgbmVlZCB0byBkaWcgaW50byB0aGUgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBmdW5jdGlvbi4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGxpZXMsIGFuZCBpdCdzIGxpa2VseSB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNoYW5nZXMgYW5kIHRoZWlyIGltcGFjdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMsIGFuZCBob3cgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW50ZXJhY3RzIHdpdGggaXQsIGdpdmVuIHRoZSB1cGRhdGVkIGZpbGUncyBjdXJyZW50IHN0YXRlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIEkvTyB0cmFuc2xhdGlvbiBpcyBiZWluZyBoYW5kbGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQncyBnZXQgdG8gdGhlIGJvdHRvbSBvZiBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODk2MywiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6MjYuMTY1MDMxMTZaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk4MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3Qvdmhvc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMzIxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMzIxOlxcdGludCB2aG9zdF9pbml0X2RldmljZV9pb3RsYihzdHJ1Y3Qgdmhvc3RfZGV2ICpkKVxcbjIzMjI6XFx0e1xcbjIzMjM6XFx0XFx0c3RydWN0IHZob3N0X2lvdGxiICpuaW90bGIsICpvaW90bGI7XFxuMjMyNDpcXHRcXHRpbnQgaTtcXG4yMzI1OlxcdFxcbjIzMjY6XFx0XFx0aWYgKGQtXFx1MDAzZWlvdGxiKVxcbjIzMjc6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjMyODpcXHRcXG4yMzI5OlxcdFxcdG5pb3RsYiA9IGlvdGxiX2FsbG9jKCk7XFxuMjMzMDpcXHRcXHRpZiAoIW5pb3RsYilcXG4yMzMxOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIzMzI6XFx0XFxuMjMzMzpcXHRcXHRvaW90bGIgPSBkLVxcdTAwM2Vpb3RsYjtcXG4yMzM0OlxcdFxcdGQtXFx1MDAzZWlvdGxiID0gbmlvdGxiO1xcbjIzMzU6XFx0XFxuMjMzNjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZC1cXHUwMDNlbnZxczsgKytpKSB7XFxuMjMzNzpcXHRcXHRcXHRzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGQtXFx1MDAzZXZxc1tpXTtcXG4yMzM4OlxcdFxcbjIzMzk6XFx0XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4yMzQwOlxcdFxcdFxcdHZxLVxcdTAwM2Vpb3RsYiA9IG5pb3RsYjtcXG4yMzQxOlxcdFxcdFxcdHZob3N0X3ZxX2ludmFsaWRhdGVfYWNjZXNzKHZxKTtcXG4yMzQyOlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dnEtXFx1MDAzZW11dGV4KTtcXG4yMzQzOlxcdFxcdH1cXG4yMzQ0OlxcdFxcbjIzNDU6XFx0XFx0dmhvc3RfaW90bGJfZnJlZShvaW90bGIpO1xcbjIzNDY6XFx0XFxuMjM0NzpcXHRcXHRyZXR1cm4gMDtcXG4yMzQ4OlxcdH1cXG4yMzQ5OlxcdEVYUE9SVF9TWU1CT0xfR1BMKHZob3N0X2luaXRfZGV2aWNlX2lvdGxiKTtcXG4yMzUwOlxcdFxcbjIzNTE6XFx0LyogQ2FsbGVyIG11c3QgaGF2ZSBkZXZpY2UgbXV0ZXggKi9cXG4yMzUyOlxcdGxvbmcgdmhvc3RfZGV2X2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBfX3VzZXIgKmFyZ3ApXFxuMjM1MzpcXHR7XFxuMjM1NDpcXHRcXHRzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eDtcXG4yMzU1OlxcdFxcdHU2NCBwO1xcbjIzNTY6XFx0XFx0bG9uZyByO1xcbjIzNTc6XFx0XFx0aW50IGksIGZkO1xcbjIzNTg6XFx0XFxuMjM1OTpcXHRcXHQvKiBJZiB5b3UgYXJlIG5vdCB0aGUgb3duZXIsIHlvdSBjYW4gYmVjb21lIG9uZSAqL1xcbjIzNjA6XFx0XFx0aWYgKGlvY3RsID09IFZIT1NUX1NFVF9PV05FUikge1xcbjIzNjE6XFx0XFx0XFx0ciA9IHZob3N0X2Rldl9zZXRfb3duZXIoZCk7XFxuMjM2MjpcXHRcXHRcXHRnb3RvIGRvbmU7XFxuMjM2MzpcXHRcXHR9XFxuMjM2NDpcXHRcXG4yMzY1OlxcdCNpZmRlZiBDT05GSUdfVkhPU1RfRU5BQkxFX0ZPUktfT1dORVJfQ09OVFJPTFxcbjIzNjY6XFx0XFx0aWYgKGlvY3RsID09IFZIT1NUX1NFVF9GT1JLX0ZST01fT1dORVIpIHtcXG4yMzY3OlxcdFxcdFxcdC8qIE9ubHkgYWxsb3cgbW9kaWZpY2F0aW9uIGJlZm9yZSBvd25lciBpcyBzZXQgKi9cXG4yMzY4OlxcdFxcdFxcdGlmICh2aG9zdF9kZXZfaGFzX293bmVyKGQpKSB7XFxuMjM2OTpcXHRcXHRcXHRcXHRyID0gLUVCVVNZO1xcbjIzNzA6XFx0XFx0XFx0XFx0Z290byBkb25lO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDoyNi4xNjUyNDI4WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEzMTc1NDIyMTYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSU9UTEIgTGlmZWN5Y2xlIGFuZCBWaXJ0cXVldWUgQWNjZXNzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBCZWZvcmUgdGhpcyBwYXRjaCwgdGhlIGB2aG9zdF9pbml0X2RldmljZV9pb3RsYmAgZnVuY3Rpb24gd2FzIGZsYXdlZC4gSXQgd2Fzbid0IGNoZWNraW5nIGlmIGFuIElPVExCIGFscmVhZHkgZXhpc3RlZCwgbGVhZGluZyB0byBhIHBvdGVudGlhbCBmb3IgY2xlYXJpbmcgdGhlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgdHJhbnNsYXRpb25zLCBhbmQgcG90ZW50aWFsbHkgbGVhdmluZyB0aGUgc3lzdGVtIGluIGEgY29uZnVzZWQgc3RhdGUgaWYgdGhlIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgd2FzIHRvZ2dsZWQuIFRoaXMgcGF0Y2ggYWRkcmVzc2VzIHRoYXQgYnkgaW5pdGlhbGl6aW5nIHRoZSBJT1RMQiBvbmx5IHdoZW4gdGhlIGZlYXR1cmUgaXMgKnNldCogYW5kIGNsZWFyaW5nIGl0IHdoZW4gdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLiAgVGhpcyBzZWVtcyB0byBmaXggYSBzY2VuYXJpbyB3aGVyZSB0aGUgSU9UTEIgY291bGQgYmUgdW5leHBlY3RlZGx5IGNsZWFyZWQsIHBlcmhhcHMgcmVzdWx0aW5nIGluIG1lbW9yeSBjb3JydXB0aW9uIG9yIHVzZS1hZnRlci1mcmVlLCBvciBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MuIEhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgYSBsaWZlY3ljbGUgbWFuYWdlbWVudCBpc3N1ZSwgcmF0aGVyIHRoYW4gYSBkaXJlY3QgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEtBU0FOIGlzIHBlcmZlY3RseSBzdWl0YWJsZSBmb3IgY2F0Y2hpbmcgYW55IHJlc3VsdGluZyBhY2Nlc3MgZXJyb3JzIGR1ZSB0byBzdGFsZSBwb2ludGVycy4gV2UgZG9uJ3QgbmVlZCBLTVNBTiBoZXJlLlxuXG5Ob3csIGxldCdzIGNvbmZpcm0gdGhlIHBhdGNoJ3MgY2hhbmdlcywgc3RhcnRpbmcgd2l0aCBgdmhvc3RfdnFfaW52YWxpZGF0ZV9hY2Nlc3NgLiAgT2theSwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgbnVsbHMgb3V0IHBvaW50ZXJzIChgdnEtXHUwMDNlZGVzY2AsIGB2cS1cdTAwM2VhdmFpbGAsIGB2cS1cdTAwM2V1c2VkYCkgYW5kIHJlc2V0cyBzdGF0ZSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlJ2QgZXhwZWN0IGluIHRoaXMgc2NlbmFyaW8uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlcyB0aGVyZS5cblxuTmV4dCB1cCwgYHZxX21ldGFfcHJlZmV0Y2hgLiBBaCwgZ29vZC4gVGhlIGFkZGVkIGNoZWNrIG5vdyBwcmV2ZW50cyBwcmVmZXRjaGluZyBpZiBhbnkgb2YgdGhvc2Ugdml0YWwgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBUaGlzIGlzIGEgY3J1Y2lhbCBkZWZlbnNlIGFnYWluc3QgcG90ZW50aWFsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIHdoaWNoIGFyZSBlYXN5IHRvIGNhdGNoIHdpdGggc3RhbmRhcmQgdGVzdGluZyB0aGF0IEtBU0FOIHNob3VsZCBlYXNpbHkgZGV0ZWN0LlxuXG5GaW5hbGx5LCB0aGUgYHZob3N0X25ldF9zZXRfZmVhdHVyZXNgIGZ1bmN0aW9uLiBUaGlzIG9uZSBpcyBtb3JlIHN1YnRsZS4gIEkgc2VlIGEgYnVnIGluIHRoZSBjb2RlIHRoYXQgdGhlIHBhdGNoIGZpeGVzLiAgSW5pdGlhbGx5LCBpdCBpbml0aWFsaXplcyB0aGUgYHJldGAgdmFyaWFibGUgdG8gYC1FRkFVTFRgLiBUaGUgbG9naWMgaXMgc3VjaCB0aGF0IGlmIGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGlzIHNldCwgYW5kIHRoZSBJT1RMQiBpbml0aWFsaXphdGlvbiBmYWlscywgaXQgZ29lcyB0byBgb3V0X3VubG9ja2AgYW5kIHJldHVybnMgdGhlIGVycm9yIGNvZGUsIHdoaWNoIGlzIGNvcnJlY3QuIElmIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkcywgYHJldGAgaXMgbm90IHVwZGF0ZWQsIGJ1dCBzaG91bGQgYmUgemVyby4gSWYgdGhlIGZlYXR1cmUgaXMgKmNsZWFyZWQqLCBpdCdzIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBJT1RMQiwgd2hpY2ggbWF5IGhhdmUgc3VjY2VlZGVkLCBidXQgdGhlIGByZXRgIHJlbWFpbnMgYC1FRkFVTFRgLiBUaGUgcGF0Y2ggbm93IGNvcnJlY3RseSBzZXRzIGByZXRgIHRvIHplcm8gYWZ0ZXIgY2FsbGluZyBgdmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiYC4gIFRoaXMgbG9va3MgbGlrZSBhIHNpbXBsZSBidXQgY3JpdGljYWwgZXJyb3IgaW4gdGhlIG9yaWdpbmFsIGNvZGUncyBlcnJvciBoYW5kbGluZyBhbmQgcmV0dXJuIHZhbHVlIGxvZ2ljLCBlbnN1cmluZyB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG1lYW5pbmdmdWwgZXJyb3IgY29kZSBiYXNlZCBvbiB0aGUgSU9UTEIgb3BlcmF0aW9uJ3Mgc3VjY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTk2MiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExOTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwNToxNDozOS4zNDA2NjczMjJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc2NDYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvdmhvc3QvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTY5OSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTY5OTpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MDA6XFx0XFx0aWYgKHZpcnRpb19mZWF0dXJlc190ZXN0X2JpdChmZWF0dXJlcywgVkhPU1RfRl9MT0dfQUxMKSBcXHUwMDI2XFx1MDAyNlxcbjE3MDE6XFx0XFx0ICAgICF2aG9zdF9sb2dfYWNjZXNzX29rKFxcdTAwMjZuLVxcdTAwM2VkZXYpKVxcbjE3MDI6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjE3MDM6XFx0XFxuMTcwNDpcXHRcXHRpZiAodmlydGlvX2ZlYXR1cmVzX3Rlc3RfYml0KGZlYXR1cmVzLCBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk0pKSB7XFxuMTcwNTpcXHRcXHRcXHRyZXQgPSB2aG9zdF9pbml0X2RldmljZV9pb3RsYihcXHUwMDI2bi1cXHUwMDNlZGV2KTtcXG4xNzA2OlxcdFxcdFxcdGlmIChyZXQpXFxuMTcwNzpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTcwODpcXHRcXHR9IGVsc2Uge1xcbjE3MDk6XFx0XFx0XFx0dmhvc3RfY2xlYXJfZGV2aWNlX2lvdGxiKFxcdTAwMjZuLVxcdTAwM2VkZXYpO1xcbjE3MTA6XFx0XFx0fVxcbjE3MTE6XFx0XFxuMTcxMjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgVkhPU1RfTkVUX1ZRX01BWDsgKytpKSB7XFxuMTcxMzpcXHRcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZuLVxcdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xcbjE3MTQ6XFx0XFx0XFx0dmlydGlvX2ZlYXR1cmVzX2NvcHkobi1cXHUwMDNldnFzW2ldLnZxLmFja2VkX2ZlYXR1cmVzX2FycmF5LFxcbjE3MTU6XFx0XFx0XFx0XFx0XFx0ICAgICBmZWF0dXJlcyk7XFxuMTcxNjpcXHRcXHRcXHRuLVxcdTAwM2V2cXNbaV0udmhvc3RfaGxlbiA9IHZob3N0X2hsZW47XFxuMTcxNzpcXHRcXHRcXHRuLVxcdTAwM2V2cXNbaV0uc29ja19obGVuID0gc29ja19obGVuO1xcbjE3MTg6XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2V2cXNbaV0udnEubXV0ZXgpO1xcbjE3MTk6XFx0XFx0fVxcbjE3MjA6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZuLVxcdTAwM2VkZXYubXV0ZXgpO1xcbjE3MjE6XFx0XFx0cmV0dXJuIDA7XFxuMTcyMjpcXHRcXG4xNzIzOlxcdG91dF91bmxvY2s6XFxuMTcyNDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNm4tXFx1MDAzZWRldi5tdXRleCk7XFxuMTcyNTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE3MjY6XFx0fVxcbjE3Mjc6XFx0XFxuMTcyODpcXHRzdGF0aWMgbG9uZyB2aG9zdF9uZXRfc2V0X293bmVyKHN0cnVjdCB2aG9zdF9uZXQgKm4pXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA1OjE0OjM5LjM0MDk0NTk3MloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDM4MTYxNjYwNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIHZob3N0IG5ldC92c29jayBGZWF0dXJlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGF0IGRpZmYgc3BlY2lmaWNhbGx5LCBpdCdzIGFib3V0IGEgbW9yZSBwcmVjaXNlIGVycm9yIGNvZGUgcmV0dXJuIGluIGB2aG9zdF9uZXRfc2V0X2ZlYXR1cmVzYCBhbmQgYHZob3N0X3Zzb2NrX3NldF9mZWF0dXJlc2AuIEkgc2VlLCBpdCByZXBsYWNlcyB0aGUgaGFyZGNvZGVkIGAtRUZBVUxUYCB3aXRoIGByZXRgLCB3aGljaCByZWZsZWN0cyB0aGUgYWN0dWFsIGVycm9yIGZyb20gYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYC4gTXVjaCBiZXR0ZXIhXG5cblRoZSBwYXRjaCBpdHNlbGYgaXMgbXVsdGlmYWNldGVkLiBJdCdzIG5vdCBqdXN0IGEgc2luZ2xlIGZpeDsgaXQgdG91Y2hlcyBvbiBhIGZldyBrZXkgYXJlYXMgd2l0aGluIHRoZSB2aG9zdCBpbmZyYXN0cnVjdHVyZS4gV2UncmUgdGFsa2luZyBhYm91dCBjbGVhcmluZyB0aGUgZGV2aWNlIElPVExCIGFuZCBpbnZhbGlkYXRpbmcgVlEgYWNjZXNzIHdoZW4gYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgaXMgZGlzYWJsZWQuIENsZXZlci4gQW5kIHRoZXJlJ3MgYWxzbyBhIGNoZWNrIHRvIHByZXZlbnQgcHJlZmV0Y2hpbmcgd2hlbiB0aG9zZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBOVUxMLiBHb29kIGRlZmVuc2l2ZSBwcm9ncmFtbWluZy4gRmluYWxseSwgYHZob3N0X2luaXRfZGV2aWNlX2lvdGxiYCBpcyBub3cgYSBuby1vcCBpZiBpdCdzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHdoaWNoIHNlZW1zIGxpa2UgYSBzZW5zaWJsZSBvcHRpbWl6YXRpb24uXG5cblNvLCB0aGUgY3J1eCBvZiBpdCBpcyBhZGRyZXNzaW5nIHBvdGVudGlhbCBpc3N1ZXMgcmVsYXRlZCB0byBwb2ludGVyIGxpZmVjeWNsZSwgbWVtb3J5IGxlYWtzLCBhbmQgcHJldmVudGluZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4gSSdtIGZvY3VzaW5nIG9uIHRob3NlIHBvaW50ZXIncyBsaWZlY3ljbGU6IGB2cS1cdTAwM2VkZXNjYCwgYHZxLVx1MDAzZWF2YWlsYCwgYW5kIGB2cS1cdTAwM2V1c2VkYC4gSXQncyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhhdCB0aG9zZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBwcm9wZXJseSBtYW5hZ2VkLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGF0IGBWSVJUSU9fRl9BQ0NFU1NfUExBVEZPUk1gIGZlYXR1cmUgZ2V0cyB0b2dnbGVkLiBUaGUgSU9UTEIgbmVlZHMgdG8gYmUgZnJlZWQsIGFuZCB0aGUgcG9pbnRlcnMgaGF2ZSB0byBiZSBudWxsaWZpZWQuIE1ha2VzIHNlbnNlIHRvIGF2b2lkIGRhbmdsaW5nIHBvaW50ZXJzIGFuZCB0aGUgaGVhZGFjaGVzIHRoZXkgYnJpbmcuXG5cbk15IGFzc2Vzc21lbnQ/IFRoZXJlIGFyZSBubyBuZXcgYWxsb2NhdGlvbnMgb3IgY29waWVzIG9mIHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZSB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBub3IgYXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgbGVha3Mgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBUaGUgY2hhbmdlcyBoZXJlIGFyZSBhYm91dCBoYW5kbGluZyBwb2ludGVyIHN0YXRlIGNvcnJlY3RseSBhbmQgZ3VhcmRpbmcgYWdhaW5zdCBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2VzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZyBhbmQgS0FTQU4g4oCTIHRoZSBrZXJuZWwgYWRkcmVzcyBzYW5pdGl6ZXIg4oCTIHNob3VsZCBiZSBwZXJmZWN0bHkgYWRlcXVhdGUgdG8gY2F0Y2ggYW55IGJ1Z3MgaW4gdGhpcyBzcGFjZSwgZXNwZWNpYWxseSB0aG9zZSByZWxhdGVkIHRvIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLiBBIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBsaWtlbHkgdW5uZWNlc3NhcnkuIFRoYXQgbGV2ZWwgb2YgZGVkaWNhdGVkIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkIGhlcmUuIEtBU0FOIGlzIHRoZSByaWdodCB0b29sIGZvciB0aGVzZSBwYXJ0aWN1bGFyIGlzc3Vlcy4gV2UncmUgZ29vZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyNTQsIk91dHB1dFRva2VucyI6MjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDU6MTQ6NDkuNzIyNTY2MTQ3WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgwNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRyZXNzZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgdmhvc3QgZGV2aWNlIElPVExCIGFuZCB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIChgdnEtXFx1MDAzZWRlc2NgLCBgdnEtXFx1MDAzZWF2YWlsYCwgYHZxLVxcdTAwM2V1c2VkYCkuIEl0IGVuc3VyZXMgdGhhdCB3aGVuIHRoZSBgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNYCBmZWF0dXJlIGlzIGNsZWFyZWQsIHRoZSBJT1RMQiBpcyBwcm9wZXJseSBmcmVlZCBhbmQgdGhlIHZpcnRxdWV1ZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIGludmFsaWRhdGVkIChzZXQgdG8gTlVMTCkuIEl0IGFsc28gYWRkcyBhIGNoZWNrIGluIGB2cV9tZXRhX3ByZWZldGNoYCB0byBwcmV2ZW50IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMgaWYgdGhlIGFjY2VzcyBwb2ludGVycyBhcmUgbm90IHNldC4gVGhlc2UgY2hhbmdlcyBmaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0aWVzLCBvciBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGNhdXNlZCBieSBzdGFsZSBwb2ludGVycy4gVGhlcmUgYXJlIG5vIG5ldyBzdHJ1Y3R1cmVzIGJlaW5nIGFsbG9jYXRlZCBhbmQgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbiwgbm9yIGlzIHRoZXJlIGFueSBsb2dpYyB0aGF0IGV4cG9zZXMgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LiBTdGFuZGFyZCBLQVNBTiAod2hpY2ggZGV0ZWN0cyB1c2UtYWZ0ZXItZnJlZSBhbmQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcykgYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nICh3aGljaCBjYXRjaGVzIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMpIGFyZSBmdWxseSBjYXBhYmxlIG9mIGRldGVjdGluZyB0aGUgYnVncyB0aGlzIHBhdGNoIGFpbXMgdG8gZml4LiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcmVzc2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHZob3N0IGRldmljZSBJT1RMQiBhbmQgdmlydHF1ZXVlIGFjY2VzcyBwb2ludGVycyAoYHZxLVxcdTAwM2VkZXNjYCwgYHZxLVxcdTAwM2VhdmFpbGAsIGB2cS1cXHUwMDNldXNlZGApLiBJdCBlbnN1cmVzIHRoYXQgd2hlbiB0aGUgYFZJUlRJT19GX0FDQ0VTU19QTEFURk9STWAgZmVhdHVyZSBpcyBjbGVhcmVkLCB0aGUgSU9UTEIgaXMgcHJvcGVybHkgZnJlZWQgYW5kIHRoZSB2aXJ0cXVldWUgYWNjZXNzIHBvaW50ZXJzIGFyZSBpbnZhbGlkYXRlZCAoc2V0IHRvIE5VTEwpLiBJdCBhbHNvIGFkZHMgYSBjaGVjayBpbiBgdnFfbWV0YV9wcmVmZXRjaGAgdG8gcHJldmVudCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGlmIHRoZSBhY2Nlc3MgcG9pbnRlcnMgYXJlIG5vdCBzZXQuIFRoZXNlIGNoYW5nZXMgZml4IHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdGllcywgb3IgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcyBjYXVzZWQgYnkgc3RhbGUgcG9pbnRlcnMuIFRoZXJlIGFyZSBubyBuZXcgc3RydWN0dXJlcyBiZWluZyBhbGxvY2F0ZWQgYW5kIGNvcGllZCB0byB1c2VyIHNwYWNlIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIG5vciBpcyB0aGVyZSBhbnkgbG9naWMgdGhhdCBleHBvc2VzIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gU3RhbmRhcmQgS0FTQU4gKHdoaWNoIGRldGVjdHMgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMpIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZyAod2hpY2ggY2F0Y2hlcyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzKSBhcmUgZnVsbHkgY2FwYWJsZSBvZiBkZXRlY3RpbmcgdGhlIGJ1Z3MgdGhpcyBwYXRjaCBhaW1zIHRvIGZpeC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow69p46[1] Phase: Succeeded StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 05:14:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 05:14:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2] Phase: Succeeded StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 05:15:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-18 05:14:54 +0000 UTC FinishedAt: 2026-08-18 05:14:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-3301308418/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-18 05:15:04 +0000 UTC FinishedAt: 2026-08-18 05:31:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-18 05:15:04 +0000 UTC FinishedAt: 2026-08-18 05:31:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8fe92416-04ed-4a5a-be18-eeda05deed64,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-3301308418/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "14e4fbaa-cedf-45bb-9e19-6b6cdddb4c3a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-681936576/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-18 05:15:04 +0000 UTC FinishedAt: 2026-08-18 05:31:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8fe92416-04ed-4a5a-be18-eeda05deed64,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-3301308418/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "14e4fbaa-cedf-45bb-9e19-6b6cdddb4c3a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-681936576/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-18 05:31:48 +0000 UTC FinishedAt: 2026-08-18 05:31:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-18 05:31:48 +0000 UTC FinishedAt: 2026-08-18 05:31:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-18 05:31:48 +0000 UTC FinishedAt: 2026-08-18 05:31:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-18 05:31:48 +0000 UTC FinishedAt: 2026-08-18 05:31:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-467505245/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-18 05:31:58 +0000 UTC FinishedAt: 2026-08-18 05:34:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-18 05:31:58 +0000 UTC FinishedAt: 2026-08-18 05:34:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*14e4fbaa-cedf-45bb-9e19-6b6cdddb4c3a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-681936576/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-18 05:34:23 +0000 UTC FinishedAt: 2026-08-18 05:34:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-18 05:34:23 +0000 UTC FinishedAt: 2026-08-18 05:34:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-18 05:34:23 +0000 UTC FinishedAt: 2026-08-18 05:51:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-18 05:34:23 +0000 UTC FinishedAt: 2026-08-18 05:51:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8fe92416-04ed-4a5a-be18-eeda05deed64,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-467505245/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "8eb6d81f-2e79-4a08-91a8-8d72a21ce0b4", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-1194512697/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-18 05:34:23 +0000 UTC FinishedAt: 2026-08-18 05:50:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8fe92416-04ed-4a5a-be18-eeda05deed64,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-467505245/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "8eb6d81f-2e79-4a08-91a8-8d72a21ce0b4", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-1194512697/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-18 05:51:02 +0000 UTC FinishedAt: 2026-08-18 05:51:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-18 05:51:02 +0000 UTC FinishedAt: 2026-08-18 05:51:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-18 05:51:02 +0000 UTC FinishedAt: 2026-08-18 05:53:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-18 05:51:02 +0000 UTC FinishedAt: 2026-08-18 05:53:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*8eb6d81f-2e79-4a08-91a8-8d72a21ce0b4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-1194512697/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*14e4fbaa-cedf-45bb-9e19-6b6cdddb4c3a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*8eb6d81f-2e79-4a08-91a8-8d72a21ce0b4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-681936576/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-1194512697/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 05:53:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 05:53:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-363482850/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 05:53:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 05:53:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-18 05:53:12 +0000 UTC FinishedAt: 2026-08-18 05:53:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-18 05:53:22 +0000 UTC FinishedAt: 2026-08-18 08:54:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow69p46[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["kvm","net"],"focus_symbols":["vhost_net_ioctl","vhost_vsock_dev_ioctl","vhost_clear_device_iotlb","vhost_init_device_iotlb","vq_meta_prefetch","vhost_net_set_features","vhost_vsock_set_features"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"1b731e5ded480bd1e5546aed35584238661ce72e","config_name":"upstream-apparmor-kasan.config","enable_configs":["VHOST_NET","VHOST_VSOCK","VSOCKETS","EVENTFD"],"series_id":"0108ef0a-73bd-4f6d-b806-48ec9c5c5f84","tree_name":"kvm-x86","tree_url":"https://github.com/kvm-x86/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-18 05:53:22 +0000 UTC FinishedAt: 2026-08-18 08:54:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*14e4fbaa-cedf-45bb-9e19-6b6cdddb4c3a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*8eb6d81f-2e79-4a08-91a8-8d72a21ce0b4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-681936576/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-build-action-1194512697/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow69p46/series-workflow69p46-convert-artifact-363482850/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}