Name: series-workflowhm7pg Phase: Succeeded StartedAt: 2026-07-09 11:43:11 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[0] Phase: Succeeded StartedAt: 2026-07-09 11:43:11 +0000 UTC FinishedAt: 2026-07-09 11:50:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[0].run-triage Phase: Succeeded StartedAt: 2026-07-09 11:43:11 +0000 UTC FinishedAt: 2026-07-09 11:50:57 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "d11ba1f570615ec8d4814d6313ee1d7075a33787", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "d11ba1f570615ec8d4814d6313ee1d7075a33787", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "f0a980a1-efc1-4beb-87b1-580ef7152ac0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "allocinfo_ioctl_get_content_id", "allocinfo_ioctl_get_at", "allocinfo_ioctl_get_next", "allocinfo_ioctl", "allocinfo_compat_ioctl", "allocinfo_open", "allocinfo_release", "matches_filter" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9hdCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X25leHQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX29wZW4mIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7bWF0Y2hlc19maWx0ZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDBiOTBmZjZhMGI1M2Q5NGE3Y2RkODQ1MDczMjBjNTFlZmE3YjExYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEp1bCA5IDExOjUwOjAzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuQEAgLTQ2LDYgJiM0Mzs0NiwxMSBAQCBzeXNjdGw6XG4gUnVudGltZSBpbmZvOlxuICAgL3Byb2MvYWxsb2NpbmZvXG4gXG4mIzQzOyAgUHJvZmlsaW5nIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBlaXRoZXIgYnkgcmVhZGluZyBgL3Byb2MvYWxsb2NpbmZvYCBkaXJlY3RseSBhc1xuJiM0MzsgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VgLlxuJiM0MzsgIFRoZSBpb2N0bCBpbnRlcmZhY2Ugc3VwcG9ydHMgc3RydWN0dXJlZCBiaW5hcnkgZGF0YSBleHRyYWN0aW9uIGFzIHdlbGwgYXMgZmlsdGVyaW5nXG4mIzQzOyAgYnkgbW9kdWxlIG5hbWUsIGZ1bmN0aW9uLCBmaWxlLCBsaW5lIG51bWJlciwgYWNjdXJhY3ksIG9yIGFsbG9jYXRpb24gc2l6ZSBsaW1pdHMuXG4mIzQzO1xuIEV4YW1wbGUgb3V0cHV0OjpcbiBcbiAgIHJvb3RAbW9yaWEta3ZtOn4jIHNvcnQgLWcgL3Byb2MvYWxsb2NpbmZvfHRhaWx8bnVtZm10IC0tdG89aWVjXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XG5AQCAtMzQ2LDYgJiM0MzszNDYsOCBAQCBDb2RlICBTZXEjICAgIEluY2x1ZGUgRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2NtYWlsdG86bHV6bWF4aW1pbGlhbkBnbWFpbC5jb21cdTAwM2VcbiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbVx1MDAzZVxuJiM0MzsweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbVx1MDAzZVxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcbiAweEFCICAwMC0xRiAgbGludXgvbmJkLmhcbiAweEFDICAwMC0xRiAgbGludXgvcmF3LmhcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCBkMTk4MjJkNTc0ZmQ0OC4uM2Q1NGZkOGQ2OWMxYzYgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlNcbkBAIC0xNjkzNiw3ICYjNDM7MTY5MzYsOSBAQCBTOlx0TWFpbnRhaW5lZFxuIEY6XHREb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuIEY6XHRpbmNsdWRlL2xpbnV4L2FsbG9jX3RhZy5oXG4gRjpcdGluY2x1ZGUvbGludXgvcGdhbGxvY190YWcuaFxuJiM0MztGOlx0aW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG4gRjpcdG1tL2FsbG9jX3RhZy5jXG4mIzQzO0Y6XHR0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvXG4gXG4gTUVNT1JZIE1BTkFHRU1FTlQgLSBCQUxMT09OXG4gTTpcdEFuZHJldyBNb3J0b24gXHUwMDNjYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZ1x1MDAzZVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcbmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxuQEAgLTc3LDYgJiM0Mzs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHtcbiB2b2lkIGNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIGJvb2wgY29kZXRhZ190cnlsb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuJiM0Mzt1bnNpZ25lZCBsb25nIGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcbiYjNDM7dW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIHN0cnVjdCBjb2RldGFnICpjb2RldGFnX25leHRfY3Qoc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgKml0ZXIpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG5AQCAtMCwwICYjNDM7MSw5OSBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqL1xuJiM0MzsvKlxuJiM0MzsgKiBhbGxvY190YWcgSU9DVEwgQVBJIGRlZmluaXRpb25cbiYjNDM7ICpcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEdvb2dsZSwgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiYjNDM7ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXNcbiYjNDM7ICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfVUFQSV9BTExPQ19UQUdfSFxuJiM0MzsjZGVmaW5lIF9VQVBJX0FMTE9DX1RBR19IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBGdW5jdGlvbiwgZmlsZSBhbmQgbW9kdWxlIG5hbWVzIG9mdGVuIGhhdmUgdGhlIHNhbWUgcHJlZml4ZXMsIHRoZXJlZm9yZVxuJiM0MzsgKiB3aGVuIGZpbHRlcmluZyBieSB0aGVzZSBjcml0ZXJpYSwgd2UgY29tcGFyZSB0aGUgbGFzdCA2NCBjaGFyYWN0ZXJzIHRvXG4mIzQzOyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fU1RSX1NJWkVcdDY0XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQge1xuJiM0MztcdF9fdTY0IGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWcge1xuJiM0MztcdC8qIExvbmdlciBuYW1lcyBhcmUgdHJpbW1lZCAqL1xuJiM0MztcdGNoYXIgbW9kbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdO1xuJiM0MztcdGNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTtcbiYjNDM7XHRjaGFyIGZpbGVuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4mIzQzO1x0X191NjQgbGluZW5vO1xuJiM0MztcdC8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqL1xuJiM0MztcdF9fdTY0IGluYWNjdXJhdGU7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBUaGUgYWxpZ25tZW50IGVuc3VyZXMgMzItYml0IGNvbXBhdGlibGUgaW50ZXJmYWNlcyBhcmUgbm90IGJyb2tlbiAqL1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvdW50ZXIge1xuJiM0MztcdF9fdTY0IGJ5dGVzO1xuJiM0MztcdF9fdTY0IGNhbGxzO1xuJiM0MztcdF9fdTggYWNjdXJhdGU7XG4mIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWcgdGFnO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7ZW51bSB7XG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FLFxuJiM0MztcdEFMTE9DSU5GT19GSUxURVJfRlVOQ1RJT04sXG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX0xJTkVOTyxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUsXG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFLFxuJiM0MztcdF9fQUxMT0NJTkZPX0ZJTFRFUl9MQVNUID0gQUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRVxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTU9ETkFNRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FKVxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTilcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfRklMRU5BTUUpXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOT1x0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8pXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFXHRcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFKVxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLUyBcXFxuJiM0MztcdCgoMSBcdTAwM2NcdTAwM2MgKF9fQUxMT0NJTkZPX0ZJTFRFUl9MQVNUICYjNDM7IDEpKSAtIDEpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7XG4mIzQzO1x0X191NjQgbWFzazsgLyogYml0bWFzayBvZiB0aGUgZmlsdGVyIGZpZWxkcyB1c2VkICovXG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWcgZmllbGRzO1xuJiM0MztcdF9fdTY0IG1pbl9zaXplO1xuJiM0MztcdF9fdTY0IG1heF9zaXplO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb19nZXRfYXQge1xuJiM0MztcdC8qIGlucHV0cyAqL1xuJiM0MztcdF9fdTY0IHBvcztcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4mIzQzO1x0Lyogb3V0cHV0ICovXG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXHQwXG4mIzQzOyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX0FUXHRcdDFcbiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRVx0XHQweEE2XG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZClcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9BVFx0XHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdClcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUXHRcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi9cbmRpZmYgLS1naXQgYS9saWIvY29kZXRhZy5jIGIvbGliL2NvZGV0YWcuY1xuaW5kZXggNDAwMWE3ZWE2Njc1NDIuLmE5Y2RhNGM5NjJhMzAzIDEwMDY0NFxuLS0tIGEvbGliL2NvZGV0YWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbGliL2NvZGV0YWcuY1xuQEAgLTE5LDYgJiM0MzsxOSw4IEBAIHN0cnVjdCBjb2RldGFnX3R5cGUge1xuIFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XG4gXHQvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgbmV4dF9tb2Rfc2VxO1xuJiM0MztcdC8qIGJ1bXBlZCBvbiBldmVyeSBtb2R1bGUgbG9hZCBhbmQgdW5sb2FkICovXG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjb250ZW50X2lkO1xuIH07XG4gXG4gc3RydWN0IGNvZGV0YWdfcmFuZ2Uge1xuQEAgLTUwLDYgJiM0Mzs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiBcdHVwX3JlYWQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiB9XG4gXG4mIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjdHR5cGUtXHUwMDNlY29udGVudF9pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGN0dHlwZS1cdTAwM2Vjb3VudDtcbiYjNDM7fVxuJiM0MztcbiBzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBjb2RldGFnX2dldF9jdF9pdGVyKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyID0ge1xuQEAgLTIwNCw2ICYjNDM7MjIwLDcgQEAgc3RhdGljIGludCBjb2RldGFnX21vZHVsZV9pbml0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSwgc3RydWN0IG1vZHVsZSAqbW9kKVxuIFxuIFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIFx0Y21vZC1cdTAwM2Vtb2Rfc2VxID0gJiM0MzsmIzQzO2N0dHlwZS1cdTAwM2VuZXh0X21vZF9zZXE7XG4mIzQzO1x0JiM0MzsmIzQzO2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0bW9kX2lkID0gaWRyX2FsbG9jKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfaWRyLCBjbW9kLCAwLCAwLCBHRlBfS0VSTkVMKTtcbiBcdGlmIChtb2RfaWQgXHUwMDNlPSAwKSB7XG4gXHRcdGlmIChjdHR5cGUtXHUwMDNlZGVzYy5tb2R1bGVfbG9hZCkge1xuQEAgLTM2OCw2ICYjNDM7Mzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuIFx0XHRcdGN0dHlwZS1cdTAwM2Vjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgXHUwMDI2Y21vZC1cdTAwM2VyYW5nZSk7XG4gXHRcdFx0aWRyX3JlbW92ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcbiBcdFx0XHRrZnJlZShjbW9kKTtcbiYjNDM7XHRcdFx0JiM0MzsmIzQzO2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0XHR9XG4gXHRcdHVwX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gXHRcdGlmIChmb3VuZCBcdTAwMjZcdTAwMjYgY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCBjZjY1ZTk5OTJmZGEzMy4uMmM4MTlmYTllYWZhZDAgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vYWxsb2NfdGFnLmNcbkBAIC01LDYgJiM0Mzs1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2thbGxzeW1zLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZV9leHQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BnYWxsb2NfdGFnLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX2ZzLmhcdTAwM2VcbkBAIC0xNCw2ICYjNDM7MTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19jaG9pY2VzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bWFsbG9jLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rbWVtbGVhay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7cGFnZV9hbGxvYy5oXCYjMzQ7XG5AQCAtNTAsNiAmIzQzOzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyO1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcbiBcdGJvb2wgcHJpbnRfaGVhZGVyO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbiYjNDM7XHQvKiBpb2N0bCB1c2VzIGEgc2VwYXJhdGUgaXRlcmF0b3Igbm90IHRvIGludGVyZmVyZSB3aXRoIHJlYWRzICovXG4mIzQzO1x0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjtcbiYjNDM7XHRib29sIHBvc2l0aW9uZWQ7IC8qIHNlcV9vcGVuX3ByaXZhdGUoKSBzZXRzIHRvIDAgKi9cbiYjNDM7XHRzdHJ1Y3QgbXV0ZXggaW9jdGxfbG9jaztcbiB9O1xuIFxuIHN0YXRpYyB2b2lkICphbGxvY2luZm9fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcylcbkBAIC0xMzMsNiAmIzQzOzE0MCwzNDAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhbGxvY2luZm9fc2VxX29wID0ge1xuIFx0LnNob3dcdD0gYWxsb2NpbmZvX3Nob3csXG4gfTtcbiBcbiYjNDM7LypcbiYjNDM7ICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nXG4mIzQzOyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbiYjNDM7XHRcdFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpKTtcbiYjNDM7XHRpZiAoIXJldCkge1xuJiM0MztcdFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0XHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDbGVhbnMgdXAgdGhlIHNlcV9maWxlIHN0YXRlIGFuZCBmcmVlcyB1cCB0aGUgcHJpdmF0ZSBzdGF0ZSBhbGxvY2F0ZWQgaW5cbiYjNDM7ICogYWxsb2NpbmZvX29wZW4oKSB3aGVuIGNsb3NpbmcgdGhlIC9wcm9jL2FsbG9jaW5mbyBmaWxlIGRlc2NyaXB0b3IuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9kZXN0cm95KFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4mIzQzO1x0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHNvIHRoYXQgaXRzIGxlbmd0aCBmaXRzIHdpdGhpblxuJiM0MzsgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuXG4mIzQzOyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4mIzQzOyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG9cbiYjNDM7ICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAgYW4gZXh0cmEgc3BhY2UgZm9yIHRoZSB0cmFpbGluZyBOVUxMLiAqL1xuJiM0MztcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4mIzQzO1x0XHRzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7XG4mIzQzO1x0cmV0dXJuIHN0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ29weSBhIHN0cmluZyBhbmQgdHJpbSBmcm9tIHRoZSBiZWdpbm5pbmcgaWYgaXQmIzM5O3MgdG9vIGxvbmcgKi9cbiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbiYjNDM7e1xuJiM0MztcdHN0cnNjcHlfcGFkKGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ29tcGFyZSB0d28gc3RyaW5ncyBhbmQgb25seSBjb25zaWRlciB0aGUgdHJpbW1lZCBzdWZmaXggaWYgczEgaXMgdG9vIGxvbmcgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fY21wX3N0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHN0cm5jbXAoYWxsb2NpbmZvX3N0cihzdHIpLCB0ZW1wbGF0ZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmV0Y2ggdGhlIHBlci1DUFUgY291bnRlcnMgKi9cbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYWxsb2NfdGFnX3JlYWQoY3RfdG9fYWxsb2NfdGFnKGN0KSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWVcbiYjNDM7ICogcHJvZmlsaW5nIGNvdW50ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBnaXZlbiBrZXJuZWwgY29kZXRhZy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuJiM0MztcdFx0XHRcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMpXG4mIzQzO3tcbiYjNDM7XHRpZiAoY3QtXHUwMDNlbW9kbmFtZSlcbiYjNDM7XHRcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVx1MDAzZXRhZy5tb2RuYW1lLCBjdC1cdTAwM2Vtb2RuYW1lKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRkYXRhLVx1MDAzZXRhZy5tb2RuYW1lWzBdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcuZnVuY3Rpb24sIGN0LVx1MDAzZWZ1bmN0aW9uKTtcbiYjNDM7XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcuZmlsZW5hbWUsIGN0LVx1MDAzZWZpbGVuYW1lKTtcbiYjNDM7XHRkYXRhLVx1MDAzZXRhZy5saW5lbm8gPSBjdC1cdTAwM2VsaW5lbm87XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmJ5dGVzID0gY291bnRlcnMtXHUwMDNlYnl0ZXM7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmNhbGxzID0gY291bnRlcnMtXHUwMDNlY2FsbHM7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBjb250ZW50IElEIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uIHRhZyBtb2R1bGVcbiYjNDM7ICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBwYXJhbXM7XG4mIzQzO1xuJiM0MztcdGNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XG4mIzQzOyAqIG1hdGNoaW5nIGl0cyBjaGFyYWN0ZXJpc3RpY3MgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGZpbHRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMsXG4mIzQzO1x0XHRcdCAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpXG4mIzQzO3tcbiYjNDM7XHRib29sIGluYWNjdXJhdGU7XG4mIzQzO1xuJiM0MztcdGlmICghZmlsdGVyIHx8ICFmaWx0ZXItXHUwMDNlbWFzaylcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FKSB7XG4mIzQzO1x0XHQvKiB1c2VyIHdhbnRzIHRvIGZpbHRlciBieSBtb2RuYW1lIGJ1dCBjdC1cdTAwM2Vtb2RuYW1lIGlzIE5VTEwgKi9cbiYjNDM7XHRcdGlmICghY3QtXHUwMDNlbW9kbmFtZSkge1xuJiM0MztcdFx0XHQvKiB2YWxpZGF0ZSBpZiB1c2VyIHdhcyBhdHRlbXB0aW5nIHRvIGZpbHRlciBmb3IgYnVpbHQtaW4gYWxsb2NhdGlvbnMgKi9cbiYjNDM7XHRcdFx0aWYgKGZpbHRlci1cdTAwM2VmaWVsZHMubW9kbmFtZVswXSAhPSAmIzM5O1xcMCYjMzk7KVxuJiM0MztcdFx0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdH0gZWxzZSBpZiAoYWxsb2NpbmZvX2NtcF9zdHIoY3QtXHUwMDNlbW9kbmFtZSwgZmlsdGVyLVx1MDAzZWZpZWxkcy5tb2RuYW1lKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3QtXHUwMDNlZnVuY3Rpb24gXHUwMDI2XHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZWZ1bmN0aW9uLCBmaWx0ZXItXHUwMDNlZmllbGRzLmZ1bmN0aW9uKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3QtXHUwMDNlZmlsZW5hbWUgXHUwMDI2XHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZWZpbGVuYW1lLCBmaWx0ZXItXHUwMDNlZmllbGRzLmZpbGVuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGN0LVx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xuJiM0MztcdFx0aW5hY2N1cmF0ZSA9ICEhKGN0LVx1MDAzZWZsYWdzIFx1MDAyNiBDT0RFVEFHX0ZMQUdfSU5BQ0NVUkFURSk7XG4mIzQzO1x0XHRpZiAoaW5hY2N1cmF0ZSAhPSAhIShmaWx0ZXItXHUwMDNlZmllbGRzLmluYWNjdXJhdGUpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7XG4mIzQzO1x0XHRpZiAoISpmZXRjaGVkX2NvdW50ZXJzKSB7XG4mIzQzO1x0XHRcdCpjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRcdCpmZXRjaGVkX2NvdW50ZXJzID0gdHJ1ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgY291bnRlcnMtXHUwMDNlYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjb3VudGVycy1cdTAwM2VieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2Vla3MgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgMC1pbmRleGVkIHRhZyBwb3NpdGlvbiwgcmVhZHMgaXRzXG4mIzQzOyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXY7XG4mIzQzO1x0c3RydWN0IGNvZGV0YWcgKmN0O1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcbiYjNDM7XHRfX3U2NCBza2lwX2NvdW50O1xuJiM0MztcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcnM7XG4mIzQzO1x0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xuJiM0MztcbiYjNDM7XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2cGFyYW1zLCBhcmcsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyYW1zLmZpbHRlci5tYXNrIFx1MDAyNiB+QUxMT0NJTkZPX0ZJTFRFUl9NQVNLUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpZiAoKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgcGFyYW1zLmZpbHRlci5taW5fc2l6ZSBcdTAwM2UgcGFyYW1zLmZpbHRlci5tYXhfc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4mIzQzO1x0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyYW1zLnBvcyBcdTAwM2U9IGNvZGV0YWdfZ2V0X2NvdW50KGFsbG9jX3RhZ19jdHR5cGUpKSB7XG4mIzQzO1x0XHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRza2lwX2NvdW50ID0gcGFyYW1zLnBvcztcbiYjNDM7XG4mIzQzO1x0aWYgKHBhcmFtcy5maWx0ZXIubWFzaylcbiYjNDM7XHRcdHByaXYtXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwcml2LVx1MDAzZWZpbHRlci5tYXNrID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCB0aGUgY29kZXRhZyAqL1xuJiM0MztcdHByaXYtXHUwMDNlaW9jdGxfaXRlciA9IGNvZGV0YWdfZ2V0X2N0X2l0ZXIoYWxsb2NfdGFnX2N0dHlwZSk7XG4mIzQzO1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGN0KSB7XG4mIzQzO1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFx1MDAyNnByaXYtXHUwMDNlZmlsdGVyLCBcdTAwMjZjb3VudGVycywgXHUwMDI2ZmV0Y2hlZF9jb3VudGVycykpIHtcbiYjNDM7XHRcdFx0aWYgKHNraXBfY291bnQgPT0gMClcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0c2tpcF9jb3VudC0tO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdCkge1xuJiM0MztcdFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxuJiM0MztcdFx0XHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMuZGF0YSwgXHUwMDI2Y291bnRlcnMpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoIWN0KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWR2YW5jZXMgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGFsbG9jYXRpb24gdGFnIGluIHRoZSBzZXF1ZW5jZSBhbmRcbiYjNDM7ICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xuJiM0MztcdHN0cnVjdCBjb2RldGFnICpjdDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtcztcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXJzO1xuJiM0MztcdGJvb2wgZmV0Y2hlZF9jb3VudGVycztcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xuJiM0MztcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbiYjNDM7XHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4mIzQzO1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2Vwb3NpdGlvbmVkKSB7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGN0ID0gY29kZXRhZ19uZXh0X2N0KFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfaXRlcik7XG4mIzQzO1x0d2hpbGUgKGN0KSB7XG4mIzQzO1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFx1MDAyNnByaXYtXHUwMDNlZmlsdGVyLCBcdTAwMjZjb3VudGVycywgXHUwMDI2ZmV0Y2hlZF9jb3VudGVycykpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdCkge1xuJiM0MztcdFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxuJiM0MztcdFx0XHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMsIFx1MDAyNmNvdW50ZXJzKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFjdCkge1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XG4mIzQzO1x0XHRyZXQgPSAtRU5PRU5UO1xuJiM0MztcdH1cbiYjNDM7XHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSAwKSB7XG4mIzQzO1x0XHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2cGFyYW1zLCBzaXplb2YocGFyYW1zKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFbnRyeSBwb2ludCBpb2N0bCBmdW5jdGlvbiBmb3IgL3Byb2MvYWxsb2NpbmZvIHJvdXRpbmcgcmVxdWVzdHMgdG8gZmV0Y2ggdGhlXG4mIzQzOyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBsb25nIGFsbG9jaW5mb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4mIzQzO3tcbiYjNDM7XHR2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopX19hcmc7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChjbWQpIHtcbiYjNDM7XHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcbiYjNDM7XHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XG4mIzQzO1x0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxuJiM0MztcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldCA9IC1FTk9JT0NUTENNRDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2lmZGVmIENPTkZJR19DT01QQVRcbiYjNDM7c3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBhbGxvY2luZm9fcHJvY19vcHMgPSB7XG4mIzQzO1x0LnByb2Nfb3Blblx0XHQ9IGFsbG9jaW5mb19vcGVuLFxuJiM0MztcdC5wcm9jX3JlYWRfaXRlclx0XHQ9IHNlcV9yZWFkX2l0ZXIsXG4mIzQzO1x0LnByb2NfbHNlZWtcdFx0PSBzZXFfbHNlZWssXG4mIzQzO1x0LnByb2NfcmVsZWFzZVx0XHQ9IGFsbG9jaW5mb19yZWxlYXNlLFxuJiM0MztcdC5wcm9jX2lvY3RsXHRcdD0gYWxsb2NpbmZvX2lvY3RsLFxuJiM0MzsjaWZkZWYgQ09ORklHX0NPTVBBVFxuJiM0MztcdC5wcm9jX2NvbXBhdF9pb2N0bFx0PSBhbGxvY2luZm9fY29tcGF0X2lvY3RsLFxuJiM0MzsjZW5kaWZcbiYjNDM7fTtcbiYjNDM7XG4gc2l6ZV90IGFsbG9jX3RhZ190b3BfdXNlcnMoc3RydWN0IGNvZGV0YWdfYnl0ZXMgKnRhZ3MsIHNpemVfdCBjb3VudCwgYm9vbCBjYW5fc2xlZXApXG4ge1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjtcbkBAIC05ODQsOCAmIzQzOzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKVxuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XG4mIzQzO1x0aWYgKCFwcm9jX2NyZWF0ZShBTExPQ0lORk9fRklMRV9OQU1FLCAwNDAwLCBOVUxMLCBcdTAwMjZhbGxvY2luZm9fcHJvY19vcHMpKSB7XG4gXHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcXG5cJiMzNDssIEFMTE9DSU5GT19GSUxFX05BTUUpO1xuIFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuaW5kZXggOGQ0ZGIyMjQxY2MyYTIuLjEyOTQxZDY4YTdmOGFlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtMSw1ICYjNDM7MSw2IEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFRBUkdFVFMgJiM0Mzs9IGFjY3RcbiYjNDM7VEFSR0VUUyAmIzQzOz0gYWxsb2NfdGFnXG4gVEFSR0VUUyAmIzQzOz0gYWxzYVxuIFRBUkdFVFMgJiM0Mzs9IGFtZC1wc3RhdGVcbiBUQVJHRVRTICYjNDM7PSBhcm02NFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mNDFkOTJkMDZiMTg0OFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSw5IEBAXG4mIzQzOyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzO1RFU1RfR0VOX1BST0dTIDo9IGFsbG9jaW5mb19pb2N0bF90ZXN0XG4mIzQzO1xuJiM0MztDRkxBR1MgJiM0Mzs9IC1XYWxsXG4mIzQzO0NGTEFHUyAmIzQzOz0gJChLSERSX0lOQ0xVREVTKVxuJiM0MztcbiYjNDM7aW5jbHVkZSAuLi9saWIubWtcbiYjNDM7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43ZDk0YWJiNzg1YTE0OFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmNcbkBAIC0wLDAgJiM0MzsxLDU0OCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzO1xuJiM0MzsvKiBrc2VsZnRlc3QgZm9yIGFsbG9jaW5mbyBpb2N0bFxuJiM0MzsgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYWxsb2NfdGFnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4va3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0xJTkVfTEVOXHRcdDUxMlxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19QUk9DXHRcdFwmIzM0Oy9wcm9jL2FsbG9jaW5mb1wmIzM0O1xuJiM0MztcbiYjNDM7ZW51bSBpb2N0bF9yZXQge1xuJiM0MztcdElPQ1RMX1NVQ0NFU1MgPSAwLFxuJiM0MztcdElPQ1RMX0ZBSUxVUkUgPSAxLFxuJiM0MztcdElPQ1RMX0lOVkFMSURfREFUQSA9IDIsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFZFQ19NQVhfRU5UUklFUyAzMlxuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMge1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgdGFnW1ZFQ19NQVhfRU5UUklFU107XG4mIzQzO1x0X191NjQgY291bnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X2F0KGludCBkZXZfZmQsIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0ICpwYXJhbXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0dFVF9BVCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X25leHQoaW50IGRldl9mZCwgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcGFyYW1zKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YWdfZGF0YSxcbiYjNDM7XHRcdFx0Ym9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXG4mIzQzO1x0XHRcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAobWF0Y2hfYnl0ZXMgXHUwMDI2XHUwMDI2IHRhZ19kYXRhLVx1MDAzZWNvdW50ZXIuYnl0ZXMgIT0gcHJvY2ZzX2VudHJ5LVx1MDAzZWNvdW50ZXIuYnl0ZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O3NpemUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtYXRjaF9jYWxscyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXHUwMDNlY291bnRlci5jYWxscykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Y2FsbCBjb3VudCByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hdGNoX2xpbmVubyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNldGFnLmxpbmVubyAhPSBwcm9jZnNfZW50cnktXHUwMDNldGFnLmxpbmVubykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWF0Y2hfZnVuY3Rpb24gXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHN0cm5jbXAodGFnX2RhdGEtXHUwMDNldGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hdGNoX2ZpbGVuYW1lIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBzdHJuY21wKHRhZ19kYXRhLVx1MDAzZXRhZy5maWxlbmFtZSwgcHJvY2ZzX2VudHJ5LVx1MDAzZXRhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7ZmlsZW5hbWUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIG1hdGNoX2VudHJpZXMoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxuJiM0MztcdFx0XHQgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuJiM0MztcdFx0XHQgIGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLFxuJiM0MztcdFx0XHQgIGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRfX3U2NCBpO1xuJiM0MztcbiYjNDM7XHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgIT0gdGFncy1cdTAwM2Vjb3VudCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RW50cnkgY291bnQgbWlzbWF0Y2guIGlvY3RsIGVudHJpZXM6ICVsbHUsIHByb2MgZW50cmllczogJWxsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHRhZ3MtXHUwMDNlY291bnQsIHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIW1hdGNoX2VudHJ5KFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1tpXSwgXHUwMDI2dGFncy1cdTAwM2V0YWdbaV0sXG4mIzQzO1x0XHRcdFx0IG1hdGNoX2J5dGVzLCBtYXRjaF9jYWxscywgbWF0Y2hfbGluZW5vLFxuJiM0MztcdFx0XHRcdCBtYXRjaF9mdW5jdGlvbiwgbWF0Y2hfZmlsZW5hbWUpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVsbHV0aCBlbnRyeSBkb2VzIG5vdCBtYXRjaC5cXG5cJiMzNDssIGkpO1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4mIzQzO1xuJiM0MztcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4mIzQzO1x0XHRzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7XG4mIzQzO1x0cmV0dXJuIHN0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbiYjNDM7e1xuJiM0MztcdHN0cm5jcHkoZGVzdCwgYWxsb2NpbmZvX3N0cihzcmMpLCBBTExPQ0lORk9fU1RSX1NJWkUgLSAxKTtcbiYjNDM7XHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxuJiM0MztcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihBTExPQ0lORk9fUFJPQywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0Y2hhciBsaW5lW01BWF9MSU5FX0xFTl07XG4mIzQzO1x0aW50IG1hdGNoZXM7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBwcm9jZnNfZW50cnk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZhaWxlZCB0byBvcGVuIFwmIzM0OyBBTExPQ0lORk9fUFJPQyBcJiMzNDsgZm9yIHJlYWRpbmdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0fVxuJiM0MztcdG1lbXNldChwcm9jZnNfZW50cmllcywgMCwgc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUykge1xuJiM0MztcdFx0Y2hhciBmaWxlbmFtZVtNQVhfTElORV9MRU5dO1xuJiM0MztcdFx0Y2hhciBmdW5jdGlvbltNQVhfTElORV9MRU5dO1xuJiM0MztcbiYjNDM7XHRcdG1lbXNldChcdTAwMjZwcm9jZnNfZW50cnksIDAsIHNpemVvZihwcm9jZnNfZW50cnkpKTtcbiYjNDM7XHRcdG1hdGNoZXMgPSBzc2NhbmYobGluZSwgXCYjMzQ7JWxsdSAlbGx1ICVbXjpdOiVsbHUgZnVuYzolc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgXHUwMDI2cHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMsXG4mIzQzO1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLFxuJiM0MztcdFx0XHRcdCBmaWxlbmFtZSxcbiYjNDM7XHRcdFx0XHQgXHUwMDI2cHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8sXG4mIzQzO1x0XHRcdFx0IGZ1bmN0aW9uKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWF0Y2hlcyAhPSA1KVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5maWxlbmFtZSwgZmlsZW5hbWUpO1xuJiM0MztcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sIGZ1bmN0aW9uKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkge1xuJiM0MztcdFx0XHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdCAgICBmaWx0ZXItXHUwMDNlZmllbGRzLmZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHtcbiYjNDM7XHRcdFx0aWYgKHN0cm5jbXAocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbixcbiYjNDM7XHRcdFx0XHQgICAgZmlsdGVyLVx1MDAzZWZpZWxkcy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xuJiM0MztcdFx0XHRpZiAocHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8gIT0gZmlsdGVyLVx1MDAzZWZpZWxkcy5saW5lbm8pXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkge1xuJiM0MztcdFx0XHRpZiAocHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSB7XG4mIzQzO1x0XHRcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZwcm9jZnNfZW50cmllcy1cdTAwM2V0YWdbcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2cHJvY2ZzX2VudHJ5LFxuJiM0MztcdFx0ICAgICAgIHNpemVvZihwcm9jZnNfZW50cnkpKTtcbiYjNDM7XHR9XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGVudW0gaW9jdGxfcmV0IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuJiM0MztcdFx0XHRcdFx0XHQgY29uc3Qgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbiYjNDM7XHRcdFx0XHRcdFx0IF9fdTY0IHN0YXJ0X3BvcylcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oQUxMT0NJTkZPX1BST0MsIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGYWlsZWQgdG8gb3BlbiBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7IGZvciBJT0NUTFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gSU9DVExfRkFJTFVSRTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBzdGFydF9jb250X2lkLCBlbmRfY29udF9pZDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuJiM0MztcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xuJiM0MztcdGludCByZXRyeV9jb3VudCA9IDA7XG4mIzQzO1x0aW50IHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgaWYgYSBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWRcbiYjNDM7XHQgKiBiZXR3ZWVuIHRoZSB0d28gY2FsbHMuIElmIHRoYXQgaGFwcGVucywgdGhlIGRhdGEgZ2F0aGVyZWQgY2Fubm90IGJlIGNvbnNpZGVyZWQgY29uc2lzdGVudFxuJiM0MztcdCAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBmZXRjaGVkIGFnYWluIHRvIGF2b2lkIGZsYWtpbmVzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFx1MDAyNnN0YXJ0X2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRtZW1zZXQodGFncywgMCwgc2l6ZW9mKCp0YWdzKSk7XG4mIzQzO1x0XHRtZW1zZXQoXHUwMDI2Z2V0X2F0X3BhcmFtcywgMCwgc2l6ZW9mKGdldF9hdF9wYXJhbXMpKTtcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgZmlsdGVyLCBzaXplb2YoKmZpbHRlcikpO1xuJiM0MztcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XG4mIzQzO1x0XHRpZiAoX19hbGxvY2luZm9fZ2V0X2F0KGZkLCBcdTAwMjZnZXRfYXRfcGFyYW1zKSkge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDthbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bWVtY3B5KFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLCBzaXplb2YoZ2V0X2F0X3BhcmFtcy5kYXRhKSk7XG4mIzQzO1xuJiM0MztcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXHUwMDI2dGFncy1cdTAwM2V0YWdbdGFncy1cdTAwM2Vjb3VudF0pID09IDApXG4mIzQzO1x0XHRcdHRhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7O1xuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZCkge1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9TVUNDRVNTO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIG1pc21hdGNoLCByZXRyeWluZy4uLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHN0YXR1cyA9IElPQ1RMX0lOVkFMSURfREFUQTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IHdoaWxlIChzdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBIFx1MDAyNlx1MDAyNiByZXRyeV9jb3VudCYjNDM7JiM0MzsgXHUwMDNjIG1heF9yZXRyaWVzKTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiBzdGF0dXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuJiM0MztcdGludCBpb2N0bF9zdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IEtTRlRfUEFTUztcbiYjNDM7XG4mIzQzO1x0aWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7TWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCA9PSAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtObyBlbnRyaWVzIGZvdW5kIGluIFwmIzM0OyBBTExPQ0lORk9fUFJPQyBcJiMzNDssIHNraXBwaW5nIHRlc3RcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9TS0lQO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgZmlsdGVyLCAwKTtcbiYjNDM7XHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1xuJiM0MztleGl0OlxuJiM0MztcdGZyZWUodGFncyk7XG4mIzQzO1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuJiM0MztcdGNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9IFwmIzM0O21tL21lbW9yeS5jXCYjMzQ7O1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XG4mIzQzO1x0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FO1xuJiM0MztcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5maWxlbmFtZSwgdGFyZ2V0X2ZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcnVuX2ZpbHRlcl90ZXN0KFx1MDAyNmZpbHRlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdGVzdF9mdW5jdGlvbl9maWx0ZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbiYjNDM7XHRjb25zdCBjaGFyICp0YXJnZXRfZnVuY3Rpb24gPSBcJiMzNDtkdXBfbW1cJiMzNDs7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbiYjNDM7XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047XG4mIzQzO1x0c3RybmNweShmaWx0ZXIuZmllbGRzLmZ1bmN0aW9uLCB0YXJnZXRfZnVuY3Rpb24sIEFMTE9DSU5GT19TVFJfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXHUwMDI2ZmlsdGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X3NpemVfZmlsdGVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4mIzQzO1x0aW50IHJldCA9IEtTRlRfUEFTUztcbiYjNDM7XHRfX3U2NCB0YXJnZXRfc2l6ZSwgaSwgcG9zO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7XG4mIzQzO1x0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXCYjMzQ7ZG9faW5pdF9tb2R1bGVcJiMzNDs7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xuJiM0MztcdGludCByZXRyeSA9IDA7XG4mIzQzO1x0Y29uc3QgaW50IG1heF9yZXRyaWVzID0gMTA7XG4mIzQzO1xuJiM0MztcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0Z290byBmcmVlbWVtO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGYWlsZWQgdG8gb3BlbiBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7OiAlc1xcblwmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZnJlZW1lbTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGZvdW5kX3RhZyA9IE5VTEw7XG4mIzQzO1x0XHRwb3MgPSAwO1xuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfRkFJTDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbiYjNDM7XHRcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjtcbiYjNDM7XHRcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIFx1MDAyNmZpbHRlcikpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCYjMzQ7IEFMTE9DSU5GT19QUk9DIFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCA9PSAwKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0Z1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcXG5cJiMzNDssIHRhcmdldF9mdW5jdGlvbik7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRhcmdldF9zaXplID0gcHJvY2ZzX2VudHJpZXMtXHUwMDNldGFnWzBdLmNvdW50ZXIuYnl0ZXM7XG4mIzQzO1xuJiM0MztcdFx0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuJiM0MztcdFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFIHwgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFO1xuJiM0MztcdFx0ZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7XG4mIzQzO1x0XHRmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAoMSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuJiM0MztcbiYjNDM7XHRcdFx0bWVtc2V0KFx1MDAyNmdldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7XG4mIzQzO1x0XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXHUwMDI2ZmlsdGVyLCBzaXplb2YoZmlsdGVyKSk7XG4mIzQzO1x0XHRcdGdldF9hdF9wYXJhbXMucG9zID0gcG9zO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9hdChmZCwgXHUwMDI2Z2V0X2F0X3BhcmFtcykpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0XHR0YWdzLVx1MDAzZWNvdW50ID0gMDtcbiYjNDM7XHRcdFx0bWVtY3B5KFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxuJiM0MztcdFx0XHQgICAgICAgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xuJiM0MztcbiYjNDM7XHRcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgICAgIF9fYWxsb2NpbmZvX2dldF9uZXh0KGZkLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50XSkgPT0gMClcbiYjNDM7XHRcdFx0XHR0YWdzLVx1MDAzZWNvdW50JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKHN0cmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xuJiM0MztcdFx0XHRcdFx0Zm91bmRfdGFnID0gXHUwMDI2dGFncy1cdTAwM2V0YWdbaV07XG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChmb3VuZF90YWcgfHwgdGFncy1cdTAwM2Vjb3VudCBcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdFx0cG9zICYjNDM7PSB0YWdzLVx1MDAzZWNvdW50O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7TW9kdWxlIGxvYWQgZGV0ZWN0ZWQgZHVyaW5nIHNpemUgdmVyaWZpY2F0aW9uLCByZXRyeWluZy4uLlxcblwmIzM0Oyk7XG4mIzQzO1x0fSB3aGlsZSAocmV0cnkmIzQzOyYjNDM7IFx1MDAzYyBtYXhfcmV0cmllcyk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkIFx1MDAyNlx1MDAyNiAhZm91bmRfdGFnKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgdGFyZ2V0X2Z1bmN0aW9uKTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfRkFJTDtcbiYjNDM7XHR9IGVsc2UgaWYgKHN0YXJ0X2NvbnRfaWQuaWQgIT0gZW5kX2NvbnRfaWQuaWQpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9TS0lQO1xuJiM0MztcdH0gZWxzZSBpZiAoZm91bmRfdGFnIFx1MDAyNlx1MDAyNiBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcyAhPSB0YXJnZXRfc2l6ZSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7SU9DVEwgZW50cnkgc2l6ZSAlbGx1IGRvZXMgbm90IG1hdGNoIHRhcmdldCBzaXplICVsbHVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcywgdGFyZ2V0X3NpemUpO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO2V4aXQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztmcmVlbWVtOlxuJiM0MztcdGZyZWUodGFncyk7XG4mIzQzO1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X2xpbmVub19maWx0ZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuJiM0MztcdGVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xuJiM0MztcdF9fdTY0IHRhcmdldF9saW5lbm8sIGk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZztcbiYjNDM7XHRib29sIGZvdW5kID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBcdTAwMjZmaWx0ZXIpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50ID09IDApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2UgZGVwZW5kIG9uIHRoZSBwcm9jZnMgcmVzdWx0cyB0byBkZXRlcm1pbmUgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgZmlsdGVyIGJlZm9yZVxuJiM0MztcdCAqIG1ha2luZyB0aGUgaW9jdGwgcXVlcnkuIEhlbmNlLCB3ZSBjYW5ub3QgcmV1c2UgcnVuX2ZpbHRlcl90ZXN0IGhlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0dGFyZ2V0X3RhZyA9IFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1swXTtcbiYjNDM7XHR0YXJnZXRfbGluZW5vID0gdGFyZ2V0X3RhZy1cdTAwM2V0YWcubGluZW5vO1xuJiM0MztcbiYjNDM7XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PO1xuJiM0MztcdGZpbHRlci5maWVsZHMubGluZW5vID0gdGFyZ2V0X2xpbmVubztcbiYjNDM7XG4mIzQzO1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXHUwMDI2ZmlsdGVyLCAwKTtcbiYjNDM7XHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWdzLVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5saW5lbm8gIT0gdGFyZ2V0X2xpbmVubykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICBpLCB0YWdzLVx1MDAzZXRhZ1tpXS50YWcubGluZW5vKTtcbiYjNDM7XHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0cm5jbXAodGFncy1cdTAwM2V0YWdbaV0udGFnLmZ1bmN0aW9uLCB0YXJnZXRfdGFnLVx1MDAzZXRhZy5mdW5jdGlvbixcbiYjNDM7XHRcdFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBzdHJuY21wKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5maWxlbmFtZSwgdGFyZ2V0X3RhZy1cdTAwM2V0YWcuZmlsZW5hbWUsXG4mIzQzO1x0XHRcdCAgICBBTExPQ0lORk9fU1RSX1NJWkUpID09IDApXG4mIzQzO1x0XHRcdGZvdW5kID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghZm91bmQpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O09yaWdpbmFsIHByb2NmcyBlbnRyeSBub3QgZm91bmQgaW4gSU9DVEwgbGluZW5vIGZpbHRlciByZXN1bHRzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7ZXhpdDpcbiYjNDM7XHRmcmVlKHRhZ3MpO1xuJiM0MztcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKDQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcigpO1xuJiM0MztcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0O1NraXBwaW5nIHRlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwmIzM0O3Rlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gdGVzdF9mdW5jdGlvbl9maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcJiMzNDt0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHRlc3Rfc2l6ZV9maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X3NpemVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwmIzM0O3Rlc3Rfc2l6ZV9maWx0ZXJcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB0ZXN0X2xpbmVub19maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X2xpbmVub19maWx0ZXJcXG5cJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXCYjMzQ7dGVzdF9saW5lbm9fZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNX0FMTE9DX1BST0ZJTElORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2F0JiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfbmV4dCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2NvbXBhdF9pb2N0bCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fb3BlbiYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fcmVsZWFzZSYjMzQ7LAogICAgJiMzNDttYXRjaGVzX2ZpbHRlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGlvY3RsIGludGVyZmFjZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHZpYSAvcHJvYy9hbGxvY2luZm8uIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb25hbCBBUEkgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBKdWwgOSAxMTo1MDowMyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3QKaW5kZXggNTM4OWQyNDExNzZhOGEuLmMzYTI4NDY3OTU1ZjNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdApAQCAtNDYsNiAmIzQzOzQ2LDExIEBAIHN5c2N0bDoKIFJ1bnRpbWUgaW5mbzoKICAgL3Byb2MvYWxsb2NpbmZvCiAKJiM0MzsgIFByb2ZpbGluZyBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZWl0aGVyIGJ5IHJlYWRpbmcgYC9wcm9jL2FsbG9jaW5mb2AgZGlyZWN0bHkgYXMKJiM0MzsgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYCZsdDt1YXBpL2xpbnV4L2FsbG9jX3RhZy5oJmd0O2AuCiYjNDM7ICBUaGUgaW9jdGwgaW50ZXJmYWNlIHN1cHBvcnRzIHN0cnVjdHVyZWQgYmluYXJ5IGRhdGEgZXh0cmFjdGlvbiBhcyB3ZWxsIGFzIGZpbHRlcmluZwomIzQzOyAgYnkgbW9kdWxlIG5hbWUsIGZ1bmN0aW9uLCBmaWxlLCBsaW5lIG51bWJlciwgYWNjdXJhY3ksIG9yIGFsbG9jYXRpb24gc2l6ZSBsaW1pdHMuCiYjNDM7CiBFeGFtcGxlIG91dHB1dDo6CiAKICAgcm9vdEBtb3JpYS1rdm06fiMgc29ydCAtZyAvcHJvYy9hbGxvY2luZm98dGFpbHxudW1mbXQgLS10bz1pZWMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0IGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QKaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdApAQCAtMzQ2LDYgJiM0MzszNDYsOCBAQCBDb2RlICBTZXEjICAgIEluY2x1ZGUgRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDttYWlsdG86bHV6bWF4aW1pbGlhbkBnbWFpbC5jb20mZ3Q7CiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbSZndDsKJiM0MzsweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZwomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbSZndDsKIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmgKIDB4QUIgIDAwLTFGICBsaW51eC9uYmQuaAogMHhBQyAgMDAtMUYgIGxpbnV4L3Jhdy5oCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGQxOTgyMmQ1NzRmZDQ4Li4zZDU0ZmQ4ZDY5YzFjNiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlMKQEAgLTE2OTM2LDcgJiM0MzsxNjkzNiw5IEBAIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0CiBGOglpbmNsdWRlL2xpbnV4L2FsbG9jX3RhZy5oCiBGOglpbmNsdWRlL2xpbnV4L3BnYWxsb2NfdGFnLmgKJiM0MztGOglpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmgKIEY6CW1tL2FsbG9jX3RhZy5jCiYjNDM7RjoJdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnLwogCiBNRU1PUlkgTUFOQUdFTUVOVCAtIEJBTExPT04KIE06CUFuZHJldyBNb3J0b24gJmx0O2FrcG1AbGludXgtZm91bmRhdGlvbi5vcmcmZ3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaCBiL2luY2x1ZGUvbGludXgvY29kZXRhZy5oCmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb2RldGFnLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmgKQEAgLTc3LDYgJiM0Mzs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHsKIHZvaWQgY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7CiBib29sIGNvZGV0YWdfdHJ5bG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwomIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwomIzQzO3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogc3RydWN0IGNvZGV0YWcgKmNvZGV0YWdfbmV4dF9jdChzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciAqaXRlcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uMjcwZjY5M2IxODIyMDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmgKQEAgLTAsMCAmIzQzOzEsOTkgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwomIzQzOy8qCiYjNDM7ICogYWxsb2NfdGFnIElPQ1RMIEFQSSBkZWZpbml0aW9uCiYjNDM7ICoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgomIzQzOyAqCiYjNDM7ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJiM0MzsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwomIzQzOyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX1VBUElfQUxMT0NfVEFHX0gKJiM0MzsjZGVmaW5lIF9VQVBJX0FMTE9DX1RBR19ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBGdW5jdGlvbiwgZmlsZSBhbmQgbW9kdWxlIG5hbWVzIG9mdGVuIGhhdmUgdGhlIHNhbWUgcHJlZml4ZXMsIHRoZXJlZm9yZQomIzQzOyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG8KJiM0MzsgKiBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBuYW1lIGNvbGxpc2lvbnMKJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19TVFJfU0laRQk2NAomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7CiYjNDM7CV9fdTY0IGlkOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWcgewomIzQzOwkvKiBMb25nZXIgbmFtZXMgYXJlIHRyaW1tZWQgKi8KJiM0MzsJY2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07CiYjNDM7CWNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTsKJiM0MzsJY2hhciBmaWxlbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdOwomIzQzOwlfX3U2NCBsaW5lbm87CiYjNDM7CS8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqLwomIzQzOwlfX3U2NCBpbmFjY3VyYXRlOwomIzQzO307CiYjNDM7CiYjNDM7LyogVGhlIGFsaWdubWVudCBlbnN1cmVzIDMyLWJpdCBjb21wYXRpYmxlIGludGVyZmFjZXMgYXJlIG5vdCBicm9rZW4gKi8KJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvdW50ZXIgewomIzQzOwlfX3U2NCBieXRlczsKJiM0MzsJX191NjQgY2FsbHM7CiYjNDM7CV9fdTggYWNjdXJhdGU7CiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnIHRhZzsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19jb3VudGVyIGNvdW50ZXI7CiYjNDM7fTsKJiM0MzsKJiM0MztlbnVtIHsKJiM0MzsJQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0ZVTkNUSU9OLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0ZJTEVOQU1FLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0xJTkVOTywKJiM0MzsJQUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFLAomIzQzOwlfX0FMTE9DSU5GT19GSUxURVJfTEFTVCA9IEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUUJCSgxICZsdDsmbHQ7IEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTgkJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTikKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRQkJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8JCSgxICZsdDsmbHQ7IEFMTE9DSU5GT19GSUxURVJfTElORU5PKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEUJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFCQkoMSAmbHQ7Jmx0OyBBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFCQkoMSAmbHQ7Jmx0OyBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFKQomIzQzOwomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLUyBcCiYjNDM7CSgoMSAmbHQ7Jmx0OyAoX19BTExPQ0lORk9fRklMVEVSX0xBU1QgJiM0MzsgMSkpIC0gMSkKJiM0MzsKJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7CiYjNDM7CV9fdTY0IG1hc2s7IC8qIGJpdG1hc2sgb2YgdGhlIGZpbHRlciBmaWVsZHMgdXNlZCAqLwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7CiYjNDM7CV9fdTY0IG1pbl9zaXplOwomIzQzOwlfX3U2NCBtYXhfc2l6ZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHsKJiM0MzsJLyogaW5wdXRzICovCiYjNDM7CV9fdTY0IHBvczsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyOwomIzQzOwkvKiBvdXRwdXQgKi8KJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lECTAKJiM0MzsjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9BVAkJMQomIzQzOyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQJCTIKJiM0MzsKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRQkJMHhBNgomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lECV9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELAlcCiYjNDM7CQkJCQkgICAgIHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfR0VUX0FUCQlfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCwJXAomIzQzOwkJCQkJICAgICAgc3RydWN0IGFsbG9jaW5mb19nZXRfYXQpCiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUCQlfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsCVwKJiM0MzsJCQkJCSAgICAgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSkKJiM0MzsKJiM0MzsjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jb2RldGFnLmMgYi9saWIvY29kZXRhZy5jCmluZGV4IDQwMDFhN2VhNjY3NTQyLi5hOWNkYTRjOTYyYTMwMyAxMDA2NDQKLS0tIGEvbGliL2NvZGV0YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9saWIvY29kZXRhZy5jCkBAIC0xOSw2ICYjNDM7MTksOCBAQCBzdHJ1Y3QgY29kZXRhZ190eXBlIHsKIAlzdHJ1Y3QgY29kZXRhZ190eXBlX2Rlc2MgZGVzYzsKIAkvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi8KIAl1bnNpZ25lZCBsb25nIG5leHRfbW9kX3NlcTsKJiM0MzsJLyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBjb250ZW50X2lkOwogfTsKIAogc3RydWN0IGNvZGV0YWdfcmFuZ2UgewpAQCAtNTAsNiAmIzQzOzUyLDIwIEBAIHZvaWQgY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKQogCXVwX3JlYWQoJmFtcDtjdHR5cGUtJmd0O21vZF9sb2NrKTsKIH0KIAomIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y3R0eXBlLSZndDttb2RfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiBjdHR5cGUtJmd0O2NvbnRlbnRfaWQ7CiYjNDM7fQomIzQzOwomIzQzO3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y3R0eXBlLSZndDttb2RfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiBjdHR5cGUtJmd0O2NvdW50OwomIzQzO30KJiM0MzsKIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKQogewogCXN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXIgPSB7CkBAIC0yMDQsNiAmIzQzOzIyMCw3IEBAIHN0YXRpYyBpbnQgY29kZXRhZ19tb2R1bGVfaW5pdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIAogCWRvd25fd3JpdGUoJmFtcDtjdHR5cGUtJmd0O21vZF9sb2NrKTsKIAljbW9kLSZndDttb2Rfc2VxID0gJiM0MzsmIzQzO2N0dHlwZS0mZ3Q7bmV4dF9tb2Rfc2VxOwomIzQzOwkmIzQzOyYjNDM7Y3R0eXBlLSZndDtjb250ZW50X2lkOwogCW1vZF9pZCA9IGlkcl9hbGxvYygmYW1wO2N0dHlwZS0mZ3Q7bW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1vZF9pZCAmZ3Q7PSAwKSB7CiAJCWlmIChjdHR5cGUtJmd0O2Rlc2MubW9kdWxlX2xvYWQpIHsKQEAgLTM2OCw2ICYjNDM7Mzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKQogCQkJY3R0eXBlLSZndDtjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgJmFtcDtjbW9kLSZndDtyYW5nZSk7CiAJCQlpZHJfcmVtb3ZlKCZhbXA7Y3R0eXBlLSZndDttb2RfaWRyLCBtb2RfaWQpOwogCQkJa2ZyZWUoY21vZCk7CiYjNDM7CQkJJiM0MzsmIzQzO2N0dHlwZS0mZ3Q7Y29udGVudF9pZDsKIAkJfQogCQl1cF93cml0ZSgmYW1wO2N0dHlwZS0mZ3Q7bW9kX2xvY2spOwogCQlpZiAoZm91bmQgJmFtcDsmYW1wOyBjdHR5cGUtJmd0O2Rlc2MuZnJlZV9zZWN0aW9uX21lbSkKZGlmZiAtLWdpdCBhL21tL2FsbG9jX3RhZy5jIGIvbW0vYWxsb2NfdGFnLmMKaW5kZXggY2Y2NWU5OTkyZmRhMzMuLjJjODE5ZmE5ZWFmYWQwIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtNSw2ICYjNDM7NSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva2FsbHN5bXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbXV0ZXguaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYWdlX2V4dC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3BnYWxsb2NfdGFnLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHJvY19mcy5oJmd0OwpAQCAtMTQsNiAmIzQzOzE1LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfY2hvaWNlcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3ZtYWxsb2MuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rbWVtbGVhay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1YXBpL2xpbnV4L2FsbG9jX3RhZy5oJmd0OwogCiAjaW5jbHVkZSAmIzM0O2ludGVybmFsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDtwYWdlX2FsbG9jLmgmIzM0OwpAQCAtNTAsNiAmIzQzOzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7CiAJc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjsKIAlzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciByZXBvcnRlZF9pdGVyOwogCWJvb2wgcHJpbnRfaGVhZGVyOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CS8qIGlvY3RsIHVzZXMgYSBzZXBhcmF0ZSBpdGVyYXRvciBub3QgdG8gaW50ZXJmZXJlIHdpdGggcmVhZHMgKi8KJiM0MzsJc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjsKJiM0MzsJYm9vbCBwb3NpdGlvbmVkOyAvKiBzZXFfb3Blbl9wcml2YXRlKCkgc2V0cyB0byAwICovCiYjNDM7CXN0cnVjdCBtdXRleCBpb2N0bF9sb2NrOwogfTsKIAogc3RhdGljIHZvaWQgKmFsbG9jaW5mb19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQpAQCAtMTMzLDYgJiM0MzsxNDAsMzQwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWxsb2NpbmZvX3NlcV9vcCA9IHsKIAkuc2hvdwk9IGFsbG9jaW5mb19zaG93LAogfTsKIAomIzQzOy8qCiYjNDM7ICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nCiYjNDM7ICogdGhlIC9wcm9jL2FsbG9jaW5mbyBwcm9jZnMgZW50cnkuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgJmFtcDthbGxvY2luZm9fc2VxX29wLAomIzQzOwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGFsbG9jaW5mb19wcml2YXRlKSk7CiYjNDM7CWlmICghcmV0KSB7CiYjNDM7CQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CQlzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwkJbXV0ZXhfaW5pdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2xlYW5zIHVwIHRoZSBzZXFfZmlsZSBzdGF0ZSBhbmQgZnJlZXMgdXAgdGhlIHByaXZhdGUgc3RhdGUgYWxsb2NhdGVkIGluCiYjNDM7ICogYWxsb2NpbmZvX29wZW4oKSB3aGVuIGNsb3NpbmcgdGhlIC9wcm9jL2FsbG9jaW5mbyBmaWxlIGRlc2NyaXB0b3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJbXV0ZXhfZGVzdHJveSgmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN1ZmZpeCBvZiBhIHN0cmluZyBzbyB0aGF0IGl0cyBsZW5ndGggZml0cyB3aXRoaW4KJiM0MzsgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuCiYjNDM7ICogRnVuY3Rpb24sIGZpbGUgYW5kIG1vZHVsZSBuYW1lcyBvZnRlbiBoYXZlIHRoZSBzYW1lIHByZWZpeGVzLCB0aGVyZWZvcmUKJiM0MzsgKiB3aGVuIGZpbHRlcmluZyBieSB0aGVzZSBjcml0ZXJpYSwgd2UgY29tcGFyZSB0aGUgbGFzdCA2NCBjaGFyYWN0ZXJzIHRvCiYjNDM7ICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmFsbG9jaW5mb19zdHIoY29uc3QgY2hhciAqc3RyKQomIzQzO3sKJiM0MzsJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOwomIzQzOwomIzQzOwkvKiBLZWVwIGFuIGV4dHJhIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgTlVMTC4gKi8KJiM0MzsJaWYgKGxlbiAmZ3Q7PSBBTExPQ0lORk9fU1RSX1NJWkUpCiYjNDM7CQlzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7CiYjNDM7CXJldHVybiBzdHI7CiYjNDM7fQomIzQzOwomIzQzOy8qIENvcHkgYSBzdHJpbmcgYW5kIHRyaW0gZnJvbSB0aGUgYmVnaW5uaW5nIGlmIGl0JiMzOTtzIHRvbyBsb25nICovCiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKJiM0Mzt7CiYjNDM7CXN0cnNjcHlfcGFkKGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ29tcGFyZSB0d28gc3RyaW5ncyBhbmQgb25seSBjb25zaWRlciB0aGUgdHJpbW1lZCBzdWZmaXggaWYgczEgaXMgdG9vIGxvbmcgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19jbXBfc3RyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqdGVtcGxhdGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gc3RybmNtcChhbGxvY2luZm9fc3RyKHN0ciksIHRlbXBsYXRlLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBGZXRjaCB0aGUgcGVyLUNQVSBjb3VudGVycyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoc3RydWN0IGNvZGV0YWcgKmN0KQomIzQzO3sKJiM0MzsJcmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWUKJiM0MzsgKiBwcm9maWxpbmcgY291bnRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIGtlcm5lbCBjb2RldGFnLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LAomIzQzOwkJCQlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpkYXRhLAomIzQzOwkJCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzICpjb3VudGVycykKJiM0Mzt7CiYjNDM7CWlmIChjdC0mZ3Q7bW9kbmFtZSkKJiM0MzsJCWFsbG9jaW5mb19jb3B5X3N0cihkYXRhLSZndDt0YWcubW9kbmFtZSwgY3QtJmd0O21vZG5hbWUpOwomIzQzOwllbHNlCiYjNDM7CQlkYXRhLSZndDt0YWcubW9kbmFtZVswXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJYWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtJmd0O3RhZy5mdW5jdGlvbiwgY3QtJmd0O2Z1bmN0aW9uKTsKJiM0MzsJYWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtJmd0O3RhZy5maWxlbmFtZSwgY3QtJmd0O2ZpbGVuYW1lKTsKJiM0MzsJZGF0YS0mZ3Q7dGFnLmxpbmVubyA9IGN0LSZndDtsaW5lbm87CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuYnl0ZXMgPSBjb3VudGVycy0mZ3Q7Ynl0ZXM7CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuY2FsbHMgPSBjb3VudGVycy0mZ3Q7Y2FsbHM7CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuYWNjdXJhdGUgPSAhYWxsb2NfdGFnX2lzX2luYWNjdXJhdGUoY3RfdG9fYWxsb2NfdGFnKGN0KSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0cmlldmVzIHRoZSB1bmlxdWUgY29udGVudCBJRCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiB0YWcgbW9kdWxlCiYjNDM7ICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgcGFyYW1zOwomIzQzOwomIzQzOwljb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CXBhcmFtcy5pZCA9IGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CWNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwlpZiAoY29weV90b191c2VyKGFyZywgJmFtcDtwYXJhbXMsIHNpemVvZihwYXJhbXMpKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBWZXJpZmllcyB3aGV0aGVyIGEgZ2l2ZW4gY29kZXRhZyBzYXRpc2ZpZXMgdGhlIGFjdGl2ZSBmaWx0ZXJpbmcgY3JpdGVyaWEgYnkKJiM0MzsgKiBtYXRjaGluZyBpdHMgY2hhcmFjdGVyaXN0aWNzIGFnYWluc3QgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hlc19maWx0ZXIoc3RydWN0IGNvZGV0YWcgKmN0LCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyLAomIzQzOwkJCSAgIHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgKmNvdW50ZXJzLAomIzQzOwkJCSAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpCiYjNDM7ewomIzQzOwlib29sIGluYWNjdXJhdGU7CiYjNDM7CiYjNDM7CWlmICghZmlsdGVyIHx8ICFmaWx0ZXItJmd0O21hc2spCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTU9ETkFNRSkgewomIzQzOwkJLyogdXNlciB3YW50cyB0byBmaWx0ZXIgYnkgbW9kbmFtZSBidXQgY3QtJmd0O21vZG5hbWUgaXMgTlVMTCAqLwomIzQzOwkJaWYgKCFjdC0mZ3Q7bW9kbmFtZSkgewomIzQzOwkJCS8qIHZhbGlkYXRlIGlmIHVzZXIgd2FzIGF0dGVtcHRpbmcgdG8gZmlsdGVyIGZvciBidWlsdC1pbiBhbGxvY2F0aW9ucyAqLwomIzQzOwkJCWlmIChmaWx0ZXItJmd0O2ZpZWxkcy5tb2RuYW1lWzBdICE9ICYjMzk7XDAmIzM5OykKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfSBlbHNlIGlmIChhbGxvY2luZm9fY21wX3N0cihjdC0mZ3Q7bW9kbmFtZSwgZmlsdGVyLSZndDtmaWVsZHMubW9kbmFtZSkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTikgJmFtcDsmYW1wOwomIzQzOwkgICAgY3QtJmd0O2Z1bmN0aW9uICZhbXA7JmFtcDsgYWxsb2NpbmZvX2NtcF9zdHIoY3QtJmd0O2Z1bmN0aW9uLCBmaWx0ZXItJmd0O2ZpZWxkcy5mdW5jdGlvbikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgY3QtJmd0O2ZpbGVuYW1lICZhbXA7JmFtcDsgYWxsb2NpbmZvX2NtcF9zdHIoY3QtJmd0O2ZpbGVuYW1lLCBmaWx0ZXItJmd0O2ZpZWxkcy5maWxlbmFtZSkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8pICZhbXA7JmFtcDsKJiM0MzsJICAgIGN0LSZndDtsaW5lbm8gIT0gZmlsdGVyLSZndDtmaWVsZHMubGluZW5vKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19JTkFDQ1VSQVRFKSB7CiYjNDM7CQlpbmFjY3VyYXRlID0gISEoY3QtJmd0O2ZsYWdzICZhbXA7IENPREVUQUdfRkxBR19JTkFDQ1VSQVRFKTsKJiM0MzsJCWlmIChpbmFjY3VyYXRlICE9ICEhKGZpbHRlci0mZ3Q7ZmllbGRzLmluYWNjdXJhdGUpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7CiYjNDM7CQlpZiAoISpmZXRjaGVkX2NvdW50ZXJzKSB7CiYjNDM7CQkJKmNvdW50ZXJzID0gYWxsb2NpbmZvX3ByZWZldGNoX2NvdW50ZXJzKGN0KTsKJiM0MzsJCQkqZmV0Y2hlZF9jb3VudGVycyA9IHRydWU7CiYjNDM7CQl9CiYjNDM7CQlpZiAoKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudGVycy0mZ3Q7Ynl0ZXMgJmx0OyBmaWx0ZXItJmd0O21pbl9zaXplKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgJmFtcDsmYW1wOwomIzQzOwkJICAgIGNvdW50ZXJzLSZndDtieXRlcyAmZ3Q7IGZpbHRlci0mZ3Q7bWF4X3NpemUpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNlZWtzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgc3BlY2lmaWVkIDAtaW5kZXhlZCB0YWcgcG9zaXRpb24sIHJlYWRzIGl0cwomIzQzOyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2OwomIzQzOwlzdHJ1Y3QgY29kZXRhZyAqY3Q7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTsKJiM0MzsJX191NjQgc2tpcF9jb3VudDsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyczsKJiM0MzsJYm9vbCBmZXRjaGVkX2NvdW50ZXJzOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDtwYXJhbXMsIGFyZywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CWlmIChwYXJhbXMuZmlsdGVyLm1hc2sgJmFtcDsgfkFMTE9DSU5GT19GSUxURVJfTUFTS1MpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKChwYXJhbXMuZmlsdGVyLm1hc2sgJmFtcDsgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAocGFyYW1zLmZpbHRlci5tYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgcGFyYW1zLmZpbHRlci5taW5fc2l6ZSAmZ3Q7IHBhcmFtcy5maWx0ZXIubWF4X3NpemUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJcHJpdiA9IG0tJmd0O3ByaXZhdGU7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtwcml2LSZndDtpb2N0bF9sb2NrKTsKJiM0MzsJY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLnBvcyAmZ3Q7PSBjb2RldGFnX2dldF9jb3VudChhbGxvY190YWdfY3R0eXBlKSkgewomIzQzOwkJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDtpb2N0bF9sb2NrKTsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNraXBfY291bnQgPSBwYXJhbXMucG9zOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLmZpbHRlci5tYXNrKQomIzQzOwkJcHJpdi0mZ3Q7ZmlsdGVyID0gcGFyYW1zLmZpbHRlcjsKJiM0MzsJZWxzZQomIzQzOwkJcHJpdi0mZ3Q7ZmlsdGVyLm1hc2sgPSAwOwomIzQzOwomIzQzOwkvKiBGaW5kIHRoZSBjb2RldGFnICovCiYjNDM7CXByaXYtJmd0O2lvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwljdCA9IGNvZGV0YWdfbmV4dF9jdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2l0ZXIpOwomIzQzOwomIzQzOwl3aGlsZSAoY3QpIHsKJiM0MzsJCWZldGNoZWRfY291bnRlcnMgPSBmYWxzZTsKJiM0MzsJCWlmIChtYXRjaGVzX2ZpbHRlcihjdCwgJmFtcDtwcml2LSZndDtmaWx0ZXIsICZhbXA7Y291bnRlcnMsICZhbXA7ZmV0Y2hlZF9jb3VudGVycykpIHsKJiM0MzsJCQlpZiAoc2tpcF9jb3VudCA9PSAwKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCQlza2lwX2NvdW50LS07CiYjNDM7CQl9CiYjNDM7CQljdCA9IGNvZGV0YWdfbmV4dF9jdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2l0ZXIpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjdCkgewomIzQzOwkJaWYgKCFmZXRjaGVkX2NvdW50ZXJzKQomIzQzOwkJCWNvdW50ZXJzID0gYWxsb2NpbmZvX3ByZWZldGNoX2NvdW50ZXJzKGN0KTsKJiM0MzsJCWFsbG9jaW5mb190b19wYXJhbXMoY3QsICZhbXA7cGFyYW1zLmRhdGEsICZhbXA7Y291bnRlcnMpOwomIzQzOwkJcHJpdi0mZ3Q7cG9zaXRpb25lZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIWN0KQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO3BhcmFtcywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFkdmFuY2VzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIHRhZyBpbiB0aGUgc2VxdWVuY2UgYW5kCiYjNDM7ICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdjsKJiM0MzsJc3RydWN0IGNvZGV0YWcgKmN0OwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtczsKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CXN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcnM7CiYjNDM7CWJvb2wgZmV0Y2hlZF9jb3VudGVyczsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7cGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CiYjNDM7CXByaXYgPSBtLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7cHJpdi0mZ3Q7aW9jdGxfbG9jayk7CiYjNDM7CWNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTsKJiM0MzsKJiM0MzsJaWYgKCFwcml2LSZndDtwb3NpdGlvbmVkKSB7CiYjNDM7CQlwcml2LSZndDtpb2N0bF9pdGVyID0gY29kZXRhZ19nZXRfY3RfaXRlcihhbGxvY190YWdfY3R0eXBlKTsKJiM0MzsJCXByaXYtJmd0O3Bvc2l0aW9uZWQgPSB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWN0ID0gY29kZXRhZ19uZXh0X2N0KCZhbXA7cHJpdi0mZ3Q7aW9jdGxfaXRlcik7CiYjNDM7CXdoaWxlIChjdCkgewomIzQzOwkJZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlOwomIzQzOwkJaWYgKG1hdGNoZXNfZmlsdGVyKGN0LCAmYW1wO3ByaXYtJmd0O2ZpbHRlciwgJmFtcDtjb3VudGVycywgJmFtcDtmZXRjaGVkX2NvdW50ZXJzKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWN0ID0gY29kZXRhZ19uZXh0X2N0KCZhbXA7cHJpdi0mZ3Q7aW9jdGxfaXRlcik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN0KSB7CiYjNDM7CQlpZiAoIWZldGNoZWRfY291bnRlcnMpCiYjNDM7CQkJY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpOwomIzQzOwkJYWxsb2NpbmZvX3RvX3BhcmFtcyhjdCwgJmFtcDtwYXJhbXMsICZhbXA7Y291bnRlcnMpOwomIzQzOwl9CiYjNDM7CWlmICghY3QpIHsKJiM0MzsJCXByaXYtJmd0O3Bvc2l0aW9uZWQgPSBmYWxzZTsKJiM0MzsJCXJldCA9IC1FTk9FTlQ7CiYjNDM7CX0KJiM0MzsJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwomIzQzOwlpZiAocmV0ID09IDApIHsKJiM0MzsJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO3BhcmFtcywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJCXJldHVybiAtRUZBVUxUOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZQomIzQzOyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiYjNDM7CQkJICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpCiYjNDM7ewomIzQzOwl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopX19hcmc7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtJmd0O3ByaXZhdGVfZGF0YSwgYXJnKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIEFMTE9DSU5GT19JT0NfR0VUX0FUOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9hdChmaWxlLSZndDtwcml2YXRlX2RhdGEsIGFyZyk7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtJmd0O3ByaXZhdGVfZGF0YSwgYXJnKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0ID0gLUVOT0lPQ1RMQ01EOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19DT01QQVQKJiM0MztzdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOwomIzQzO30KJiM0MzsjZW5kaWYKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHsKJiM0MzsJLnByb2Nfb3BlbgkJPSBhbGxvY2luZm9fb3BlbiwKJiM0MzsJLnByb2NfcmVhZF9pdGVyCQk9IHNlcV9yZWFkX2l0ZXIsCiYjNDM7CS5wcm9jX2xzZWVrCQk9IHNlcV9sc2VlaywKJiM0MzsJLnByb2NfcmVsZWFzZQkJPSBhbGxvY2luZm9fcmVsZWFzZSwKJiM0MzsJLnByb2NfaW9jdGwJCT0gYWxsb2NpbmZvX2lvY3RsLAomIzQzOyNpZmRlZiBDT05GSUdfQ09NUEFUCiYjNDM7CS5wcm9jX2NvbXBhdF9pb2N0bAk9IGFsbG9jaW5mb19jb21wYXRfaW9jdGwsCiYjNDM7I2VuZGlmCiYjNDM7fTsKJiM0MzsKIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKQogewogCXN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7CkBAIC05ODQsOCAmIzQzOzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKQogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXByb2NfY3JlYXRlX3NlcV9wcml2YXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsICZhbXA7YWxsb2NpbmZvX3NlcV9vcCwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpLCBOVUxMKSkgewomIzQzOwlpZiAoIXByb2NfY3JlYXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsICZhbXA7YWxsb2NpbmZvX3Byb2Nfb3BzKSkgewogCQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcbiYjMzQ7LCBBTExPQ0lORk9fRklMRV9OQU1FKTsKIAkJc2h1dGRvd25fbWVtX3Byb2ZpbGluZyhmYWxzZSk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQppbmRleCA4ZDRkYjIyNDFjYzJhMi4uMTI5NDFkNjhhN2Y4YWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCkBAIC0xLDUgJiM0MzsxLDYgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKIFRBUkdFVFMgJiM0Mzs9IGFjY3QKJiM0MztUQVJHRVRTICYjNDM7PSBhbGxvY190YWcKIFRBUkdFVFMgJiM0Mzs9IGFsc2EKIFRBUkdFVFMgJiM0Mzs9IGFtZC1wc3RhdGUKIFRBUkdFVFMgJiM0Mzs9IGFybTY0CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY0MWQ5MmQwNmIxODQ4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDkgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gYWxsb2NpbmZvX2lvY3RsX3Rlc3QKJiM0MzsKJiM0MztDRkxBR1MgJiM0Mzs9IC1XYWxsCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKJiM0MzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdkOTRhYmI3ODVhMTQ4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMKQEAgLTAsMCAmIzQzOzEsNTQ4IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOwomIzQzOy8qIGtzZWxmdGVzdCBmb3IgYWxsb2NpbmZvIGlvY3RsCiYjNDM7ICogYWxsb2NpbmZvIGlvY3RsIHJldHJpdmVzIGFsbG9jaW5mbyBkYXRhIHRocm91Z2ggaW9jdGwKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FsbG9jX3RhZy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTUFYX0xJTkVfTEVOCQk1MTIKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19QUk9DCQkmIzM0Oy9wcm9jL2FsbG9jaW5mbyYjMzQ7CiYjNDM7CiYjNDM7ZW51bSBpb2N0bF9yZXQgewomIzQzOwlJT0NUTF9TVUNDRVNTID0gMCwKJiM0MzsJSU9DVExfRkFJTFVSRSA9IDEsCiYjNDM7CUlPQ1RMX0lOVkFMSURfREFUQSA9IDIsCiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIFZFQ19NQVhfRU5UUklFUyAzMgomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjIHsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB0YWdbVkVDX01BWF9FTlRSSUVTXTsKJiM0MzsJX191NjQgY291bnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcykKJiM0Mzt7CiYjNDM7CXJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X2F0KGludCBkZXZfZmQsIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0ICpwYXJhbXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0dFVF9BVCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X25leHQoaW50IGRldl9mZCwgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcGFyYW1zKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LAomIzQzOwkJCWNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKnRhZ19kYXRhLAomIzQzOwkJCWJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLAomIzQzOwkJCWJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpZiAobWF0Y2hfYnl0ZXMgJmFtcDsmYW1wOyB0YWdfZGF0YS0mZ3Q7Y291bnRlci5ieXRlcyAhPSBwcm9jZnNfZW50cnktJmd0O2NvdW50ZXIuYnl0ZXMpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7c2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfY2FsbHMgJmFtcDsmYW1wOyB0YWdfZGF0YS0mZ3Q7Y291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktJmd0O2NvdW50ZXIuY2FsbHMpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Y2FsbCBjb3VudCByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfbGluZW5vICZhbXA7JmFtcDsgdGFnX2RhdGEtJmd0O3RhZy5saW5lbm8gIT0gcHJvY2ZzX2VudHJ5LSZndDt0YWcubGluZW5vKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O2xpbmVubyByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfZnVuY3Rpb24gJmFtcDsmYW1wOwomIzQzOwkgICAgc3RybmNtcCh0YWdfZGF0YS0mZ3Q7dGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktJmd0O3RhZy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfZmlsZW5hbWUgJmFtcDsmYW1wOwomIzQzOwkgICAgc3RybmNtcCh0YWdfZGF0YS0mZ3Q7dGFnLmZpbGVuYW1lLCBwcm9jZnNfZW50cnktJmd0O3RhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtmaWxlbmFtZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cmllcyhjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncywKJiM0MzsJCQkgIGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLAomIzQzOwkJCSAgYm9vbCBtYXRjaF9mdW5jdGlvbiwgYm9vbCBtYXRjaF9maWxlbmFtZSkKJiM0Mzt7CiYjNDM7CV9fdTY0IGk7CiYjNDM7CiYjNDM7CWlmIChwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgIT0gdGFncy0mZ3Q7Y291bnQpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RW50cnkgY291bnQgbWlzbWF0Y2guIGlvY3RsIGVudHJpZXM6ICVsbHUsIHByb2MgZW50cmllczogJWxsdVxuJiMzNDssCiYjNDM7CQkJICAgICAgIHRhZ3MtJmd0O2NvdW50LCBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIW1hdGNoX2VudHJ5KCZhbXA7cHJvY2ZzX2VudHJpZXMtJmd0O3RhZ1tpXSwgJmFtcDt0YWdzLSZndDt0YWdbaV0sCiYjNDM7CQkJCSBtYXRjaF9ieXRlcywgbWF0Y2hfY2FsbHMsIG1hdGNoX2xpbmVubywKJiM0MzsJCQkJIG1hdGNoX2Z1bmN0aW9uLCBtYXRjaF9maWxlbmFtZSkpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0OyVsbHV0aCBlbnRyeSBkb2VzIG5vdCBtYXRjaC5cbiYjMzQ7LCBpKTsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cikKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKJiM0MzsKJiM0MzsJaWYgKGxlbiAmZ3Q7PSBBTExPQ0lORk9fU1RSX1NJWkUpCiYjNDM7CQlzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7CiYjNDM7CXJldHVybiBzdHI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCiYjNDM7ewomIzQzOwlzdHJuY3B5KGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFIC0gMSk7CiYjNDM7CWRlc3RbQUxMT0NJTkZPX1NUUl9TSVpFIC0gMV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcywKJiM0MzsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKEFMTE9DSU5GT19QUk9DLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWNoYXIgbGluZVtNQVhfTElORV9MRU5dOwomIzQzOwlpbnQgbWF0Y2hlczsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBwcm9jZnNfZW50cnk7CiYjNDM7CiYjNDM7CWlmICghZnApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDsgZm9yIHJlYWRpbmdcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAxOwomIzQzOwl9CiYjNDM7CW1lbXNldChwcm9jZnNfZW50cmllcywgMCwgc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgJmFtcDsmYW1wOyBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgJmx0OyBWRUNfTUFYX0VOVFJJRVMpIHsKJiM0MzsJCWNoYXIgZmlsZW5hbWVbTUFYX0xJTkVfTEVOXTsKJiM0MzsJCWNoYXIgZnVuY3Rpb25bTUFYX0xJTkVfTEVOXTsKJiM0MzsKJiM0MzsJCW1lbXNldCgmYW1wO3Byb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpOwomIzQzOwkJbWF0Y2hlcyA9IHNzY2FuZihsaW5lLCAmIzM0OyVsbHUgJWxsdSAlW146XTolbGx1IGZ1bmM6JXMmIzM0OywKJiM0MzsJCQkJICZhbXA7cHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMsCiYjNDM7CQkJCSAmYW1wO3Byb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLAomIzQzOwkJCQkgZmlsZW5hbWUsCiYjNDM7CQkJCSAmYW1wO3Byb2Nmc19lbnRyeS50YWcubGluZW5vLAomIzQzOwkJCQkgZnVuY3Rpb24pOwomIzQzOwomIzQzOwkJaWYgKG1hdGNoZXMgIT0gNSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCWFsbG9jaW5mb19jb3B5X3N0cihwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLCBmaWxlbmFtZSk7CiYjNDM7CQlhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbiwgZnVuY3Rpb24pOwomIzQzOwomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIHsKJiM0MzsJCQlpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLAomIzQzOwkJCQkgICAgZmlsdGVyLSZndDtmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHsKJiM0MzsJCQlpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZ1bmN0aW9uLAomIzQzOwkJCQkgICAgZmlsdGVyLSZndDtmaWVsZHMuZnVuY3Rpb24sIEFMTE9DSU5GT19TVFJfU0laRSkpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PKSB7CiYjNDM7CQkJaWYgKHByb2Nmc19lbnRyeS50YWcubGluZW5vICE9IGZpbHRlci0mZ3Q7ZmllbGRzLmxpbmVubykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQl9CiYjNDM7CQlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgewomIzQzOwkJCWlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyAmbHQ7IGZpbHRlci0mZ3Q7bWluX3NpemUpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIHsKJiM0MzsJCQlpZiAocHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMgJmd0OyBmaWx0ZXItJmd0O21heF9zaXplKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCW1lbWNweSgmYW1wO3Byb2Nmc19lbnRyaWVzLSZndDt0YWdbcHJvY2ZzX2VudHJpZXMtJmd0O2NvdW50JiM0MzsmIzQzO10sICZhbXA7cHJvY2ZzX2VudHJ5LAomIzQzOwkJICAgICAgIHNpemVvZihwcm9jZnNfZW50cnkpKTsKJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGVudW0gaW9jdGxfcmV0IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLAomIzQzOwkJCQkJCSBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyLAomIzQzOwkJCQkJCSBfX3U2NCBzdGFydF9wb3MpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDsgZm9yIElPQ1RMXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gSU9DVExfRkFJTFVSRTsKJiM0MzsJfQomIzQzOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IGdldF9hdF9wYXJhbXM7CiYjNDM7CWNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwOwomIzQzOwlpbnQgcmV0cnlfY291bnQgPSAwOwomIzQzOwlpbnQgc3RhdHVzOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgaWYgYSBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWQKJiM0MzsJICogYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiBJZiB0aGF0IGhhcHBlbnMsIHRoZSBkYXRhIGdhdGhlcmVkIGNhbm5vdCBiZSBjb25zaWRlcmVkIGNvbnNpc3RlbnQKJiM0MzsJICogYW5kIGhlbmNlIG5lZWRzIHRvIGJlIGZldGNoZWQgYWdhaW4gdG8gYXZvaWQgZmxha2luZXNzLgomIzQzOwkgKi8KJiM0MzsJZG8gewomIzQzOwkJaWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCAmYW1wO3N0YXJ0X2NvbnRfaWQpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfRkFJTFVSRTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCW1lbXNldCh0YWdzLCAwLCBzaXplb2YoKnRhZ3MpKTsKJiM0MzsJCW1lbXNldCgmYW1wO2dldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7CiYjNDM7CQltZW1jcHkoJmFtcDtnZXRfYXRfcGFyYW1zLmZpbHRlciwgZmlsdGVyLCBzaXplb2YoKmZpbHRlcikpOwomIzQzOwkJZ2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7CiYjNDM7CQlpZiAoX19hbGxvY2luZm9fZ2V0X2F0KGZkLCAmYW1wO2dldF9hdF9wYXJhbXMpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQltZW1jcHkoJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnQmIzQzOyYjNDM7XSwgJmFtcDtnZXRfYXRfcGFyYW1zLmRhdGEsIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTsKJiM0MzsKJiM0MzsJCXdoaWxlICh0YWdzLSZndDtjb3VudCAmbHQ7IFZFQ19NQVhfRU5UUklFUyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgX19hbGxvY2luZm9fZ2V0X25leHQoZmQsICZhbXA7dGFncy0mZ3Q7dGFnW3RhZ3MtJmd0O2NvdW50XSkgPT0gMCkKJiM0MzsJCQl0YWdzLSZndDtjb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQlpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsICZhbXA7ZW5kX2NvbnRfaWQpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfRkFJTFVSRTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkKSB7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfU1VDQ0VTUzsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWlzbWF0Y2gsIHJldHJ5aW5nLi4uXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfSU5WQUxJRF9EQVRBOwomIzQzOwkJfQomIzQzOwl9IHdoaWxlIChzdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBICZhbXA7JmFtcDsgcmV0cnlfY291bnQmIzQzOyYjNDM7ICZsdDsgbWF4X3JldHJpZXMpOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBzdGF0dXM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTsKJiM0MzsJaW50IGlvY3RsX3N0YXR1czsKJiM0MzsJaW50IHJldCA9IEtTRlRfUEFTUzsKJiM0MzsKJiM0MzsJaWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgZmlsdGVyKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSAmIzM0OyBBTExPQ0lORk9fUFJPQyAmIzM0O1xuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgPT0gMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBlbnRyaWVzIGZvdW5kIGluICYjMzQ7IEFMTE9DSU5GT19QUk9DICYjMzQ7LCBza2lwcGluZyB0ZXN0XG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX1NLSVA7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgZmlsdGVyLCAwKTsKJiM0MzsJaWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFtYXRjaF9lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCB0YWdzLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUpKQomIzQzOwkJcmV0ID0gS1NGVF9GQUlMOwomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWZyZWUodGFncyk7CiYjNDM7CWZyZWUocHJvY2ZzX2VudHJpZXMpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRlc3RfZmlsZW5hbWVfZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9ICYjMzQ7bW0vbWVtb3J5LmMmIzM0OzsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7CiYjNDM7CWZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRTsKJiM0MzsJc3RybmNweShmaWx0ZXIuZmllbGRzLmZpbGVuYW1lLCB0YXJnZXRfZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSk7CiYjNDM7CiYjNDM7CXJldHVybiBydW5fZmlsdGVyX3Rlc3QoJmFtcDtmaWx0ZXIpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRlc3RfZnVuY3Rpb25fZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9ICYjMzQ7ZHVwX21tJiMzNDs7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2ZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwlmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047CiYjNDM7CXN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gcnVuX2ZpbHRlcl90ZXN0KCZhbXA7ZmlsdGVyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0ZXN0X3NpemVfZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWludCByZXQgPSBLU0ZUX1BBU1M7CiYjNDM7CV9fdTY0IHRhcmdldF9zaXplLCBpLCBwb3M7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9ICYjMzQ7ZG9faW5pdF9tb2R1bGUmIzM0OzsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkOwomIzQzOwlpbnQgcmV0cnkgPSAwOwomIzQzOwljb25zdCBpbnQgbWF4X3JldHJpZXMgPSAxMDsKJiM0MzsKJiM0MzsJaWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGZyZWVtZW07CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDs6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCWdvdG8gZnJlZW1lbTsKJiM0MzsJfQomIzQzOwomIzQzOwlkbyB7CiYjNDM7CQlmb3VuZF90YWcgPSBOVUxMOwomIzQzOwkJcG9zID0gMDsKJiM0MzsKJiM0MzsJCWlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgJmFtcDtzdGFydF9jb250X2lkKSkgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQltZW1zZXQoJmFtcDtmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKJiM0MzsJCWZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjsKJiM0MzsJCXN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzOwomIzQzOwkJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgJmFtcDtmaWx0ZXIpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSAmIzM0OyBBTExPQ0lORk9fUFJPQyAmIzM0O1xuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocHJvY2ZzX2VudHJpZXMtJmd0O2NvdW50ID09IDApIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O0Z1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcbiYjMzQ7LCB0YXJnZXRfZnVuY3Rpb24pOwomIzQzOwkJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0YXJnZXRfc2l6ZSA9IHByb2Nmc19lbnRyaWVzLSZndDt0YWdbMF0uY291bnRlci5ieXRlczsKJiM0MzsKJiM0MzsJCW1lbXNldCgmYW1wO2ZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwkJZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFIHwgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFOwomIzQzOwkJZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7CiYjNDM7CQlmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTsKJiM0MzsKJiM0MzsJCXdoaWxlICgxKSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtczsKJiM0MzsKJiM0MzsJCQltZW1zZXQoJmFtcDtnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpOwomIzQzOwkJCW1lbWNweSgmYW1wO2dldF9hdF9wYXJhbXMuZmlsdGVyLCAmYW1wO2ZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwkJCWdldF9hdF9wYXJhbXMucG9zID0gcG9zOwomIzQzOwomIzQzOwkJCWlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsICZhbXA7Z2V0X2F0X3BhcmFtcykpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwomIzQzOwkJCXRhZ3MtJmd0O2NvdW50ID0gMDsKJiM0MzsJCQltZW1jcHkoJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnQmIzQzOyYjNDM7XSwgJmFtcDtnZXRfYXRfcGFyYW1zLmRhdGEsCiYjNDM7CQkJICAgICAgIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTsKJiM0MzsKJiM0MzsJCQl3aGlsZSAodGFncy0mZ3Q7Y291bnQgJmx0OyBWRUNfTUFYX0VOVFJJRVMgJmFtcDsmYW1wOwomIzQzOwkJCSAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnRdKSA9PSAwKQomIzQzOwkJCQl0YWdzLSZndDtjb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkJZm9yIChpID0gMDsgaSAmbHQ7IHRhZ3MtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQlpZiAoc3RyY21wKHRhZ3MtJmd0O3RhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkgewomIzQzOwkJCQkJZm91bmRfdGFnID0gJmFtcDt0YWdzLSZndDt0YWdbaV07CiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQkJfQomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlpZiAoZm91bmRfdGFnIHx8IHRhZ3MtJmd0O2NvdW50ICZsdDsgVkVDX01BWF9FTlRSSUVTKQomIzQzOwkJCQlicmVhazsKJiM0MzsKJiM0MzsJCQlwb3MgJiM0Mzs9IHRhZ3MtJmd0O2NvdW50OwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCAmYW1wO2VuZF9jb250X2lkKSkgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZCkKJiM0MzsJCQlicmVhazsKJiM0MzsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7TW9kdWxlIGxvYWQgZGV0ZWN0ZWQgZHVyaW5nIHNpemUgdmVyaWZpY2F0aW9uLCByZXRyeWluZy4uLlxuJiMzNDspOwomIzQzOwl9IHdoaWxlIChyZXRyeSYjNDM7JiM0MzsgJmx0OyBtYXhfcmV0cmllcyk7CiYjNDM7CiYjNDM7CWlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkICZhbXA7JmFtcDsgIWZvdW5kX3RhZykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXG4mIzM0OywKJiM0MzsJCQkgICAgICAgdGFyZ2V0X2Z1bmN0aW9uKTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfSBlbHNlIGlmIChzdGFydF9jb250X2lkLmlkICE9IGVuZF9jb250X2lkLmlkKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0ZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJfSBlbHNlIGlmIChmb3VuZF90YWcgJmFtcDsmYW1wOyBmb3VuZF90YWctJmd0O2NvdW50ZXIuYnl0ZXMgIT0gdGFyZ2V0X3NpemUpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7SU9DVEwgZW50cnkgc2l6ZSAlbGx1IGRvZXMgbm90IG1hdGNoIHRhcmdldCBzaXplICVsbHVcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBmb3VuZF90YWctJmd0O2NvdW50ZXIuYnl0ZXMsIHRhcmdldF9zaXplKTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfQomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztmcmVlbWVtOgomIzQzOwlmcmVlKHRhZ3MpOwomIzQzOwlmcmVlKHByb2Nmc19lbnRyaWVzKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0ZXN0X2xpbmVub19maWx0ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1czsKJiM0MzsJaW50IHJldCA9IEtTRlRfUEFTUzsKJiM0MzsJX191NjQgdGFyZ2V0X2xpbmVubywgaTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZzsKJiM0MzsJYm9vbCBmb3VuZCA9IGZhbHNlOwomIzQzOwomIzQzOwlpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCWdvdG8gZXhpdDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1zZXQoJmFtcDtmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKJiM0MzsKJiM0MzsJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgJmFtcDtmaWx0ZXIpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0Vycm9yIHJldHJpZXZpbmcgZW50cmllcyBmcm9tICYjMzQ7IEFMTE9DSU5GT19QUk9DICYjMzQ7XG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX1NLSVA7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsJaWYgKHByb2Nmc19lbnRyaWVzLSZndDtjb3VudCA9PSAwKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0NvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGRlcGVuZCBvbiB0aGUgcHJvY2ZzIHJlc3VsdHMgdG8gZGV0ZXJtaW5lIHRoZSBsaW5lIG51bWJlciBmb3IgdGhlIGZpbHRlciBiZWZvcmUKJiM0MzsJICogbWFraW5nIHRoZSBpb2N0bCBxdWVyeS4gSGVuY2UsIHdlIGNhbm5vdCByZXVzZSBydW5fZmlsdGVyX3Rlc3QgaGVyZS4KJiM0MzsJICovCiYjNDM7CXRhcmdldF90YWcgPSAmYW1wO3Byb2Nmc19lbnRyaWVzLSZndDt0YWdbMF07CiYjNDM7CXRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLSZndDt0YWcubGluZW5vOwomIzQzOwomIzQzOwlmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5POwomIzQzOwlmaWx0ZXIuZmllbGRzLmxpbmVubyA9IHRhcmdldF9saW5lbm87CiYjNDM7CiYjNDM7CWlvY3RsX3N0YXR1cyA9IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHRhZ3MsICZhbXA7ZmlsdGVyLCAwKTsKJiM0MzsJaWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHRhZ3MtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRhZ3MtJmd0O3RhZ1tpXS50YWcubGluZW5vICE9IHRhcmdldF9saW5lbm8pIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O0lPQ1RMIGVudHJ5ICVsbHUgaGFzIGluY29ycmVjdCBsaW5lbm8gJWxsdS5cbiYjMzQ7LAomIzQzOwkJCQkgICAgICAgaSwgdGFncy0mZ3Q7dGFnW2ldLnRhZy5saW5lbm8pOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoc3RybmNtcCh0YWdzLSZndDt0YWdbaV0udGFnLmZ1bmN0aW9uLCB0YXJnZXRfdGFnLSZndDt0YWcuZnVuY3Rpb24sCiYjNDM7CQkJICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RybmNtcCh0YWdzLSZndDt0YWdbaV0udGFnLmZpbGVuYW1lLCB0YXJnZXRfdGFnLSZndDt0YWcuZmlsZW5hbWUsCiYjNDM7CQkJICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCkKJiM0MzsJCQlmb3VuZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtPcmlnaW5hbCBwcm9jZnMgZW50cnkgbm90IGZvdW5kIGluIElPQ1RMIGxpbmVubyBmaWx0ZXIgcmVzdWx0cy5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfQomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWZyZWUodGFncyk7CiYjNDM7CWZyZWUocHJvY2ZzX2VudHJpZXMpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbig0KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9maWxlbmFtZV9maWx0ZXIoKTsKJiM0MzsJaWYgKHJldCA9PSBLU0ZUX1NLSVApCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDtTa2lwcGluZyB0ZXN0X2ZpbGVuYW1lX2ZpbHRlclxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsICYjMzQ7dGVzdF9maWxlbmFtZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9mdW5jdGlvbl9maWx0ZXIoKTsKJiM0MzsJaWYgKHJldCA9PSBLU0ZUX1NLSVApCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDtTa2lwcGluZyB0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsICYjMzQ7dGVzdF9mdW5jdGlvbl9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9zaXplX2ZpbHRlcigpOwomIzQzOwlpZiAocmV0ID09IEtTRlRfU0tJUCkKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0O1NraXBwaW5nIHRlc3Rfc2l6ZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCAmIzM0O3Rlc3Rfc2l6ZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9saW5lbm9fZmlsdGVyKCk7CiYjNDM7CWlmIChyZXQgPT0gS1NGVF9TS0lQKQomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7U2tpcHBpbmcgdGVzdF9saW5lbm9fZmlsdGVyXG4mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgJiMzNDt0ZXN0X2xpbmVub19maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxMzUKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAyNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTmV3IEFsbG9jYXRpb24gUHJvZmlsaW5nIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgbmV3IGBpb2N0bGAgaW50ZXJmYWNlIGZvciBgL3Byb2MvYWxsb2NpbmZvYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgc2VlIGEgZ29vZCByYW5nZSBvZiBmaWxlcyB0b3VjaGVkLCB3aGljaCBpcyB3aGF0IEkmIzM5O2QgZXhwZWN0IGZvciB0aGlzIGtpbmQgb2YgZmVhdHVyZS4gV2UgaGF2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMsIHdoaWNoIGlzIGNydWNpYWwsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIHVzZXJzcGFjZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBuZXcgYGlvY3RsYCBpbiBib3RoIHRoZSBgbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0YCBhbmQgYHVzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdGAgZmlsZXMuIFRoZSBgTUFJTlRBSU5FUlNgIGNoYW5nZSBpcyBhbHNvIGV4cGVjdGVkIHRvIGVuc3VyZSB0aGUgcmlnaHQgcGVvcGxlIGFyZSBpbiB0aGUgbG9vcC4gVGhlIGhlYWRlciBmaWxlcyBsaWtlIGBpbmNsdWRlL2xpbnV4L2NvZGV0YWcuaGAgYW5kIGBpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhgIHRlbGwgbWUgdGhleSYjMzk7cmUgc2V0dGluZyB1cCB0aGUgbG93LWxldmVsIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcywgYW5kIHRoZSBjb3JlIGltcGxlbWVudGF0aW9uIGlzIGxpa2VseSBpbiBgbGliL2NvZGV0YWcuY2AgYW5kIGBtbS9hbGxvY190YWcuY2AuIFRoZSBpbmNsdXNpb24gb2YgYSBzZWxmdGVzdCBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2AgaXMgYSBodWdlIHBsdXM7IGFsd2F5cyBnb29kIHRvIGhhdmUgc29tZSBzb2xpZCB2YWxpZGF0aW9uLgoKTm93LCB0aGUgbWVhdCBvZiBpdCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB3ZSYjMzk7cmUgYWRkaW5nIHRoaXMgYGFsbG9jaW5mb19pb2N0bGAgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBoYW5kbGluZyB0aGUgYEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRGAsIGBBTExPQ0lORk9fSU9DX0dFVF9BVGAsIGFuZCBgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVGAgaW9jdGwgY29tbWFuZHMuIFNvIHRoaXMgaXMgaG93IHVzZXJzcGFjZSB3aWxsIGFjdHVhbGx5IGludGVyYWN0IHdpdGggdGhlIG5ldyBgL3Byb2MvYWxsb2NpbmZvYCBpbnRlcmZhY2UuCgpHaXZlbiB0aGlzLCBJIHNob3VsZCBjb25maXJtIHRoZSBDT05GSUcgb3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhpcy4gSSBzZWUgdGhhdCB0aGUgY29yZSBmaWxlLCBgbW0vYWxsb2NfdGFnLmNgLCBpcyBvbmx5IGNvbXBpbGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBrZWVwcyB0aGluZ3MgbW9kdWxhciBhbmQgYXZvaWRzIHVubmVjZXNzYXJ5IGNvZGUgYmxvYXQgaW4gYSBwcm9kdWN0aW9uIGtlcm5lbC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgdGhlIEtjb25maWcgZmlsZXMgYWN0dWFsbHkgc3RhdGUuIEkmIzM5O2xsIGFsc28gY2hlY2sgb3RoZXIgZGVwZW5kZW5jaWVzLCBidXQgdGhpcyBzZWVtcyBsaWtlIGEgc29saWQgaW5pdGlhbCBhcHByb2FjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY190YWcubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT0xNDk9b2JqLSQoQ09ORklHX0xBWllfTU1VX01PREVfS1VOSVRfVEVTVCkgJiM0Mzs9IHRlc3RzL2xhenlfbW11X21vZGVfa3VuaXQub1xubW0vTWFrZWZpbGU6MTUwOm9iai0kKENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HKSAmIzQzOz0gYWxsb2NfdGFnLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkxNwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgIGlzIGRlZmluaXRlbHkgYSBrZXkgcmVxdWlyZW1lbnQgaGVyZS4gTm93LCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgYnJvYWRlciBsb29rIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWd1cmF0aW9ucyB0aGF0IG5lZWQgbXkgYXR0ZW50aW9uLiBMZXQmIzM5O3Mgc2VlLi4uIEkgc2VlIHRoZSBpb2N0bCBpcyBwbHVtYmVkIGludG8gYC9wcm9jL2FsbG9jaW5mb2AuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBpbnRyb3NwZWN0aW9uLiBCdXQsIHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIGBtbS9hbGxvY190YWcuY2AgcmlnaHQgYXdheS4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gd2hldGhlciB0aGVyZSBhcmUgYW55IG90aGVyIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgKGAjaWZkZWZgcykgaW4gdGhhdCBmaWxlIHRoYXQgcmVsYXRlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBvciB0YWdnaW5nLiBUaGF0IHdpbGwgcHJvYmFibHkgYmUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bGwgcGljdHVyZSBvZiB0aGUgZmVhdHVyZSYjMzk7cyBkZXBlbmRlbmNpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmM9MjE0PXN0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuLS1cbm1tL2FsbG9jX3RhZy5jLTIzMy0gKi9cbm1tL2FsbG9jX3RhZy5jOjIzNDpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0yMzUte1xuLS1cbm1tL2FsbG9jX3RhZy5jPTI1MT1zdGF0aWMgYm9vbCBtYXRjaGVzX2ZpbHRlcihzdHJ1Y3QgY29kZXRhZyAqY3QsIHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXG4tLVxubW0vYWxsb2NfdGFnLmMtMzA3LSAqL1xubW0vYWxsb2NfdGFnLmM6MzA4OnN0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0zMDkte1xuLS1cbm1tL2FsbG9jX3RhZy5jLTM4Mi0gKi9cbm1tL2FsbG9jX3RhZy5jOjM4MzpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0zODQte1xuLS1cbm1tL2FsbG9jX3RhZy5jLTQzMy0gKi9cbm1tL2FsbG9jX3RhZy5jOjQzNDpzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9hbGxvY190YWcuYy00MzUtXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4tLVxubW0vYWxsb2NfdGFnLmMtNDQxLVx0Y2FzZSBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQ6XG5tbS9hbGxvY190YWcuYzo0NDI6XHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcbm1tL2FsbG9jX3RhZy5jLTQ0My1cdFx0YnJlYWs7XG5tbS9hbGxvY190YWcuYy00NDQtXHRjYXNlIEFMTE9DSU5GT19JT0NfR0VUX0FUOlxubW0vYWxsb2NfdGFnLmM6NDQ1Olx0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xubW0vYWxsb2NfdGFnLmMtNDQ2LVx0XHRicmVhaztcbm1tL2FsbG9jX3RhZy5jLTQ0Ny1cdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVDpcbm1tL2FsbG9jX3RhZy5jOjQ0ODpcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xubW0vYWxsb2NfdGFnLmMtNDQ5LVx0XHRicmVhaztcbi0tXG5tbS9hbGxvY190YWcuYz00NTk9c3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9hbGxvY190YWcuYy00NjEte1xubW0vYWxsb2NfdGFnLmM6NDYyOlx0cmV0dXJuIGFsbG9jaW5mb19pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7XG5tbS9hbGxvY190YWcuYy00NjMtfVxuLS1cbm1tL2FsbG9jX3RhZy5jPTQ2Nj1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcbi0tXG5tbS9hbGxvY190YWcuYy00NzAtXHQucHJvY19yZWxlYXNlXHRcdD0gYWxsb2NpbmZvX3JlbGVhc2UsXG5tbS9hbGxvY190YWcuYzo0NzE6XHQucHJvY19pb2N0bFx0XHQ9IGFsbG9jaW5mb19pb2N0bCxcbm1tL2FsbG9jX3RhZy5jLTQ3Mi0jaWZkZWYgQ09ORklHX0NPTVBBVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2OTUxCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQWxsb2NhdGlvbiBQcm9maWxpbmcgSW9jdGwgSW50ZXJmYWNlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGV5ZSBnb2VzIHRvIHRoZSBjb3JlOiB0aGVzZSBgaW9jdGxgIGZ1bmN0aW9ucywgYGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZGAsIGBhbGxvY2luZm9faW9jdGxfZ2V0X2F0YCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dGAsIGBhbGxvY2luZm9faW9jdGxgLCBhbmQgYGFsbG9jaW5mb19jb21wYXRfaW9jdGxgLiBUaGV5JiMzOTtyZSBjbGVhcmx5IHRoZSBlbnRyeSBwb2ludHMgZm9yIHRoZSBuZXcgYWxsb2NhdGlvbiBwcm9maWxpbmcgZnVuY3Rpb25hbGl0eSwgYW5kIHRoZSBgL3Byb2MvYWxsb2NpbmZvYCBub2RlIGNvbmZpcm1zIHRoaXMgaXMgYSBsaXZlIGFuZCBmdW5jdGlvbmluZyBpbnRlcmZhY2UuCgpUaGlzIGlzICpwZXJmZWN0KiBmdXp6aW5nIG1hdGVyaWFsLiBJdCYjMzk7cyBhbiBvYnZpb3VzIHRhcmdldC4gQnV0IGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byBmdXp6aW5nIHN0cmF0ZWd5LCBJIHNob3VsZCBtYWtlIHN1cmUgbXkgZW52aXJvbm1lbnQgaXMgcHJvcGVybHkgc2V0IHVwLiBSaWdodCwgSSBuZWVkIHRvIGNoZWNrIGlmIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gWWVzLCBpdCBpcy4gR29vZC4KCk5vdywgbGV0IG1lIHRoaW5rIGlmIHRoZXJlIGFyZSBvdGhlciwgbW9yZSBzdWJ0bGUgY29uZmlndXJhdGlvbnMgYXQgcGxheSBoZXJlLiBTaW5jZSBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIGAvcHJvY2AsIEkgc2hvdWxkIG1ha2Ugc3VyZSBgQ09ORklHX1BST0NfRlNgIGlzbiYjMzk7dCBzb21lIG9ic2N1cmUgcmVxdWlyZW1lbnQuIENoZWNraW5nIGBtbS9hbGxvY190YWcuY2AsIEkgc2VlIGBwcm9jX2NyZWF0ZWAsIHdoaWNoIHJlbGllcyBvbiBgQ09ORklHX1BST0NfRlNgLiBIb3dldmVyLCB0aGF0IGlzIGEgdmVyeSBjb21tb24gY29uZmlnLCBhbmQgbm90IHdvcnRoIHRoZSBsaXN0aW5nLiBOb3csIHdoZXJlIHdhcyBJPyBSaWdodCwgbGV0JiMzOTtzIGNoZWNrIGBsaWIvY29kZXRhZy5jYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2RldGFnLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9NYWtlZmlsZT0xOTY9b2JqLSQoQ09ORklHX0ZVTkNUSU9OX0VSUk9SX0lOSkVDVElPTikgJiM0Mzs9IGVycm9yLWluamVjdC5vXG5saWIvTWFrZWZpbGUtMTk3LVxubGliL01ha2VmaWxlOjE5ODpvYmotJChDT05GSUdfQ09ERV9UQUdHSU5HKSAmIzQzOz0gY29kZXRhZy5vXG5saWIvTWFrZWZpbGUtMTk5LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NTcxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqVmVyaWZ5aW5nIERlcGVuZGVuY2llcyBpbiBLZXJuZWwgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIHNlZSB0aGF0IGBDT05GSUdfQ09ERV9UQUdHSU5HYCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgSSBhbHdheXMgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGVzcGVjaWFsbHkgd2hlbiB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGNvcmUga2VybmVsIGNvbmZpZ3VyYXRpb24uIFRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBraW5kIG9mIGRlcGVuZGVuY3kgYXJlIHByZXR0eSBzaWduaWZpY2FudCwgYW5kIGEgbWlzdW5kZXJzdGFuZGluZyBoZXJlIGNvdWxkIGxlYWQgdG8gc29tZSBuYXN0eSBkZWJ1Z2dpbmcgaGVhZGFjaGVzIGxhdGVyIG9uLiBMZXQgbWUganVzdCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBmaWxlIHRvIGNvbmZpcm0gdGhhdCB0aGUgZGVwZW5kZW5jeSBpcyBjb2RlZCBjb3JyZWN0bHkuIEkmIzM5O2xsIG1lbnRhbGx5IHN0ZXAgdGhyb3VnaCB0aGUgcmVsZXZhbnQgc2VjdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGUgbG9naWMgaXMgc291bmQgYW5kIHRoZXJlIGFyZSBubyB1bmV4cGVjdGVkIGludGVyYWN0aW9ucyBvciBjb25kaXRpb25hbHMgdGhhdCBtaWdodCBjaGFuZ2UgdGhlIGJlaGF2aW9yLiBJdCYjMzk7cyBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdHJhY2tpbmcgZG93biBhIGh5cG90aGV0aWNhbCBidWcgZG93biB0aGUgbGluZS4gSXQmIzM5O3Mgc2Vjb25kIG5hdHVyZSBmb3IgbWUgdG8gaW1tZWRpYXRlbHkgdmVyaWZ5IGEgZGVwZW5kZW5jeSBsaWtlIHRoaXMuIEdvb2QgdG8gZ28hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkcmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1ZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODQ1CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKkZpbmRpbmcgdGhlIERlZmluaXRpb24gb2YgYE1FTV9BTExPQ19QUk9GSUxJTkdgKioKCk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIGV4YWN0bHkgd2hlcmUgdGhpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZGVmaW5lZC4gVGhpcyBsaWtlbHkgbWVhbnMgaXQmIzM5O3MgYSBwcmVwcm9jZXNzb3IgbWFjcm8gb3IsIGxlc3MgbGlrZWx5LCBhIHZhcmlhYmxlLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIG15IGluaXRpYWwgYmV0IGlzIG9uIGEgbWFjcm8uIEkmIzM5O2xsIG5lZWQgdG8ga25vdyBpdHMgZGVmaW5pdGlvbiB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3Qgb24gdGhlIGNvZGViYXNlIGFuZCwgdWx0aW1hdGVseSwgd2hhdCB0aGUgY29tcGlsZXIgZG9lcyB3aXRoIGl0LiBUaGlzIGlzIGNydWNpYWwgZm9yIGRlYnVnZ2luZyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYmVoYXZpb3IsIGVzcGVjaWFsbHkgaWYgdGhlcmUmIzM5O3MgYW55IGFsbG9jYXRpb24gcHJvZmlsaW5nIGVuYWJsZWQuIE5vdywgbGV0JiMzOTtzIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgaW5jbHVkZXMsIGJ1aWxkIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBzZXR0aW5ncyB0byBuYWlsIGRvd24gdGhhdCBkZWZpbml0aW9uLiBLbm93aW5nIHRoZSBwcmVjaXNlIGxvY2F0aW9uIHdpbGwgdW5sb2NrIHRoZSBmdWxsIGNvbnRleHQgb2YgaXRzIHVzYWdlIGFuZCB3aGF0IGZsYWdzIGRldGVybWluZSBpdHMgcHJlc2VuY2UuIFRpbWUgdG8gcHV0IG9uIG15IGRldGVjdGl2ZSBoYXQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcbi0tXG5tbS9LY29uZmlnLmRlYnVnLTMyMy1cbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9LY29uZmlnLmRlYnVnLTMyNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuLS1cbm1tL0tjb25maWcuZGVidWctMzM3LVxubW0vS2NvbmZpZy5kZWJ1ZzozMzg6Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG5tbS9LY29uZmlnLmRlYnVnLTMzOS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zNDItXG5tbS9LY29uZmlnLmRlYnVnOjM0Mzpjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXHRib29sIFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGVyIGRlYnVnZ2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODI3OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gRGVidWcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nLCB3aGVyZSYjMzk7cyB0aGUgYmVzdCBwbGFjZSB0byBkaWcgaW50byB0aGVzZSBkZWJ1ZyBvcHRpb25zPyBNeSBpbnN0aW5jdCBpcyB0byBjaGVjayBgbW0vS2NvbmZpZy5kZWJ1Z2AuIFRoYXQmIzM5O3MgdXN1YWxseSB0aGUgZ28tdG8gc3BvdCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQtcmVsYXRlZCBkZWJ1Z2dpbmcgY29uZmlndXJhdGlvbnMsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb3JlIG1lbW9yeSBhcmVhcy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgYWltaW5nIGFyb3VuZCBsaW5lIDMyNDsgdGhhdCBmZWVscyBsaWtlIGEgbGlrZWx5IHBvaW50IHRvIHN0YXJ0IHVucmF2ZWxpbmcgd2hhdCYjMzk7cyBlbmFibGVkIGFuZCBkaXNhYmxlZC4gTXkgaG9wZSBpcyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2Ygd2hpY2ggZmVhdHVyZXMgYXJlIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBidWlsZCBhbmQgdW5kZXJzdGFuZCBob3cgdGhleSBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIsIHJpZ2h0IGluIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlLiBJIGFudGljaXBhdGUgdGhlcmUmIzM5O2xsIGJlIGNvbmRpdGlvbmFsIGJsb2NrcyBhbmQgc29tZSBpbnRlcmVzdGluZyBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhLiBJdCYjMzk7cyB0aW1lIHRvIGdldCBhIGJldHRlciBncmFzcCBvbiB3aGF0IGNhbiBiZSBhZGp1c3RlZCwgYW5kIGhvdyBpdCBpbXBhY3RzIHRoZSBydW50aW1lIGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyMDpcdFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxuIDMyMTpcdFxuIDMyMjpcdFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4gMzIzOlx0XG4gMzI0Olx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcbiAzMjU6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuIDMyNjpcdFx0ZGVmYXVsdCBuXG4gMzI3Olx0XHRkZXBlbmRzIG9uIE1NVVxuIDMyODpcdFx0ZGVwZW5kcyBvbiBQUk9DX0ZTXG4gMzI5Olx0XHRkZXBlbmRzIG9uICFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVcbiAzMzA6XHRcdHNlbGVjdCBDT0RFX1RBR0dJTkdcbiAzMzE6XHRcdHNlbGVjdCBQQUdFX0VYVEVOU0lPTlxuIDMzMjpcdFx0c2VsZWN0IFNMQUJfT0JKX0VYVFxuIDMzMzpcdFx0aGVscFxuIDMzNDpcdFx0ICBUcmFjayBhbGxvY2F0aW9uIHNvdXJjZSBjb2RlIGFuZCByZWNvcmQgdG90YWwgYWxsb2NhdGlvbiBzaXplXG4gMzM1Olx0XHQgIGluaXRpYXRlZCBhdCB0aGF0IGNvZGUgbG9jYXRpb24uIFRoZSBtZWNoYW5pc20gY2FuIGJlIHVzZWQgdG8gdHJhY2tcbiAzMzY6XHRcdCAgbWVtb3J5IGxlYWtzIHdpdGggYSBsb3cgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBpbXBhY3QuXG4gMzM3Olx0XG4gMzM4Olx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG4gMzM5Olx0XHRib29sIFwmIzM0O0VuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFwmIzM0O1xuIDM0MDpcdFx0ZGVmYXVsdCB5XG4gMzQxOlx0XHRkZXBlbmRzIG9uIE1FTV9BTExPQ19QUk9GSUxJTkdcbiAzNDI6XHRcbiAzNDM6XHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xuIDM0NDpcdFx0Ym9vbCBcJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxlciBkZWJ1Z2dpbmdcJiMzNDtcbiAzNDU6XHRcdGRlZmF1bHQgblxuIDM0NjpcdFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzQ3Olx0XHRzZWxlY3QgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcbiAzNDg6XHRcdGhlbHBcbiAzNDk6XHRcdCAgQWRkcyB3YXJuaW5ncyB3aXRoIGhlbHBmdWwgZXJyb3IgbWVzc2FnZXMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4OTM0CgkJCQkJCQlvdXRwdXQ6IDE0NgoJCQkJCQkJdGhvdWdodHM6IDE5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmc6IFRoZSBDb25maWd1cmF0aW9uIFBhdGgqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0aGlua2luZyBhYm91dCB0aGlzIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBjb25maWd1cmF0aW9uLCBhbmQgaXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBJdCBsb29rcyBsaWtlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyB0aGUga2V5LiBUaGF0JiMzOTtzIHRoZSBtYWluIGNvbmZpZyBmbGFnIHdlIG5lZWQgdG8gZmxpcCB0byBnZXQgdGhpcyB3aG9sZSB0aGluZyB3b3JraW5nLiBJIHdhcyBpbml0aWFsbHkgd29uZGVyaW5nIGlmIHdlJiMzOTtkIG5lZWQgYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBhcyB3ZWxsLCBvciBpZiB3ZSYjMzk7ZCBoYXZlIHRvIHVzZSBgc3lzY3RsYCBvciBhIGJvb3QgcGFyYW1ldGVyLiBCdXQsIGhvbGQgb24uLi4gYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBkZWZhdWx0cyB0byAmIzM5O3kmIzM5OyAqaWYqIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBFeGNlbGxlbnQuIFRoYXQgc2ltcGxpZmllcyB0aGluZ3MgcXVpdGUgYSBiaXQuIEp1c3Qgc2V0dGluZyBgTUVNX0FMTE9DX1BST0ZJTElOR2Agc2hvdWxkIGJlIHN1ZmZpY2llbnQuCgpOb3csIGxldCYjMzk7cyBzZWUgd2hhdCBuZXcgZnVuY3Rpb25hbGl0eSBpcyBiZWluZyBpbnRyb2R1Y2VkLiBUaW1lIHRvIGNoZWNrIHRoZSBmb2N1cyBzeW1ib2xzLiBMb29rcyBsaWtlIHdlIGhhdmUgYSBuZXcgc2V0IG9mIGZ1bmN0aW9uczogSSBzZWUgYGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZGAsIGBhbGxvY2luZm9faW9jdGxfZ2V0X2F0YCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dGAsIGBhbGxvY2luZm9faW9jdGxgLCBgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bGAsIGBhbGxvY2luZm9fb3BlbmAgYW5kIGBhbGxvY2luZm9fcmVsZWFzZWAgZnVuY3Rpb25zLiBUaGVyZSYjMzk7cyBhbHNvIGBtYXRjaGVzX2ZpbHRlcmAuIEdvb2QgdG8gaGF2ZSB0aGlzIGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfYXQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0JiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fY29tcGF0X2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19vcGVuJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19yZWxlYXNlJiMzNDssCiAgICAmIzM0O21hdGNoZXNfZmlsdGVyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgaW9jdGwgaW50ZXJmYWNlIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdmlhIC9wcm9jL2FsbG9jaW5mby4gVGhpcyBpcyBhIG5ldyBmdW5jdGlvbmFsIEFQSSBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9hdCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X25leHQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX29wZW4mIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7bWF0Y2hlc19maWx0ZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjA1LjE0Nzk3ODI0OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwNTEyNTMyMTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MDUuMTQ3OTgzNDI4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODcxMTgxOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVsIDkgMTE6NTA6MDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XFxuQEAgLTQ2LDYgKzQ2LDExIEBAIHN5c2N0bDpcXG4gUnVudGltZSBpbmZvOlxcbiAgIC9wcm9jL2FsbG9jaW5mb1xcbiBcXG4rICBQcm9maWxpbmcgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGVpdGhlciBieSByZWFkaW5nIGAvcHJvYy9hbGxvY2luZm9gIGRpcmVjdGx5IGFzXFxuKyAgdGV4dCBvciBwcm9ncmFtbWF0aWNhbGx5IHZpYSBgaW9jdGwoKWAgY2FsbHMgZGVmaW5lZCBpbiBgXFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXHUwMDNlYC5cXG4rICBUaGUgaW9jdGwgaW50ZXJmYWNlIHN1cHBvcnRzIHN0cnVjdHVyZWQgYmluYXJ5IGRhdGEgZXh0cmFjdGlvbiBhcyB3ZWxsIGFzIGZpbHRlcmluZ1xcbisgIGJ5IG1vZHVsZSBuYW1lLCBmdW5jdGlvbiwgZmlsZSwgbGluZSBudW1iZXIsIGFjY3VyYWN5LCBvciBhbGxvY2F0aW9uIHNpemUgbGltaXRzLlxcbitcXG4gRXhhbXBsZSBvdXRwdXQ6OlxcbiBcXG4gICByb290QG1vcmlhLWt2bTp+IyBzb3J0IC1nIC9wcm9jL2FsbG9jaW5mb3x0YWlsfG51bWZtdCAtLXRvPWllY1xcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdCBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcXG5AQCAtMzQ2LDYgKzM0Niw4IEBAIENvZGUgIFNlcSMgICAgSW5jbHVkZSBGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXFx1MDAzZVxcbiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXFx1MDAzZVxcbisweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwM2NtYWlsdG86c3VyZW5iQGdvb2dsZS5jb21cXHUwMDNlXFxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcXG4gMHhBQiAgMDAtMUYgIGxpbnV4L25iZC5oXFxuIDB4QUMgIDAwLTFGICBsaW51eC9yYXcuaFxcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXFxuaW5kZXggZDE5ODIyZDU3NGZkNDguLjNkNTRmZDhkNjljMWM2IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTY5MzYsNyArMTY5MzYsOSBAQCBTOlxcdE1haW50YWluZWRcXG4gRjpcXHREb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbiBGOlxcdGluY2x1ZGUvbGludXgvYWxsb2NfdGFnLmhcXG4gRjpcXHRpbmNsdWRlL2xpbnV4L3BnYWxsb2NfdGFnLmhcXG4rRjpcXHRpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG4gRjpcXHRtbS9hbGxvY190YWcuY1xcbitGOlxcdHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9cXG4gXFxuIE1FTU9SWSBNQU5BR0VNRU5UIC0gQkFMTE9PTlxcbiBNOlxcdEFuZHJldyBNb3J0b24gXFx1MDAzY2FrcG1AbGludXgtZm91bmRhdGlvbi5vcmdcXHUwMDNlXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcXG5pbmRleCBkZGFlNzQ4NGNhNDU2Yy4uYTI1YTA4NWMyZGYxOTkgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxcbkBAIC03Nyw2ICs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHtcXG4gdm9pZCBjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gYm9vbCBjb2RldGFnX3RyeWxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xcbit1bnNpZ25lZCBsb25nIGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4rdW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XFxuIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gc3RydWN0IGNvZGV0YWcgKmNvZGV0YWdfbmV4dF9jdChzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciAqaXRlcik7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG5AQCAtMCwwICsxLDk5IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wIFdJVEggTGludXgtc3lzY2FsbC1ub3RlICovXFxuKy8qXFxuKyAqIGFsbG9jX3RhZyBJT0NUTCBBUEkgZGVmaW5pdGlvblxcbisgKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxcbisgKlxcbisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxcbisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhc1xcbisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi5cXG4rICovXFxuK1xcbisjaWZuZGVmIF9VQVBJX0FMTE9DX1RBR19IXFxuKyNkZWZpbmUgX1VBUElfQUxMT0NfVEFHX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rLypcXG4rICogRnVuY3Rpb24sIGZpbGUgYW5kIG1vZHVsZSBuYW1lcyBvZnRlbiBoYXZlIHRoZSBzYW1lIHByZWZpeGVzLCB0aGVyZWZvcmVcXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xcbisgKiBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBuYW1lIGNvbGxpc2lvbnNcXG4rICovXFxuKyNkZWZpbmUgQUxMT0NJTkZPX1NUUl9TSVpFXFx0NjRcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7XFxuK1xcdF9fdTY0IGlkO1xcbit9O1xcbitcXG4rc3RydWN0IGFsbG9jaW5mb190YWcge1xcbitcXHQvKiBMb25nZXIgbmFtZXMgYXJlIHRyaW1tZWQgKi9cXG4rXFx0Y2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XFxuK1xcdGNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTtcXG4rXFx0Y2hhciBmaWxlbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdO1xcbitcXHRfX3U2NCBsaW5lbm87XFxuK1xcdC8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqL1xcbitcXHRfX3U2NCBpbmFjY3VyYXRlO1xcbit9O1xcbitcXG4rLyogVGhlIGFsaWdubWVudCBlbnN1cmVzIDMyLWJpdCBjb21wYXRpYmxlIGludGVyZmFjZXMgYXJlIG5vdCBicm9rZW4gKi9cXG4rc3RydWN0IGFsbG9jaW5mb19jb3VudGVyIHtcXG4rXFx0X191NjQgYnl0ZXM7XFxuK1xcdF9fdTY0IGNhbGxzO1xcbitcXHRfX3U4IGFjY3VyYXRlO1xcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEge1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyB0YWc7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xcbit9O1xcbitcXG4rZW51bSB7XFxuK1xcdEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTixcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8sXFxuK1xcdEFMTE9DSU5GT19GSUxURVJfSU5BQ0NVUkFURSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRSxcXG4rXFx0X19BTExPQ0lORk9fRklMVEVSX0xBU1QgPSBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFXFxuK307XFxuK1xcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FKVxcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfRlVOQ1RJT04pXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSlcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8pXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcXHQoMSBcXHUwMDNjXFx1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSlcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkVcXHRcXHQoMSBcXHUwMDNjXFx1MDAzYyBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFKVxcbitcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tTIFxcXFxcXG4rXFx0KCgxIFxcdTAwM2NcXHUwMDNjIChfX0FMTE9DSU5GT19GSUxURVJfTEFTVCArIDEpKSAtIDEpXFxuK1xcbitzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7XFxuK1xcdF9fdTY0IG1hc2s7IC8qIGJpdG1hc2sgb2YgdGhlIGZpbHRlciBmaWVsZHMgdXNlZCAqL1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7XFxuK1xcdF9fdTY0IG1pbl9zaXplO1xcbitcXHRfX3U2NCBtYXhfc2l6ZTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHtcXG4rXFx0LyogaW5wdXRzICovXFxuK1xcdF9fdTY0IHBvcztcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xcbitcXHQvKiBvdXRwdXQgKi9cXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhO1xcbit9O1xcbitcXG4rI2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXFx0MFxcbisjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9BVFxcdFxcdDFcXG4rI2RlZmluZSBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19CQVNFXFx0XFx0MHhBNlxcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRFxcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQpXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19HRVRfQVRcXHRcXHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcXHRcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0KVxcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfR0VUX05FWFRcXHRcXHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsXFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXFxuK1xcbisjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi9cXG5kaWZmIC0tZ2l0IGEvbGliL2NvZGV0YWcuYyBiL2xpYi9jb2RldGFnLmNcXG5pbmRleCA0MDAxYTdlYTY2NzU0Mi4uYTljZGE0Yzk2MmEzMDMgMTAwNjQ0XFxuLS0tIGEvbGliL2NvZGV0YWcuY1xcbisrKyBiL2xpYi9jb2RldGFnLmNcXG5AQCAtMTksNiArMTksOCBAQCBzdHJ1Y3QgY29kZXRhZ190eXBlIHtcXG4gXFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XFxuIFxcdC8qIGdlbmVyYXRlcyB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyIGZvciBtb2R1bGUgbG9hZCAqL1xcbiBcXHR1bnNpZ25lZCBsb25nIG5leHRfbW9kX3NlcTtcXG4rXFx0LyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyBjb250ZW50X2lkO1xcbiB9O1xcbiBcXG4gc3RydWN0IGNvZGV0YWdfcmFuZ2Uge1xcbkBAIC01MCw2ICs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcXG4gXFx0dXBfcmVhZChcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuIH1cXG4gXFxuK3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuK1xcbitcXHRyZXR1cm4gY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbit9XFxuK1xcbit1bnNpZ25lZCBpbnQgY29kZXRhZ19nZXRfY291bnQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKVxcbit7XFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbitcXG4rXFx0cmV0dXJuIGN0dHlwZS1cXHUwMDNlY291bnQ7XFxuK31cXG4rXFxuIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXIgPSB7XFxuQEAgLTIwNCw2ICsyMjAsNyBAQCBzdGF0aWMgaW50IGNvZGV0YWdfbW9kdWxlX2luaXQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlLCBzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIFxcbiBcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gXFx0Y21vZC1cXHUwMDNlbW9kX3NlcSA9ICsrY3R0eXBlLVxcdTAwM2VuZXh0X21vZF9zZXE7XFxuK1xcdCsrY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbiBcXHRtb2RfaWQgPSBpZHJfYWxsb2MoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7XFxuIFxcdGlmIChtb2RfaWQgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRpZiAoY3R0eXBlLVxcdTAwM2VkZXNjLm1vZHVsZV9sb2FkKSB7XFxuQEAgLTM2OCw2ICszODUsNyBAQCB2b2lkIGNvZGV0YWdfdW5sb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIFxcdFxcdFxcdGN0dHlwZS1cXHUwMDNlY291bnQgLT0gcmFuZ2Vfc2l6ZShjdHR5cGUsIFxcdTAwMjZjbW9kLVxcdTAwM2VyYW5nZSk7XFxuIFxcdFxcdFxcdGlkcl9yZW1vdmUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcXG4gXFx0XFx0XFx0a2ZyZWUoY21vZCk7XFxuK1xcdFxcdFxcdCsrY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbiBcXHRcXHR9XFxuIFxcdFxcdHVwX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gXFx0XFx0aWYgKGZvdW5kIFxcdTAwMjZcXHUwMDI2IGN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKVxcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXFxuaW5kZXggY2Y2NWU5OTkyZmRhMzMuLjJjODE5ZmE5ZWFmYWQwIDEwMDY0NFxcbi0tLSBhL21tL2FsbG9jX3RhZy5jXFxuKysrIGIvbW0vYWxsb2NfdGFnLmNcXG5AQCAtNSw2ICs1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2dmcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva2FsbHN5bXMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VfZXh0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wZ2FsbG9jX3RhZy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY19mcy5oXFx1MDAzZVxcbkBAIC0xNCw2ICsxNSw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfY2hvaWNlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdm1hbGxvYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva21lbWxlYWsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInBhZ2VfYWxsb2MuaFxcXCJcXG5AQCAtNTAsNiArNTIsMTEgQEAgc3RydWN0IGFsbG9jaW5mb19wcml2YXRlIHtcXG4gXFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjtcXG4gXFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcXG4gXFx0Ym9vbCBwcmludF9oZWFkZXI7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0LyogaW9jdGwgdXNlcyBhIHNlcGFyYXRlIGl0ZXJhdG9yIG5vdCB0byBpbnRlcmZlcmUgd2l0aCByZWFkcyAqL1xcbitcXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpb2N0bF9pdGVyO1xcbitcXHRib29sIHBvc2l0aW9uZWQ7IC8qIHNlcV9vcGVuX3ByaXZhdGUoKSBzZXRzIHRvIDAgKi9cXG4rXFx0c3RydWN0IG11dGV4IGlvY3RsX2xvY2s7XFxuIH07XFxuIFxcbiBzdGF0aWMgdm9pZCAqYWxsb2NpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpXFxuQEAgLTEzMyw2ICsxNDAsMzQwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWxsb2NpbmZvX3NlcV9vcCA9IHtcXG4gXFx0LnNob3dcXHQ9IGFsbG9jaW5mb19zaG93LFxcbiB9O1xcbiBcXG4rLypcXG4rICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nXFxuKyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxcbisgKi9cXG4rc3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gc2VxX29wZW5fcHJpdmF0ZShmaWxlLCBcXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcXG4rXFx0XFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpKTtcXG4rXFx0aWYgKCFyZXQpIHtcXG4rXFx0XFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbitcXHRcXHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0XFx0bXV0ZXhfaW5pdChcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfbG9jayk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogQ2xlYW5zIHVwIHRoZSBzZXFfZmlsZSBzdGF0ZSBhbmQgZnJlZXMgdXAgdGhlIHByaXZhdGUgc3RhdGUgYWxsb2NhdGVkIGluXFxuKyAqIGFsbG9jaW5mb19vcGVuKCkgd2hlbiBjbG9zaW5nIHRoZSAvcHJvYy9hbGxvY2luZm8gZmlsZSBkZXNjcmlwdG9yLlxcbisgKi9cXG4rc3RhdGljIGludCBhbGxvY2luZm9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdiA9IG0tXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHRtdXRleF9kZXN0cm95KFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHNvIHRoYXQgaXRzIGxlbmd0aCBmaXRzIHdpdGhpblxcbisgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuXFxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXFxuKyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG9cXG4rICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zXFxuKyAqL1xcbitzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpO1xcbitcXG4rXFx0LyogS2VlcCBhbiBleHRyYSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIE5VTEwuICovXFxuK1xcdGlmIChsZW4gXFx1MDAzZT0gQUxMT0NJTkZPX1NUUl9TSVpFKVxcbitcXHRcXHRzdHIgKz0gKGxlbiAtIEFMTE9DSU5GT19TVFJfU0laRSkgKyAxO1xcbitcXHRyZXR1cm4gc3RyO1xcbit9XFxuK1xcbisvKiBDb3B5IGEgc3RyaW5nIGFuZCB0cmltIGZyb20gdGhlIGJlZ2lubmluZyBpZiBpdCdzIHRvbyBsb25nICovXFxuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpXFxuK3tcXG4rXFx0c3Ryc2NweV9wYWQoZGVzdCwgYWxsb2NpbmZvX3N0cihzcmMpLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xcbit9XFxuK1xcbisvKiBDb21wYXJlIHR3byBzdHJpbmdzIGFuZCBvbmx5IGNvbnNpZGVyIHRoZSB0cmltbWVkIHN1ZmZpeCBpZiBzMSBpcyB0b28gbG9uZyAqL1xcbitzdGF0aWMgaW50IGFsbG9jaW5mb19jbXBfc3RyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqdGVtcGxhdGUpXFxuK3tcXG4rXFx0cmV0dXJuIHN0cm5jbXAoYWxsb2NpbmZvX3N0cihzdHIpLCB0ZW1wbGF0ZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rfVxcbitcXG4rLyogRmV0Y2ggdGhlIHBlci1DUFUgY291bnRlcnMgKi9cXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXFxuK3tcXG4rXFx0cmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBQb3B1bGF0ZXMgdGhlIFVBUEkgYWxsb2NpbmZvX3RhZ19kYXRhIHN0cnVjdHVyZSB3aXRoIGFjdGl2ZSBydW50aW1lXFxuKyAqIHByb2ZpbGluZyBjb3VudGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgZ2l2ZW4ga2VybmVsIGNvZGV0YWcuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBhbGxvY2luZm9fdG9fcGFyYW1zKHN0cnVjdCBjb2RldGFnICpjdCxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMpXFxuK3tcXG4rXFx0aWYgKGN0LVxcdTAwM2Vtb2RuYW1lKVxcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cXHUwMDNldGFnLm1vZG5hbWUsIGN0LVxcdTAwM2Vtb2RuYW1lKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRkYXRhLVxcdTAwM2V0YWcubW9kbmFtZVswXSA9ICdcXFxcMCc7XFxuK1xcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVxcdTAwM2V0YWcuZnVuY3Rpb24sIGN0LVxcdTAwM2VmdW5jdGlvbik7XFxuK1xcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVxcdTAwM2V0YWcuZmlsZW5hbWUsIGN0LVxcdTAwM2VmaWxlbmFtZSk7XFxuK1xcdGRhdGEtXFx1MDAzZXRhZy5saW5lbm8gPSBjdC1cXHUwMDNlbGluZW5vO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmJ5dGVzID0gY291bnRlcnMtXFx1MDAzZWJ5dGVzO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmNhbGxzID0gY291bnRlcnMtXFx1MDAzZWNhbGxzO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBjb250ZW50IElEIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uIHRhZyBtb2R1bGVcXG4rICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG4re1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgcGFyYW1zO1xcbitcXG4rXFx0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcXG4rXFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XFxuKyAqIG1hdGNoaW5nIGl0cyBjaGFyYWN0ZXJpc3RpY3MgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGZpbHRlci5cXG4rICovXFxuK3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMsXFxuK1xcdFxcdFxcdCAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpXFxuK3tcXG4rXFx0Ym9vbCBpbmFjY3VyYXRlO1xcbitcXG4rXFx0aWYgKCFmaWx0ZXIgfHwgIWZpbHRlci1cXHUwMDNlbWFzaylcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcbitcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUUpIHtcXG4rXFx0XFx0LyogdXNlciB3YW50cyB0byBmaWx0ZXIgYnkgbW9kbmFtZSBidXQgY3QtXFx1MDAzZW1vZG5hbWUgaXMgTlVMTCAqL1xcbitcXHRcXHRpZiAoIWN0LVxcdTAwM2Vtb2RuYW1lKSB7XFxuK1xcdFxcdFxcdC8qIHZhbGlkYXRlIGlmIHVzZXIgd2FzIGF0dGVtcHRpbmcgdG8gZmlsdGVyIGZvciBidWlsdC1pbiBhbGxvY2F0aW9ucyAqL1xcbitcXHRcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VmaWVsZHMubW9kbmFtZVswXSAhPSAnXFxcXDAnKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH0gZWxzZSBpZiAoYWxsb2NpbmZvX2NtcF9zdHIoY3QtXFx1MDAzZW1vZG5hbWUsIGZpbHRlci1cXHUwMDNlZmllbGRzLm1vZG5hbWUpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3QtXFx1MDAzZWZ1bmN0aW9uIFxcdTAwMjZcXHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVxcdTAwM2VmdW5jdGlvbiwgZmlsdGVyLVxcdTAwM2VmaWVsZHMuZnVuY3Rpb24pKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAoKGZpbHRlci1cXHUwMDNlbWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGN0LVxcdTAwM2VmaWxlbmFtZSBcXHUwMDI2XFx1MDAyNiBhbGxvY2luZm9fY21wX3N0cihjdC1cXHUwMDNlZmlsZW5hbWUsIGZpbHRlci1cXHUwMDNlZmllbGRzLmZpbGVuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3QtXFx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXFx1MDAzZWZpZWxkcy5saW5lbm8pXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xcbitcXHRcXHRpbmFjY3VyYXRlID0gISEoY3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQ09ERVRBR19GTEFHX0lOQUNDVVJBVEUpO1xcbitcXHRcXHRpZiAoaW5hY2N1cmF0ZSAhPSAhIShmaWx0ZXItXFx1MDAzZWZpZWxkcy5pbmFjY3VyYXRlKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgKEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSB8IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkpIHtcXG4rXFx0XFx0aWYgKCEqZmV0Y2hlZF9jb3VudGVycykge1xcbitcXHRcXHRcXHQqY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xcbitcXHRcXHRcXHQqZmV0Y2hlZF9jb3VudGVycyA9IHRydWU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBjb3VudGVycy1cXHUwMDNlYnl0ZXMgXFx1MDAzYyBmaWx0ZXItXFx1MDAzZW1pbl9zaXplKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdGlmICgoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY291bnRlcnMtXFx1MDAzZWJ5dGVzIFxcdTAwM2UgZmlsdGVyLVxcdTAwM2VtYXhfc2l6ZSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLypcXG4rICogU2Vla3MgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgMC1pbmRleGVkIHRhZyBwb3NpdGlvbiwgcmVhZHMgaXRzXFxuKyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xcbitcXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcXG4rXFx0X191NjQgc2tpcF9jb3VudDtcXG4rXFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcXG4rXFx0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xcbitcXG4rXFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZwYXJhbXMsIGFyZywgc2l6ZW9mKHBhcmFtcykpKVxcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFxuK1xcdGlmIChwYXJhbXMuZmlsdGVyLm1hc2sgXFx1MDAyNiB+QUxMT0NJTkZPX0ZJTFRFUl9NQVNLUylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRpZiAoKHBhcmFtcy5maWx0ZXIubWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChwYXJhbXMuZmlsdGVyLm1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBwYXJhbXMuZmlsdGVyLm1pbl9zaXplIFxcdTAwM2UgcGFyYW1zLmZpbHRlci5tYXhfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRwcml2ID0gbS1cXHUwMDNlcHJpdmF0ZTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2xvY2spO1xcbitcXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XFxuK1xcbitcXHRpZiAocGFyYW1zLnBvcyBcXHUwMDNlPSBjb2RldGFnX2dldF9jb3VudChhbGxvY190YWdfY3R0eXBlKSkge1xcbitcXHRcXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFxuK1xcdHNraXBfY291bnQgPSBwYXJhbXMucG9zO1xcbitcXG4rXFx0aWYgKHBhcmFtcy5maWx0ZXIubWFzaylcXG4rXFx0XFx0cHJpdi1cXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcXG4rXFx0ZWxzZVxcbitcXHRcXHRwcml2LVxcdTAwM2VmaWx0ZXIubWFzayA9IDA7XFxuK1xcbitcXHQvKiBGaW5kIHRoZSBjb2RldGFnICovXFxuK1xcdHByaXYtXFx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRjdCA9IGNvZGV0YWdfbmV4dF9jdChcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfaXRlcik7XFxuK1xcbitcXHR3aGlsZSAoY3QpIHtcXG4rXFx0XFx0ZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlO1xcbitcXHRcXHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFxcdTAwMjZwcml2LVxcdTAwM2VmaWx0ZXIsIFxcdTAwMjZjb3VudGVycywgXFx1MDAyNmZldGNoZWRfY291bnRlcnMpKSB7XFxuK1xcdFxcdFxcdGlmIChza2lwX2NvdW50ID09IDApXFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRza2lwX2NvdW50LS07XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoY3QpIHtcXG4rXFx0XFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxcbitcXHRcXHRcXHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XFxuK1xcdFxcdGFsbG9jaW5mb190b19wYXJhbXMoY3QsIFxcdTAwMjZwYXJhbXMuZGF0YSwgXFx1MDAyNmNvdW50ZXJzKTtcXG4rXFx0XFx0cHJpdi1cXHUwMDNlcG9zaXRpb25lZCA9IHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2xvY2spO1xcbitcXG4rXFx0aWYgKCFjdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRpZiAoY29weV90b191c2VyKGFyZywgXFx1MDAyNnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpKVxcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBBZHZhbmNlcyB0aGUgaW9jdGwgaXRlcmF0b3IgdG8gdGhlIG5leHQgYWxsb2NhdGlvbiB0YWcgaW4gdGhlIHNlcXVlbmNlIGFuZFxcbisgKiByZXR1cm5zIGl0cyBwcm9maWxpbmcgZGF0YSB0byB1c2Vyc3BhY2UuXFxuKyAqL1xcbitzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xcbitcXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgcGFyYW1zO1xcbitcXHRpbnQgcmV0ID0gMDtcXG4rXFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcXG4rXFx0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcXG4rXFx0cHJpdiA9IG0tXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXG4rXFx0aWYgKCFwcml2LVxcdTAwM2Vwb3NpdGlvbmVkKSB7XFxuK1xcdFxcdHByaXYtXFx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR3aGlsZSAoY3QpIHtcXG4rXFx0XFx0ZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlO1xcbitcXHRcXHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFxcdTAwMjZwcml2LVxcdTAwM2VmaWx0ZXIsIFxcdTAwMjZjb3VudGVycywgXFx1MDAyNmZldGNoZWRfY291bnRlcnMpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoY3QpIHtcXG4rXFx0XFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxcbitcXHRcXHRcXHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XFxuK1xcdFxcdGFsbG9jaW5mb190b19wYXJhbXMoY3QsIFxcdTAwMjZwYXJhbXMsIFxcdTAwMjZjb3VudGVycyk7XFxuK1xcdH1cXG4rXFx0aWYgKCFjdCkge1xcbitcXHRcXHRwcml2LVxcdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XFxuK1xcdFxcdHJldCA9IC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFx0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfbG9jayk7XFxuK1xcbitcXHRpZiAocmV0ID09IDApIHtcXG4rXFx0XFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZVxcbisgKiBsYXlvdXQgY29udGVudCBJRCwgc2VlayB0byBhIHNwZWNpZmljIHRhZywgb3IgcmVhZCBzZXF1ZW50aWFsIHRhZ3MuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIF9fYXJnKVxcbit7XFxuK1xcdHZvaWQgX191c2VyICphcmcgPSAodm9pZCBfX3VzZXIgKilfX2FyZztcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHN3aXRjaCAoY21kKSB7XFxuK1xcdGNhc2UgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEOlxcbitcXHRcXHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9BVDpcXG4rXFx0XFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9hdChmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEFMTE9DSU5GT19JT0NfR0VUX05FWFQ6XFxuK1xcdFxcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXQgPSAtRU5PSU9DVExDTUQ7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisjaWZkZWYgQ09ORklHX0NPTVBBVFxcbitzdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGFyZylcXG4re1xcbitcXHRyZXR1cm4gYWxsb2NpbmZvX2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTtcXG4rfVxcbisjZW5kaWZcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY19vcHMgYWxsb2NpbmZvX3Byb2Nfb3BzID0ge1xcbitcXHQucHJvY19vcGVuXFx0XFx0PSBhbGxvY2luZm9fb3BlbixcXG4rXFx0LnByb2NfcmVhZF9pdGVyXFx0XFx0PSBzZXFfcmVhZF9pdGVyLFxcbitcXHQucHJvY19sc2Vla1xcdFxcdD0gc2VxX2xzZWVrLFxcbitcXHQucHJvY19yZWxlYXNlXFx0XFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcXG4rXFx0LnByb2NfaW9jdGxcXHRcXHQ9IGFsbG9jaW5mb19pb2N0bCxcXG4rI2lmZGVmIENPTkZJR19DT01QQVRcXG4rXFx0LnByb2NfY29tcGF0X2lvY3RsXFx0PSBhbGxvY2luZm9fY29tcGF0X2lvY3RsLFxcbisjZW5kaWZcXG4rfTtcXG4rXFxuIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKVxcbiB7XFxuIFxcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7XFxuQEAgLTk4NCw4ICsxMzI1LDcgQEAgc3RhdGljIGludCBfX2luaXQgYWxsb2NfdGFnX2luaXQodm9pZClcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuLVxcdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXFx1MDAyNmFsbG9jaW5mb19zZXFfb3AsXFxuLVxcdFxcdFxcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XFxuK1xcdGlmICghcHJvY19jcmVhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXFx1MDAyNmFsbG9jaW5mb19wcm9jX29wcykpIHtcXG4gXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcXFxcblxcXCIsIEFMTE9DSU5GT19GSUxFX05BTUUpO1xcbiBcXHRcXHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5pbmRleCA4ZDRkYjIyNDFjYzJhMi4uMTI5NDFkNjhhN2Y4YWUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxcbkBAIC0xLDUgKzEsNiBAQFxcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuIFRBUkdFVFMgKz0gYWNjdFxcbitUQVJHRVRTICs9IGFsbG9jX3RhZ1xcbiBUQVJHRVRTICs9IGFsc2FcXG4gVEFSR0VUUyArPSBhbWQtcHN0YXRlXFxuIFRBUkdFVFMgKz0gYXJtNjRcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZjQxZDkyZDA2YjE4NDhcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXFxuQEAgLTAsMCArMSw5IEBAXFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuK1RFU1RfR0VOX1BST0dTIDo9IGFsbG9jaW5mb19pb2N0bF90ZXN0XFxuK1xcbitDRkxBR1MgKz0gLVdhbGxcXG4rQ0ZMQUdTICs9ICQoS0hEUl9JTkNMVURFUylcXG4rXFxuK2luY2x1ZGUgLi4vbGliLm1rXFxuK1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uN2Q5NGFiYjc4NWExNDhcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmNcXG5AQCAtMCwwICsxLDU0OCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuK1xcbisvKiBrc2VsZnRlc3QgZm9yIGFsbG9jaW5mbyBpb2N0bFxcbisgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuXFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2Vycm5vLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FsbG9jX3RhZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiLi4va3NlbGZ0ZXN0LmhcXFwiXFxuK1xcbisjZGVmaW5lIE1BWF9MSU5FX0xFTlxcdFxcdDUxMlxcbisjZGVmaW5lIEFMTE9DSU5GT19QUk9DXFx0XFx0XFxcIi9wcm9jL2FsbG9jaW5mb1xcXCJcXG4rXFxuK2VudW0gaW9jdGxfcmV0IHtcXG4rXFx0SU9DVExfU1VDQ0VTUyA9IDAsXFxuK1xcdElPQ1RMX0ZBSUxVUkUgPSAxLFxcbitcXHRJT0NUTF9JTlZBTElEX0RBVEEgPSAyLFxcbit9O1xcbitcXG4rI2RlZmluZSBWRUNfTUFYX0VOVFJJRVMgMzJcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjIHtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB0YWdbVkVDX01BWF9FTlRSSUVTXTtcXG4rXFx0X191NjQgY291bnQ7XFxuK307XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcXG4re1xcbitcXHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQsIHBhcmFtcyk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IF9fYWxsb2NpbmZvX2dldF9hdChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCAqcGFyYW1zKVxcbit7XFxuK1xcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfR0VUX0FULCBwYXJhbXMpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfbmV4dChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpwYXJhbXMpXFxuK3tcXG4rXFx0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxcbitcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YWdfZGF0YSxcXG4rXFx0XFx0XFx0Ym9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXFxuK1xcdFxcdFxcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXFxuK3tcXG4rXFx0aWYgKG1hdGNoX2J5dGVzIFxcdTAwMjZcXHUwMDI2IHRhZ19kYXRhLVxcdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHByb2Nmc19lbnRyeS1cXHUwMDNlY291bnRlci5ieXRlcykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwic2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtYXRjaF9jYWxscyBcXHUwMDI2XFx1MDAyNiB0YWdfZGF0YS1cXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXFx1MDAzZWNvdW50ZXIuY2FsbHMpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcImNhbGwgY291bnQgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWF0Y2hfbGluZW5vIFxcdTAwMjZcXHUwMDI2IHRhZ19kYXRhLVxcdTAwM2V0YWcubGluZW5vICE9IHByb2Nmc19lbnRyeS1cXHUwMDNldGFnLmxpbmVubykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1hdGNoX2Z1bmN0aW9uIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBzdHJuY21wKHRhZ19kYXRhLVxcdTAwM2V0YWcuZnVuY3Rpb24sIHByb2Nmc19lbnRyeS1cXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtYXRjaF9maWxlbmFtZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc3RybmNtcCh0YWdfZGF0YS1cXHUwMDNldGFnLmZpbGVuYW1lLCBwcm9jZnNfZW50cnktXFx1MDAzZXRhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiZmlsZW5hbWUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBtYXRjaF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcXG4rXFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyxcXG4rXFx0XFx0XFx0ICBib29sIG1hdGNoX2J5dGVzLCBib29sIG1hdGNoX2NhbGxzLCBib29sIG1hdGNoX2xpbmVubyxcXG4rXFx0XFx0XFx0ICBib29sIG1hdGNoX2Z1bmN0aW9uLCBib29sIG1hdGNoX2ZpbGVuYW1lKVxcbit7XFxuK1xcdF9fdTY0IGk7XFxuK1xcbitcXHRpZiAocHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50ICE9IHRhZ3MtXFx1MDAzZWNvdW50KSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFbnRyeSBjb3VudCBtaXNtYXRjaC4gaW9jdGwgZW50cmllczogJWxsdSwgcHJvYyBlbnRyaWVzOiAlbGx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgdGFncy1cXHUwMDNlY291bnQsIHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0aWYgKCFtYXRjaF9lbnRyeShcXHUwMDI2cHJvY2ZzX2VudHJpZXMtXFx1MDAzZXRhZ1tpXSwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1tpXSxcXG4rXFx0XFx0XFx0XFx0IG1hdGNoX2J5dGVzLCBtYXRjaF9jYWxscywgbWF0Y2hfbGluZW5vLFxcbitcXHRcXHRcXHRcXHQgbWF0Y2hfZnVuY3Rpb24sIG1hdGNoX2ZpbGVuYW1lKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiJWxsdXRoIGVudHJ5IGRvZXMgbm90IG1hdGNoLlxcXFxuXFxcIiwgaSk7XFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpO1xcbitcXG4rXFx0aWYgKGxlbiBcXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXFxuK1xcdFxcdHN0ciArPSAobGVuIC0gQUxMT0NJTkZPX1NUUl9TSVpFKSArIDE7XFxuK1xcdHJldHVybiBzdHI7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpXFxuK3tcXG4rXFx0c3RybmNweShkZXN0LCBhbGxvY2luZm9fc3RyKHNyYyksIEFMTE9DSU5GT19TVFJfU0laRSAtIDEpO1xcbitcXHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJ1xcXFwwJztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxcbitcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcilcXG4re1xcbitcXHRGSUxFICpmcCA9IGZvcGVuKEFMTE9DSU5GT19QUk9DLCBcXFwiclxcXCIpO1xcbitcXHRjaGFyIGxpbmVbTUFYX0xJTkVfTEVOXTtcXG4rXFx0aW50IG1hdGNoZXM7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgcHJvY2ZzX2VudHJ5O1xcbitcXG4rXFx0aWYgKCFmcCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG9wZW4gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiIGZvciByZWFkaW5nXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcdH1cXG4rXFx0bWVtc2V0KHByb2Nmc19lbnRyaWVzLCAwLCBzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcXHUwMDI2XFx1MDAyNiBwcm9jZnNfZW50cmllcy1cXHUwMDNlY291bnQgXFx1MDAzYyBWRUNfTUFYX0VOVFJJRVMpIHtcXG4rXFx0XFx0Y2hhciBmaWxlbmFtZVtNQVhfTElORV9MRU5dO1xcbitcXHRcXHRjaGFyIGZ1bmN0aW9uW01BWF9MSU5FX0xFTl07XFxuK1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNnByb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xcbitcXHRcXHRtYXRjaGVzID0gc3NjYW5mKGxpbmUsIFxcXCIlbGx1ICVsbHUgJVteOl06JWxsdSBmdW5jOiVzXFxcIixcXG4rXFx0XFx0XFx0XFx0IFxcdTAwMjZwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyxcXG4rXFx0XFx0XFx0XFx0IFxcdTAwMjZwcm9jZnNfZW50cnkuY291bnRlci5jYWxscyxcXG4rXFx0XFx0XFx0XFx0IGZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHQgXFx1MDAyNnByb2Nmc19lbnRyeS50YWcubGluZW5vLFxcbitcXHRcXHRcXHRcXHQgZnVuY3Rpb24pO1xcbitcXG4rXFx0XFx0aWYgKG1hdGNoZXMgIT0gNSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5maWxlbmFtZSwgZmlsZW5hbWUpO1xcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbiwgZnVuY3Rpb24pO1xcbitcXG4rXFx0XFx0aWYgKGZpbHRlci1cXHUwMDNlbWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkge1xcbitcXHRcXHRcXHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHQgICAgZmlsdGVyLVxcdTAwM2VmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHtcXG4rXFx0XFx0XFx0aWYgKHN0cm5jbXAocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbixcXG4rXFx0XFx0XFx0XFx0ICAgIGZpbHRlci1cXHUwMDNlZmllbGRzLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xcbitcXHRcXHRcXHRpZiAocHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8gIT0gZmlsdGVyLVxcdTAwM2VmaWVsZHMubGluZW5vKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcXHUwMDNjIGZpbHRlci1cXHUwMDNlbWluX3NpemUpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIHtcXG4rXFx0XFx0XFx0aWYgKHByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzIFxcdTAwM2UgZmlsdGVyLVxcdTAwM2VtYXhfc2l6ZSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdG1lbWNweShcXHUwMDI2cHJvY2ZzX2VudHJpZXMtXFx1MDAzZXRhZ1twcm9jZnNfZW50cmllcy1cXHUwMDNlY291bnQrK10sIFxcdTAwMjZwcm9jZnNfZW50cnksXFxuK1xcdFxcdCAgICAgICBzaXplb2YocHJvY2ZzX2VudHJ5KSk7XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBlbnVtIGlvY3RsX3JldCBnZXRfZmlsdGVyZWRfaW9jdGxfZW50cmllcyhzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBfX3U2NCBzdGFydF9wb3MpXFxuK3tcXG4rXFx0aW50IGZkID0gb3BlbihBTExPQ0lORk9fUFJPQywgT19SRE9OTFkpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG9wZW4gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiIGZvciBJT0NUTFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBJT0NUTF9GQUlMVVJFO1xcbitcXHR9XFxuK1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IGdldF9hdF9wYXJhbXM7XFxuK1xcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xcbitcXHRpbnQgcmV0cnlfY291bnQgPSAwO1xcbitcXHRpbnQgc3RhdHVzO1xcbitcXG4rXFx0LypcXG4rXFx0ICogX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGlmIGEga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkXFxuK1xcdCAqIGJldHdlZW4gdGhlIHR3byBjYWxscy4gSWYgdGhhdCBoYXBwZW5zLCB0aGUgZGF0YSBnYXRoZXJlZCBjYW5ub3QgYmUgY29uc2lkZXJlZCBjb25zaXN0ZW50XFxuK1xcdCAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBmZXRjaGVkIGFnYWluIHRvIGF2b2lkIGZsYWtpbmVzcy5cXG4rXFx0ICovXFxuK1xcdGRvIHtcXG4rXFx0XFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0bWVtc2V0KHRhZ3MsIDAsIHNpemVvZigqdGFncykpO1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNmdldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2Z2V0X2F0X3BhcmFtcy5maWx0ZXIsIGZpbHRlciwgc2l6ZW9mKCpmaWx0ZXIpKTtcXG4rXFx0XFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XFxuK1xcdFxcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFxcdTAwMjZnZXRfYXRfcGFyYW1zKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiYWxsb2NpbmZvX2dldF9hdCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRtZW1jcHkoXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudCsrXSwgXFx1MDAyNmdldF9hdF9wYXJhbXMuZGF0YSwgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xcbitcXG4rXFx0XFx0d2hpbGUgKHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudF0pID09IDApXFxuK1xcdFxcdFxcdHRhZ3MtXFx1MDAzZWNvdW50Kys7XFxuK1xcbitcXHRcXHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFxcdTAwMjZlbmRfY29udF9pZCkpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQpIHtcXG4rXFx0XFx0XFx0c3RhdHVzID0gSU9DVExfU1VDQ0VTUztcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBtaXNtYXRjaCwgcmV0cnlpbmcuLi5cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9JTlZBTElEX0RBVEE7XFxuK1xcdFxcdH1cXG4rXFx0fSB3aGlsZSAoc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSBcXHUwMDI2XFx1MDAyNiByZXRyeV9jb3VudCsrIFxcdTAwM2MgbWF4X3JldHJpZXMpO1xcbitcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gc3RhdHVzO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ1bl9maWx0ZXJfdGVzdChjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxcbit7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xcbitcXHRpbnQgaW9jdGxfc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xcbitcXG4rXFx0aWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcXFwiIEFMTE9DSU5GT19QUk9DIFxcXCJcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX1NLSVA7XFxuK1xcdFxcdGdvdG8gZXhpdDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCA9PSAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBlbnRyaWVzIGZvdW5kIGluIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIiwgc2tpcHBpbmcgdGVzdFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpb2N0bF9zdGF0dXMgPSBnZXRfZmlsdGVyZWRfaW9jdGxfZW50cmllcyh0YWdzLCBmaWx0ZXIsIDApO1xcbitcXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiVHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFxuK2V4aXQ6XFxuK1xcdGZyZWUodGFncyk7XFxuK1xcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHRlc3RfZmlsZW5hbWVfZmlsdGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xcbitcXHRjb25zdCBjaGFyICp0YXJnZXRfZmlsZW5hbWUgPSBcXFwibW0vbWVtb3J5LmNcXFwiO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FO1xcbitcXHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZmlsZW5hbWUsIHRhcmdldF9maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXFx1MDAyNmZpbHRlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9mdW5jdGlvbl9maWx0ZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XFxuK1xcdGNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9IFxcXCJkdXBfbW1cXFwiO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OO1xcbitcXHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXFx1MDAyNmZpbHRlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9zaXplX2ZpbHRlcih2b2lkKVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0aW50IHJldCA9IEtTRlRfUEFTUztcXG4rXFx0X191NjQgdGFyZ2V0X3NpemUsIGksIHBvcztcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZm91bmRfdGFnID0gTlVMTDtcXG4rXFx0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXFxcImRvX2luaXRfbW9kdWxlXFxcIjtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xcbitcXHRpbnQgcmV0cnkgPSAwO1xcbitcXHRjb25zdCBpbnQgbWF4X3JldHJpZXMgPSAxMDtcXG4rXFxuK1xcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdFxcdGdvdG8gZnJlZW1lbTtcXG4rXFx0fVxcbitcXG4rXFx0ZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkZhaWxlZCB0byBvcGVuIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIjogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBmcmVlbWVtO1xcbitcXHR9XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdGZvdW5kX3RhZyA9IE5VTEw7XFxuK1xcdFxcdHBvcyA9IDA7XFxuK1xcbitcXHRcXHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFxcdTAwMjZzdGFydF9jb250X2lkKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xcbitcXHRcXHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047XFxuK1xcdFxcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgXFx1MDAyNmZpbHRlcikpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkVycm9yIHJldHJpZXZpbmcgZW50cmllcyBmcm9tIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAocHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50ID09IDApIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcXFxcblxcXCIsIHRhcmdldF9mdW5jdGlvbik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHR0YXJnZXRfc2l6ZSA9IHByb2Nmc19lbnRyaWVzLVxcdTAwM2V0YWdbMF0uY291bnRlci5ieXRlcztcXG4rXFxuK1xcdFxcdG1lbXNldChcXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XFxuK1xcdFxcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSB8IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRTtcXG4rXFx0XFx0ZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7XFxuK1xcdFxcdGZpbHRlci5tYXhfc2l6ZSA9IHRhcmdldF9zaXplO1xcbitcXG4rXFx0XFx0d2hpbGUgKDEpIHtcXG4rXFx0XFx0XFx0c3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtcztcXG4rXFxuK1xcdFxcdFxcdG1lbXNldChcXHUwMDI2Z2V0X2F0X3BhcmFtcywgMCwgc2l6ZW9mKGdldF9hdF9wYXJhbXMpKTtcXG4rXFx0XFx0XFx0bWVtY3B5KFxcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXFx1MDAyNmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpO1xcbitcXHRcXHRcXHRnZXRfYXRfcGFyYW1zLnBvcyA9IHBvcztcXG4rXFxuK1xcdFxcdFxcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFxcdTAwMjZnZXRfYXRfcGFyYW1zKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcbitcXHRcXHRcXHR0YWdzLVxcdTAwM2Vjb3VudCA9IDA7XFxuK1xcdFxcdFxcdG1lbWNweShcXHUwMDI2dGFncy1cXHUwMDNldGFnW3RhZ3MtXFx1MDAzZWNvdW50KytdLCBcXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxcbitcXHRcXHRcXHQgICAgICAgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xcbitcXG4rXFx0XFx0XFx0d2hpbGUgKHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudF0pID09IDApXFxuK1xcdFxcdFxcdFxcdHRhZ3MtXFx1MDAzZWNvdW50Kys7XFxuK1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFncy1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAoc3RyY21wKHRhZ3MtXFx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xcbitcXHRcXHRcXHRcXHRcXHRmb3VuZF90YWcgPSBcXHUwMDI2dGFncy1cXHUwMDNldGFnW2ldO1xcbitcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRpZiAoZm91bmRfdGFnIHx8IHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdFxcdHBvcyArPSB0YWdzLVxcdTAwM2Vjb3VudDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJhbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJNb2R1bGUgbG9hZCBkZXRlY3RlZCBkdXJpbmcgc2l6ZSB2ZXJpZmljYXRpb24sIHJldHJ5aW5nLi4uXFxcXG5cXFwiKTtcXG4rXFx0fSB3aGlsZSAocmV0cnkrKyBcXHUwMDNjIG1heF9yZXRyaWVzKTtcXG4rXFxuK1xcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkIFxcdTAwMjZcXHUwMDI2ICFmb3VuZF90YWcpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkVudHJ5IHdpdGggZnVuY3Rpb24gJXMgbm90IGZvdW5kIGluIElPQ1RMIHJlc3VsdHNcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICB0YXJnZXRfZnVuY3Rpb24pO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH0gZWxzZSBpZiAoc3RhcnRfY29udF9pZC5pZCAhPSBlbmRfY29udF9pZC5pZCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG1hdGNoIGNvbnRlbnRfaWRzIGZvciBwcm9jZnMgYW5kIElPQ1RMLCBza2lwcGluZy4uLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0fSBlbHNlIGlmIChmb3VuZF90YWcgXFx1MDAyNlxcdTAwMjYgZm91bmRfdGFnLVxcdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHRhcmdldF9zaXplKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJJT0NUTCBlbnRyeSBzaXplICVsbHUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IHNpemUgJWxsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGZvdW5kX3RhZy1cXHUwMDNlY291bnRlci5ieXRlcywgdGFyZ2V0X3NpemUpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH1cXG4rXFxuK2V4aXQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rZnJlZW1lbTpcXG4rXFx0ZnJlZSh0YWdzKTtcXG4rXFx0ZnJlZShwcm9jZnNfZW50cmllcyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9saW5lbm9fZmlsdGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0ZW51bSBpb2N0bF9yZXQgaW9jdGxfc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xcbitcXHRfX3U2NCB0YXJnZXRfbGluZW5vLCBpO1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YXJnZXRfdGFnO1xcbitcXHRib29sIGZvdW5kID0gZmFsc2U7XFxuK1xcbitcXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XFxuK1xcbitcXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBcXHUwMDI2ZmlsdGVyKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9TS0lQO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFx0aWYgKHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCA9PSAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb3VsZCBub3QgcmV0cmlldmUgcHJvY2ZzIGVudHJpZXNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX1NLSVA7XFxuK1xcdFxcdGdvdG8gZXhpdDtcXG4rXFx0fVxcbitcXHQvKlxcbitcXHQgKiBXZSBkZXBlbmQgb24gdGhlIHByb2NmcyByZXN1bHRzIHRvIGRldGVybWluZSB0aGUgbGluZSBudW1iZXIgZm9yIHRoZSBmaWx0ZXIgYmVmb3JlXFxuK1xcdCAqIG1ha2luZyB0aGUgaW9jdGwgcXVlcnkuIEhlbmNlLCB3ZSBjYW5ub3QgcmV1c2UgcnVuX2ZpbHRlcl90ZXN0IGhlcmUuXFxuK1xcdCAqL1xcbitcXHR0YXJnZXRfdGFnID0gXFx1MDAyNnByb2Nmc19lbnRyaWVzLVxcdTAwM2V0YWdbMF07XFxuK1xcdHRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLVxcdTAwM2V0YWcubGluZW5vO1xcbitcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTztcXG4rXFx0ZmlsdGVyLmZpZWxkcy5saW5lbm8gPSB0YXJnZXRfbGluZW5vO1xcbitcXG4rXFx0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXFx1MDAyNmZpbHRlciwgMCk7XFxuK1xcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJUcm91YmxlIHJldHJpZXZpbmcgdmFsaWQgSU9DVEwgZW50cmllcywgc2tpcHBpbmcuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9TS0lQO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFx0aWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9GQUlMVVJFKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0YWdzLVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdGlmICh0YWdzLVxcdTAwM2V0YWdbaV0udGFnLmxpbmVubyAhPSB0YXJnZXRfbGluZW5vKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgaSwgdGFncy1cXHUwMDNldGFnW2ldLnRhZy5saW5lbm8pO1xcbitcXHRcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHN0cm5jbXAodGFncy1cXHUwMDNldGFnW2ldLnRhZy5mdW5jdGlvbiwgdGFyZ2V0X3RhZy1cXHUwMDNldGFnLmZ1bmN0aW9uLFxcbitcXHRcXHRcXHQgICAgQUxMT0NJTkZPX1NUUl9TSVpFKSA9PSAwIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBzdHJuY21wKHRhZ3MtXFx1MDAzZXRhZ1tpXS50YWcuZmlsZW5hbWUsIHRhcmdldF90YWctXFx1MDAzZXRhZy5maWxlbmFtZSxcXG4rXFx0XFx0XFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMClcXG4rXFx0XFx0XFx0Zm91bmQgPSB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIWZvdW5kKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJPcmlnaW5hbCBwcm9jZnMgZW50cnkgbm90IGZvdW5kIGluIElPQ1RMIGxpbmVubyBmaWx0ZXIgcmVzdWx0cy5cXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH1cXG4rXFxuK2V4aXQ6XFxuK1xcdGZyZWUodGFncyk7XFxuK1xcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKDQpO1xcbitcXG4rXFx0cmV0ID0gdGVzdF9maWxlbmFtZV9maWx0ZXIoKTtcXG4rXFx0aWYgKHJldCA9PSBLU0ZUX1NLSVApXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiU2tpcHBpbmcgdGVzdF9maWxlbmFtZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXFxcInRlc3RfZmlsZW5hbWVfZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHJldCA9IHRlc3RfZnVuY3Rpb25fZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3RfZnVuY3Rpb25fZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFxcXCJ0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcXFxuXFxcIik7XFxuK1xcbitcXHRyZXQgPSB0ZXN0X3NpemVfZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3Rfc2l6ZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXFxcInRlc3Rfc2l6ZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXG4rXFx0cmV0ID0gdGVzdF9saW5lbm9fZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3RfbGluZW5vX2ZpbHRlclxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcXFwidGVzdF9saW5lbm9fZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDowNS42MzU4OTU0NzFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwMDI0NjA3MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdWwgOSAxMTo1MDowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuQEAgLTQ2LDYgKzQ2LDExIEBAIHN5c2N0bDpcbiBSdW50aW1lIGluZm86XG4gICAvcHJvYy9hbGxvY2luZm9cbiBcbisgIFByb2ZpbGluZyBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZWl0aGVyIGJ5IHJlYWRpbmcgYC9wcm9jL2FsbG9jaW5mb2AgZGlyZWN0bHkgYXNcbisgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VgLlxuKyAgVGhlIGlvY3RsIGludGVyZmFjZSBzdXBwb3J0cyBzdHJ1Y3R1cmVkIGJpbmFyeSBkYXRhIGV4dHJhY3Rpb24gYXMgd2VsbCBhcyBmaWx0ZXJpbmdcbisgIGJ5IG1vZHVsZSBuYW1lLCBmdW5jdGlvbiwgZmlsZSwgbGluZSBudW1iZXIsIGFjY3VyYWN5LCBvciBhbGxvY2F0aW9uIHNpemUgbGltaXRzLlxuK1xuIEV4YW1wbGUgb3V0cHV0OjpcbiBcbiAgIHJvb3RAbW9yaWEta3ZtOn4jIHNvcnQgLWcgL3Byb2MvYWxsb2NpbmZvfHRhaWx8bnVtZm10IC0tdG89aWVjXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XG5AQCAtMzQ2LDYgKzM0Niw4IEBAIENvZGUgIFNlcSMgICAgSW5jbHVkZSBGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbVx1MDAzZVxuIDB4QTUgIDIwLTJGICBsaW51eC9zdXJmYWNlX2FnZ3JlZ2F0b3IvZHR4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFN1cmZhY2UgRFRYIGRyaXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXHUwMDNlXG4rMHhBNiAgMDAtMEYgIHVhcGkvbGludXgvYWxsb2NfdGFnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmdcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbVx1MDAzZVxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcbiAweEFCICAwMC0xRiAgbGludXgvbmJkLmhcbiAweEFDICAwMC0xRiAgbGludXgvcmF3LmhcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCBkMTk4MjJkNTc0ZmQ0OC4uM2Q1NGZkOGQ2OWMxYzYgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC0xNjkzNiw3ICsxNjkzNiw5IEBAIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4gRjpcdGluY2x1ZGUvbGludXgvYWxsb2NfdGFnLmhcbiBGOlx0aW5jbHVkZS9saW51eC9wZ2FsbG9jX3RhZy5oXG4rRjpcdGluY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxuIEY6XHRtbS9hbGxvY190YWcuY1xuK0Y6XHR0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvXG4gXG4gTUVNT1JZIE1BTkFHRU1FTlQgLSBCQUxMT09OXG4gTTpcdEFuZHJldyBNb3J0b24gXHUwMDNjYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZ1x1MDAzZVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcbmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxuQEAgLTc3LDYgKzc3LDggQEAgc3RydWN0IGNvZGV0YWdfaXRlcmF0b3Ige1xuIHZvaWQgY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gYm9vbCBjb2RldGFnX3RyeWxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcbiB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4rdW5zaWduZWQgbG9uZyBjb2RldGFnX2dldF9jb250ZW50X2lkKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4rdW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIHN0cnVjdCBjb2RldGFnICpjb2RldGFnX25leHRfY3Qoc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgKml0ZXIpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG5AQCAtMCwwICsxLDk5IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi9cbisvKlxuKyAqIGFsbG9jX3RhZyBJT0NUTCBBUEkgZGVmaW5pdGlvblxuKyAqXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEdvb2dsZSwgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbisgKlxuKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4rICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXNcbisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi5cbisgKi9cbitcbisjaWZuZGVmIF9VQVBJX0FMTE9DX1RBR19IXG4rI2RlZmluZSBfVUFQSV9BTExPQ19UQUdfSFxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisvKlxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xuKyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuKyAqL1xuKyNkZWZpbmUgQUxMT0NJTkZPX1NUUl9TSVpFXHQ2NFxuK1xuK3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7XG4rXHRfX3U2NCBpZDtcbit9O1xuK1xuK3N0cnVjdCBhbGxvY2luZm9fdGFnIHtcbitcdC8qIExvbmdlciBuYW1lcyBhcmUgdHJpbW1lZCAqL1xuK1x0Y2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRjaGFyIGZ1bmN0aW9uW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRjaGFyIGZpbGVuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRfX3U2NCBsaW5lbm87XG4rXHQvKiBmaWx0ZXIgY3JpdGVyaWEgb25seTsgc2VlIGFsbG9jaW5mb19jb3VudGVyLmFjY3VyYXRlIGZvciBhY3R1YWwgYWNjdXJhY3kgKi9cbitcdF9fdTY0IGluYWNjdXJhdGU7XG4rfTtcbitcbisvKiBUaGUgYWxpZ25tZW50IGVuc3VyZXMgMzItYml0IGNvbXBhdGlibGUgaW50ZXJmYWNlcyBhcmUgbm90IGJyb2tlbiAqL1xuK3N0cnVjdCBhbGxvY2luZm9fY291bnRlciB7XG4rXHRfX3U2NCBieXRlcztcbitcdF9fdTY0IGNhbGxzO1xuK1x0X191OCBhY2N1cmF0ZTtcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcbitzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHtcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnIHRhZztcbitcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xuK307XG4rXG4rZW51bSB7XG4rXHRBTExPQ0lORk9fRklMVEVSX01PRE5BTUUsXG4rXHRBTExPQ0lORk9fRklMVEVSX0ZVTkNUSU9OLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcbitcdEFMTE9DSU5GT19GSUxURVJfTElORU5PLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcbitcdEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUsXG4rXHRfX0FMTE9DSU5GT19GSUxURVJfTEFTVCA9IEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkVcbit9O1xuK1xuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSlcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTilcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSlcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk9cdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTElORU5PKVxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTUlOX1NJWkUpXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUpXG4rXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tTIFxcXG4rXHQoKDEgXHUwMDNjXHUwMDNjIChfX0FMTE9DSU5GT19GSUxURVJfTEFTVCArIDEpKSAtIDEpXG4rXG4rc3RydWN0IGFsbG9jaW5mb19maWx0ZXIge1xuK1x0X191NjQgbWFzazsgLyogYml0bWFzayBvZiB0aGUgZmlsdGVyIGZpZWxkcyB1c2VkICovXG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7XG4rXHRfX3U2NCBtaW5fc2l6ZTtcbitcdF9fdTY0IG1heF9zaXplO1xuK307XG4rXG4rc3RydWN0IGFsbG9jaW5mb19nZXRfYXQge1xuK1x0LyogaW5wdXRzICovXG4rXHRfX3U2NCBwb3M7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4rXHQvKiBvdXRwdXQgKi9cbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgZGF0YTtcbit9O1xuK1xuKyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfQ09OVEVOVF9JRFx0MFxuKyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX0FUXHRcdDFcbisjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9ORVhUXHRcdDJcbitcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRVx0XHQweEE2XG4rI2RlZmluZSBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSURcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELFx0XFxcbitcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQpXG4rI2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9BVFx0XHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcdFxcXG4rXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0KVxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFx0XHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsXHRcXFxuK1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXG4rXG4rI2VuZGlmIC8qIF9VQVBJX0FMTE9DX1RBR19IICovXG5kaWZmIC0tZ2l0IGEvbGliL2NvZGV0YWcuYyBiL2xpYi9jb2RldGFnLmNcbmluZGV4IDQwMDFhN2VhNjY3NTQyLi5hOWNkYTRjOTYyYTMwMyAxMDA2NDRcbi0tLSBhL2xpYi9jb2RldGFnLmNcbisrKyBiL2xpYi9jb2RldGFnLmNcbkBAIC0xOSw2ICsxOSw4IEBAIHN0cnVjdCBjb2RldGFnX3R5cGUge1xuIFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XG4gXHQvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgbmV4dF9tb2Rfc2VxO1xuK1x0LyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi9cbitcdHVuc2lnbmVkIGxvbmcgY29udGVudF9pZDtcbiB9O1xuIFxuIHN0cnVjdCBjb2RldGFnX3JhbmdlIHtcbkBAIC01MCw2ICs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiBcdHVwX3JlYWQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiB9XG4gXG4rdW5zaWduZWQgbG9uZyBjb2RldGFnX2dldF9jb250ZW50X2lkKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4rXG4rXHRyZXR1cm4gY3R0eXBlLVx1MDAzZWNvbnRlbnRfaWQ7XG4rfVxuK1xuK3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuK1xuK1x0cmV0dXJuIGN0dHlwZS1cdTAwM2Vjb3VudDtcbit9XG4rXG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4ge1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlciA9IHtcbkBAIC0yMDQsNiArMjIwLDcgQEAgc3RhdGljIGludCBjb2RldGFnX21vZHVsZV9pbml0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSwgc3RydWN0IG1vZHVsZSAqbW9kKVxuIFxuIFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIFx0Y21vZC1cdTAwM2Vtb2Rfc2VxID0gKytjdHR5cGUtXHUwMDNlbmV4dF9tb2Rfc2VxO1xuK1x0KytjdHR5cGUtXHUwMDNlY29udGVudF9pZDtcbiBcdG1vZF9pZCA9IGlkcl9hbGxvYyhcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7XG4gXHRpZiAobW9kX2lkIFx1MDAzZT0gMCkge1xuIFx0XHRpZiAoY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX2xvYWQpIHtcbkBAIC0zNjgsNiArMzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuIFx0XHRcdGN0dHlwZS1cdTAwM2Vjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgXHUwMDI2Y21vZC1cdTAwM2VyYW5nZSk7XG4gXHRcdFx0aWRyX3JlbW92ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcbiBcdFx0XHRrZnJlZShjbW9kKTtcbitcdFx0XHQrK2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0XHR9XG4gXHRcdHVwX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gXHRcdGlmIChmb3VuZCBcdTAwMjZcdTAwMjYgY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCBjZjY1ZTk5OTJmZGEzMy4uMmM4MTlmYTllYWZhZDAgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuKysrIGIvbW0vYWxsb2NfdGFnLmNcbkBAIC01LDYgKzUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgva2FsbHN5bXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VfZXh0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wZ2FsbG9jX3RhZy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHJvY19mcy5oXHUwMDNlXG5AQCAtMTQsNiArMTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19jaG9pY2VzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bWFsbG9jLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rbWVtbGVhay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdWFwaS9saW51eC9hbGxvY190YWcuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJwYWdlX2FsbG9jLmhcIlxuQEAgLTUwLDYgKzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyO1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcbiBcdGJvb2wgcHJpbnRfaGVhZGVyO1xuK1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuK1x0LyogaW9jdGwgdXNlcyBhIHNlcGFyYXRlIGl0ZXJhdG9yIG5vdCB0byBpbnRlcmZlcmUgd2l0aCByZWFkcyAqL1xuK1x0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjtcbitcdGJvb2wgcG9zaXRpb25lZDsgLyogc2VxX29wZW5fcHJpdmF0ZSgpIHNldHMgdG8gMCAqL1xuK1x0c3RydWN0IG11dGV4IGlvY3RsX2xvY2s7XG4gfTtcbiBcbiBzdGF0aWMgdm9pZCAqYWxsb2NpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpXG5AQCAtMTMzLDYgKzE0MCwzNDAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhbGxvY2luZm9fc2VxX29wID0ge1xuIFx0LnNob3dcdD0gYWxsb2NpbmZvX3Nob3csXG4gfTtcbiBcbisvKlxuKyAqIEluaXRpYWxpemVzIHNlcV9maWxlIG9wZXJhdGlvbnMgYW5kIGFsbG9jYXRlcyBwcml2YXRlIHN0YXRlIHdoZW4gb3BlbmluZ1xuKyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxuKyAqL1xuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbitcdFx0XHQgICAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSkpO1xuK1x0aWYgKCFyZXQpIHtcbitcdFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdiA9IG0tXHUwMDNlcHJpdmF0ZTtcbitcbitcdFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLypcbisgKiBDbGVhbnMgdXAgdGhlIHNlcV9maWxlIHN0YXRlIGFuZCBmcmVlcyB1cCB0aGUgcHJpdmF0ZSBzdGF0ZSBhbGxvY2F0ZWQgaW5cbisgKiBhbGxvY2luZm9fb3BlbigpIHdoZW4gY2xvc2luZyB0aGUgL3Byb2MvYWxsb2NpbmZvIGZpbGUgZGVzY3JpcHRvci5cbisgKi9cbitzdGF0aWMgaW50IGFsbG9jaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuK3tcbitcdHN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuK1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0bXV0ZXhfZGVzdHJveShcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1x0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xuK31cbitcbisvKlxuKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc28gdGhhdCBpdHMgbGVuZ3RoIGZpdHMgd2l0aGluXG4rICogQUxMT0NJTkZPX1NUUl9TSVpFLCBwcmVzZXJ2aW5nIHRoZSB0cmFpbGluZyBjaGFyYWN0ZXJzLlxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xuKyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cilcbit7XG4rXHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4rXG4rXHQvKiBLZWVwIGFuIGV4dHJhIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgTlVMTC4gKi9cbitcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4rXHRcdHN0ciArPSAobGVuIC0gQUxMT0NJTkZPX1NUUl9TSVpFKSArIDE7XG4rXHRyZXR1cm4gc3RyO1xuK31cbitcbisvKiBDb3B5IGEgc3RyaW5nIGFuZCB0cmltIGZyb20gdGhlIGJlZ2lubmluZyBpZiBpdCdzIHRvbyBsb25nICovXG4rc3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbit7XG4rXHRzdHJzY3B5X3BhZChkZXN0LCBhbGxvY2luZm9fc3RyKHNyYyksIEFMTE9DSU5GT19TVFJfU0laRSk7XG4rfVxuK1xuKy8qIENvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIG9ubHkgY29uc2lkZXIgdGhlIHRyaW1tZWQgc3VmZml4IGlmIHMxIGlzIHRvbyBsb25nICovXG4rc3RhdGljIGludCBhbGxvY2luZm9fY21wX3N0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlKVxuK3tcbitcdHJldHVybiBzdHJuY21wKGFsbG9jaW5mb19zdHIoc3RyKSwgdGVtcGxhdGUsIEFMTE9DSU5GT19TVFJfU0laRSk7XG4rfVxuK1xuKy8qIEZldGNoIHRoZSBwZXItQ1BVIGNvdW50ZXJzICovXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXG4re1xuK1x0cmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuK31cbitcbisvKlxuKyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWVcbisgKiBwcm9maWxpbmcgY291bnRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIGtlcm5lbCBjb2RldGFnLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuK1x0XHRcdFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZGF0YSxcbitcdFx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgKmNvdW50ZXJzKVxuK3tcbitcdGlmIChjdC1cdTAwM2Vtb2RuYW1lKVxuK1x0XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcubW9kbmFtZSwgY3QtXHUwMDNlbW9kbmFtZSk7XG4rXHRlbHNlXG4rXHRcdGRhdGEtXHUwMDNldGFnLm1vZG5hbWVbMF0gPSAnXFwwJztcbitcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVx1MDAzZXRhZy5mdW5jdGlvbiwgY3QtXHUwMDNlZnVuY3Rpb24pO1xuK1x0YWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtXHUwMDNldGFnLmZpbGVuYW1lLCBjdC1cdTAwM2VmaWxlbmFtZSk7XG4rXHRkYXRhLVx1MDAzZXRhZy5saW5lbm8gPSBjdC1cdTAwM2VsaW5lbm87XG4rXHRkYXRhLVx1MDAzZWNvdW50ZXIuYnl0ZXMgPSBjb3VudGVycy1cdTAwM2VieXRlcztcbitcdGRhdGEtXHUwMDNlY291bnRlci5jYWxscyA9IGNvdW50ZXJzLVx1MDAzZWNhbGxzO1xuK1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuK31cbitcbisvKlxuKyAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGNvbnRlbnQgSUQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gdGFnIG1vZHVsZVxuKyAqIGxheW91dCwgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIGRldGVjdCBpZiBtb2R1bGVzIHdlcmUgbG9hZGVkIC8gdW5sb2FkZWQuXG4rICovXG4rc3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBwYXJhbXM7XG4rXG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2cGFyYW1zLCBzaXplb2YocGFyYW1zKSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XG4rICogbWF0Y2hpbmcgaXRzIGNoYXJhY3RlcmlzdGljcyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuKyAqL1xuK3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbitcdFx0XHQgICBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzICpjb3VudGVycyxcbitcdFx0XHQgICBib29sICpmZXRjaGVkX2NvdW50ZXJzKVxuK3tcbitcdGJvb2wgaW5hY2N1cmF0ZTtcbitcbitcdGlmICghZmlsdGVyIHx8ICFmaWx0ZXItXHUwMDNlbWFzaylcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FKSB7XG4rXHRcdC8qIHVzZXIgd2FudHMgdG8gZmlsdGVyIGJ5IG1vZG5hbWUgYnV0IGN0LVx1MDAzZW1vZG5hbWUgaXMgTlVMTCAqL1xuK1x0XHRpZiAoIWN0LVx1MDAzZW1vZG5hbWUpIHtcbitcdFx0XHQvKiB2YWxpZGF0ZSBpZiB1c2VyIHdhcyBhdHRlbXB0aW5nIHRvIGZpbHRlciBmb3IgYnVpbHQtaW4gYWxsb2NhdGlvbnMgKi9cbitcdFx0XHRpZiAoZmlsdGVyLVx1MDAzZWZpZWxkcy5tb2RuYW1lWzBdICE9ICdcXDAnKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9IGVsc2UgaWYgKGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZW1vZG5hbWUsIGZpbHRlci1cdTAwM2VmaWVsZHMubW9kbmFtZSkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcdTAwMjZcdTAwMjZcbitcdCAgICBjdC1cdTAwM2VmdW5jdGlvbiBcdTAwMjZcdTAwMjYgYWxsb2NpbmZvX2NtcF9zdHIoY3QtXHUwMDNlZnVuY3Rpb24sIGZpbHRlci1cdTAwM2VmaWVsZHMuZnVuY3Rpb24pKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAoKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGN0LVx1MDAzZWZpbGVuYW1lIFx1MDAyNlx1MDAyNiBhbGxvY2luZm9fY21wX3N0cihjdC1cdTAwM2VmaWxlbmFtZSwgZmlsdGVyLVx1MDAzZWZpZWxkcy5maWxlbmFtZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8pIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGN0LVx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xuK1x0XHRpbmFjY3VyYXRlID0gISEoY3QtXHUwMDNlZmxhZ3MgXHUwMDI2IENPREVUQUdfRkxBR19JTkFDQ1VSQVRFKTtcbitcdFx0aWYgKGluYWNjdXJhdGUgIT0gISEoZmlsdGVyLVx1MDAzZWZpZWxkcy5pbmFjY3VyYXRlKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7XG4rXHRcdGlmICghKmZldGNoZWRfY291bnRlcnMpIHtcbitcdFx0XHQqY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRcdCpmZXRjaGVkX2NvdW50ZXJzID0gdHJ1ZTtcbitcdFx0fVxuK1x0XHRpZiAoKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgY291bnRlcnMtXHUwMDNlYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjb3VudGVycy1cdTAwM2VieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdHJldHVybiB0cnVlO1xuK31cbitcbisvKlxuKyAqIFNlZWtzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgc3BlY2lmaWVkIDAtaW5kZXhlZCB0YWcgcG9zaXRpb24sIHJlYWRzIGl0c1xuKyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cbisgKi9cbitzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdjtcbitcdHN0cnVjdCBjb2RldGFnICpjdDtcbitcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcbitcdF9fdTY0IHNraXBfY291bnQ7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXJzO1xuK1x0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xuK1xuK1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnBhcmFtcywgYXJnLCBzaXplb2YocGFyYW1zKSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0aWYgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgfkFMTE9DSU5GT19GSUxURVJfTUFTS1MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKChwYXJhbXMuZmlsdGVyLm1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbitcdCAgICBwYXJhbXMuZmlsdGVyLm1pbl9zaXplIFx1MDAzZSBwYXJhbXMuZmlsdGVyLm1heF9zaXplKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXG4rXHRpZiAocGFyYW1zLnBvcyBcdTAwM2U9IGNvZGV0YWdfZ2V0X2NvdW50KGFsbG9jX3RhZ19jdHR5cGUpKSB7XG4rXHRcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRza2lwX2NvdW50ID0gcGFyYW1zLnBvcztcbitcbitcdGlmIChwYXJhbXMuZmlsdGVyLm1hc2spXG4rXHRcdHByaXYtXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcbitcdGVsc2VcbitcdFx0cHJpdi1cdTAwM2VmaWx0ZXIubWFzayA9IDA7XG4rXG4rXHQvKiBGaW5kIHRoZSBjb2RldGFnICovXG4rXHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcbitcdHdoaWxlIChjdCkge1xuK1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4rXHRcdGlmIChtYXRjaGVzX2ZpbHRlcihjdCwgXHUwMDI2cHJpdi1cdTAwM2VmaWx0ZXIsIFx1MDAyNmNvdW50ZXJzLCBcdTAwMjZmZXRjaGVkX2NvdW50ZXJzKSkge1xuK1x0XHRcdGlmIChza2lwX2NvdW50ID09IDApXG4rXHRcdFx0XHRicmVhaztcbitcdFx0XHRza2lwX2NvdW50LS07XG4rXHRcdH1cbitcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdH1cbitcbitcdGlmIChjdCkge1xuK1x0XHRpZiAoIWZldGNoZWRfY291bnRlcnMpXG4rXHRcdFx0Y291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMuZGF0YSwgXHUwMDI2Y291bnRlcnMpO1xuK1x0XHRwcml2LVx1MDAzZXBvc2l0aW9uZWQgPSB0cnVlO1xuK1x0fVxuK1xuK1x0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbitcbitcdGlmICghY3QpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFx1MDAyNnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIEFkdmFuY2VzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIHRhZyBpbiB0aGUgc2VxdWVuY2UgYW5kXG4rICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLlxuKyAqL1xuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcbit7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXY7XG4rXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtcztcbitcdGludCByZXQgPSAwO1xuK1x0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcbitcdGJvb2wgZmV0Y2hlZF9jb3VudGVycztcbitcbitcdG1lbXNldChcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcbitcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXG4rXHRpZiAoIXByaXYtXHUwMDNlcG9zaXRpb25lZCkge1xuK1x0XHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0XHRwcml2LVx1MDAzZXBvc2l0aW9uZWQgPSB0cnVlO1xuK1x0fVxuK1xuK1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdHdoaWxlIChjdCkge1xuK1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4rXHRcdGlmIChtYXRjaGVzX2ZpbHRlcihjdCwgXHUwMDI2cHJpdi1cdTAwM2VmaWx0ZXIsIFx1MDAyNmNvdW50ZXJzLCBcdTAwMjZmZXRjaGVkX2NvdW50ZXJzKSlcbitcdFx0XHRicmVhaztcbitcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdH1cbitcbitcdGlmIChjdCkge1xuK1x0XHRpZiAoIWZldGNoZWRfY291bnRlcnMpXG4rXHRcdFx0Y291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMsIFx1MDAyNmNvdW50ZXJzKTtcbitcdH1cbitcdGlmICghY3QpIHtcbitcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XG4rXHRcdHJldCA9IC1FTk9FTlQ7XG4rXHR9XG4rXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1xuK1x0aWYgKHJldCA9PSAwKSB7XG4rXHRcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbitcdH1cbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZVxuKyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy5cbisgKi9cbitzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4re1xuK1x0dm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKV9fYXJnO1xuK1x0aW50IHJldDtcbitcbitcdHN3aXRjaCAoY21kKSB7XG4rXHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcbitcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XG4rXHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxuK1x0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0ID0gLUVOT0lPQ1RMQ01EO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfQ09NUEFUXG4rc3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbitcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3tcbitcdHJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpO1xuK31cbisjZW5kaWZcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcbitcdC5wcm9jX29wZW5cdFx0PSBhbGxvY2luZm9fb3BlbixcbitcdC5wcm9jX3JlYWRfaXRlclx0XHQ9IHNlcV9yZWFkX2l0ZXIsXG4rXHQucHJvY19sc2Vla1x0XHQ9IHNlcV9sc2VlayxcbitcdC5wcm9jX3JlbGVhc2VcdFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcbitcdC5wcm9jX2lvY3RsXHRcdD0gYWxsb2NpbmZvX2lvY3RsLFxuKyNpZmRlZiBDT05GSUdfQ09NUEFUXG4rXHQucHJvY19jb21wYXRfaW9jdGxcdD0gYWxsb2NpbmZvX2NvbXBhdF9pb2N0bCxcbisjZW5kaWZcbit9O1xuK1xuIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKVxuIHtcbiBcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7XG5AQCAtOTg0LDggKzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKVxuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XG4rXHRpZiAoIXByb2NfY3JlYXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsIFx1MDAyNmFsbG9jaW5mb19wcm9jX29wcykpIHtcbiBcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGNyZWF0ZSAlcyBmaWxlXFxuXCIsIEFMTE9DSU5GT19GSUxFX05BTUUpO1xuIFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuaW5kZXggOGQ0ZGIyMjQxY2MyYTIuLjEyOTQxZDY4YTdmOGFlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtMSw1ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gVEFSR0VUUyArPSBhY2N0XG4rVEFSR0VUUyArPSBhbGxvY190YWdcbiBUQVJHRVRTICs9IGFsc2FcbiBUQVJHRVRTICs9IGFtZC1wc3RhdGVcbiBUQVJHRVRTICs9IGFybTY0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY0MWQ5MmQwNmIxODQ4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGVcbkBAIC0wLDAgKzEsOSBAQFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbitURVNUX0dFTl9QUk9HUyA6PSBhbGxvY2luZm9faW9jdGxfdGVzdFxuK1xuK0NGTEFHUyArPSAtV2FsbFxuK0NGTEFHUyArPSAkKEtIRFJfSU5DTFVERVMpXG4rXG4raW5jbHVkZSAuLi9saWIubWtcbitcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdkOTRhYmI3ODVhMTQ4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuY1xuQEAgLTAsMCArMSw1NDggQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rXG4rLyoga3NlbGZ0ZXN0IGZvciBhbGxvY2luZm8gaW9jdGxcbisgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBHb29nbGUsIEluYy5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hbGxvY190YWcuaFx1MDAzZVxuKyNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0LmhcIlxuK1xuKyNkZWZpbmUgTUFYX0xJTkVfTEVOXHRcdDUxMlxuKyNkZWZpbmUgQUxMT0NJTkZPX1BST0NcdFx0XCIvcHJvYy9hbGxvY2luZm9cIlxuK1xuK2VudW0gaW9jdGxfcmV0IHtcbitcdElPQ1RMX1NVQ0NFU1MgPSAwLFxuK1x0SU9DVExfRkFJTFVSRSA9IDEsXG4rXHRJT0NUTF9JTlZBTElEX0RBVEEgPSAyLFxuK307XG4rXG4rI2RlZmluZSBWRUNfTUFYX0VOVFJJRVMgMzJcbitcbitzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyB7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHRhZ1tWRUNfTUFYX0VOVFJJRVNdO1xuK1x0X191NjQgY291bnQ7XG4rfTtcbitcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcbit7XG4rXHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQsIHBhcmFtcyk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IF9fYWxsb2NpbmZvX2dldF9hdChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCAqcGFyYW1zKVxuK3tcbitcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfR0VUX0FULCBwYXJhbXMpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfbmV4dChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpwYXJhbXMpXG4re1xuK1x0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxuK1x0XHRcdGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKnRhZ19kYXRhLFxuK1x0XHRcdGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLFxuK1x0XHRcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4re1xuK1x0aWYgKG1hdGNoX2J5dGVzIFx1MDAyNlx1MDAyNiB0YWdfZGF0YS1cdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHByb2Nmc19lbnRyeS1cdTAwM2Vjb3VudGVyLmJ5dGVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwic2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cIik7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdGlmIChtYXRjaF9jYWxscyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXHUwMDNlY291bnRlci5jYWxscykge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcImNhbGwgY291bnQgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCIpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAobWF0Y2hfbGluZW5vIFx1MDAyNlx1MDAyNiB0YWdfZGF0YS1cdTAwM2V0YWcubGluZW5vICE9IHByb2Nmc19lbnRyeS1cdTAwM2V0YWcubGluZW5vKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwibGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcblwiKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKG1hdGNoX2Z1bmN0aW9uIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHN0cm5jbXAodGFnX2RhdGEtXHUwMDNldGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiZnVuY3Rpb24gcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCIpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAobWF0Y2hfZmlsZW5hbWUgXHUwMDI2XHUwMDI2XG4rXHQgICAgc3RybmNtcCh0YWdfZGF0YS1cdTAwM2V0YWcuZmlsZW5hbWUsIHByb2Nmc19lbnRyeS1cdTAwM2V0YWcuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJmaWxlbmFtZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cIik7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgYm9vbCBtYXRjaF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuK1x0XHRcdCAgYm9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXG4rXHRcdFx0ICBib29sIG1hdGNoX2Z1bmN0aW9uLCBib29sIG1hdGNoX2ZpbGVuYW1lKVxuK3tcbitcdF9fdTY0IGk7XG4rXG4rXHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgIT0gdGFncy1cdTAwM2Vjb3VudCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkVudHJ5IGNvdW50IG1pc21hdGNoLiBpb2N0bCBlbnRyaWVzOiAlbGx1LCBwcm9jIGVudHJpZXM6ICVsbHVcXG5cIixcbitcdFx0XHQgICAgICAgdGFncy1cdTAwM2Vjb3VudCwgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudDsgaSsrKSB7XG4rXHRcdGlmICghbWF0Y2hfZW50cnkoXHUwMDI2cHJvY2ZzX2VudHJpZXMtXHUwMDNldGFnW2ldLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1tpXSxcbitcdFx0XHRcdCBtYXRjaF9ieXRlcywgbWF0Y2hfY2FsbHMsIG1hdGNoX2xpbmVubyxcbitcdFx0XHRcdCBtYXRjaF9mdW5jdGlvbiwgbWF0Y2hfZmlsZW5hbWUpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCIlbGx1dGggZW50cnkgZG9lcyBub3QgbWF0Y2guXFxuXCIsIGkpO1xuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0fVxuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cilcbit7XG4rXHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4rXG4rXHRpZiAobGVuIFx1MDAzZT0gQUxMT0NJTkZPX1NUUl9TSVpFKVxuK1x0XHRzdHIgKz0gKGxlbiAtIEFMTE9DSU5GT19TVFJfU0laRSkgKyAxO1xuK1x0cmV0dXJuIHN0cjtcbit9XG4rXG4rc3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbit7XG4rXHRzdHJuY3B5KGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFIC0gMSk7XG4rXHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcbitcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxuK3tcbitcdEZJTEUgKmZwID0gZm9wZW4oQUxMT0NJTkZPX1BST0MsIFwiclwiKTtcbitcdGNoYXIgbGluZVtNQVhfTElORV9MRU5dO1xuK1x0aW50IG1hdGNoZXM7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHByb2Nmc19lbnRyeTtcbitcbitcdGlmICghZnApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJGYWlsZWQgdG8gb3BlbiBcIiBBTExPQ0lORk9fUFJPQyBcIiBmb3IgcmVhZGluZ1xcblwiKTtcbitcdFx0cmV0dXJuIDE7XG4rXHR9XG4rXHRtZW1zZXQocHJvY2ZzX2VudHJpZXMsIDAsIHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUykge1xuK1x0XHRjaGFyIGZpbGVuYW1lW01BWF9MSU5FX0xFTl07XG4rXHRcdGNoYXIgZnVuY3Rpb25bTUFYX0xJTkVfTEVOXTtcbitcbitcdFx0bWVtc2V0KFx1MDAyNnByb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xuK1x0XHRtYXRjaGVzID0gc3NjYW5mKGxpbmUsIFwiJWxsdSAlbGx1ICVbXjpdOiVsbHUgZnVuYzolc1wiLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLFxuK1x0XHRcdFx0IGZpbGVuYW1lLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS50YWcubGluZW5vLFxuK1x0XHRcdFx0IGZ1bmN0aW9uKTtcbitcbitcdFx0aWYgKG1hdGNoZXMgIT0gNSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZmlsZW5hbWUsIGZpbGVuYW1lKTtcbitcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sIGZ1bmN0aW9uKTtcbitcbitcdFx0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIHtcbitcdFx0XHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxuK1x0XHRcdFx0ICAgIGZpbHRlci1cdTAwM2VmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTikge1xuK1x0XHRcdGlmIChzdHJuY21wKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sXG4rXHRcdFx0XHQgICAgZmlsdGVyLVx1MDAzZWZpZWxkcy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xuK1x0XHRcdGlmIChwcm9jZnNfZW50cnkudGFnLmxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSB7XG4rXHRcdFx0aWYgKHByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzIFx1MDAzYyBmaWx0ZXItXHUwMDNlbWluX3NpemUpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkge1xuK1x0XHRcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcbitcdFx0bWVtY3B5KFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1twcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCsrXSwgXHUwMDI2cHJvY2ZzX2VudHJ5LFxuK1x0XHQgICAgICAgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xuK1x0fVxuK1x0ZmNsb3NlKGZwKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgZW51bSBpb2N0bF9yZXQgZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MsXG4rXHRcdFx0XHRcdFx0IGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXG4rXHRcdFx0XHRcdFx0IF9fdTY0IHN0YXJ0X3Bvcylcbit7XG4rXHRpbnQgZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XG4rXG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJGYWlsZWQgdG8gb3BlbiBcIiBBTExPQ0lORk9fUFJPQyBcIiBmb3IgSU9DVExcXG5cIik7XG4rXHRcdHJldHVybiBJT0NUTF9GQUlMVVJFO1xuK1x0fVxuK1xuK1x0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xuK1x0c3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtcztcbitcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xuK1x0aW50IHJldHJ5X2NvdW50ID0gMDtcbitcdGludCBzdGF0dXM7XG4rXG4rXHQvKlxuK1x0ICogX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGlmIGEga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkXG4rXHQgKiBiZXR3ZWVuIHRoZSB0d28gY2FsbHMuIElmIHRoYXQgaGFwcGVucywgdGhlIGRhdGEgZ2F0aGVyZWQgY2Fubm90IGJlIGNvbnNpZGVyZWQgY29uc2lzdGVudFxuK1x0ICogYW5kIGhlbmNlIG5lZWRzIHRvIGJlIGZldGNoZWQgYWdhaW4gdG8gYXZvaWQgZmxha2luZXNzLlxuK1x0ICovXG4rXHRkbyB7XG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0c3RhdHVzID0gSU9DVExfRkFJTFVSRTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRtZW1zZXQodGFncywgMCwgc2l6ZW9mKCp0YWdzKSk7XG4rXHRcdG1lbXNldChcdTAwMjZnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpO1xuK1x0XHRtZW1jcHkoXHUwMDI2Z2V0X2F0X3BhcmFtcy5maWx0ZXIsIGZpbHRlciwgc2l6ZW9mKCpmaWx0ZXIpKTtcbitcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFx1MDAyNmdldF9hdF9wYXJhbXMpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJhbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxcblwiKTtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdG1lbWNweShcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50KytdLCBcdTAwMjZnZXRfYXRfcGFyYW1zLmRhdGEsIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTtcbitcbitcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICAgIF9fYWxsb2NpbmZvX2dldF9uZXh0KGZkLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50XSkgPT0gMClcbitcdFx0XHR0YWdzLVx1MDAzZWNvdW50Kys7XG4rXG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJhbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXFxuXCIpO1xuK1x0XHRcdHN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcbitcdFx0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQpIHtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9TVUNDRVNTO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIG1pc21hdGNoLCByZXRyeWluZy4uLlxcblwiKTtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9JTlZBTElEX0RBVEE7XG4rXHRcdH1cbitcdH0gd2hpbGUgKHN0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEgXHUwMDI2XHUwMDI2IHJldHJ5X2NvdW50KysgXHUwMDNjIG1heF9yZXRyaWVzKTtcbitcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBzdGF0dXM7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpXG4re1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuK1x0aW50IGlvY3RsX3N0YXR1cztcbitcdGludCByZXQgPSBLU0ZUX1BBU1M7XG4rXG4rXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCIgQUxMT0NJTkZPX1BST0MgXCJcXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1xuK1x0aWYgKHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50ID09IDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBlbnRyaWVzIGZvdW5kIGluIFwiIEFMTE9DSU5GT19QUk9DIFwiLCBza2lwcGluZyB0ZXN0XFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdGlvY3RsX3N0YXR1cyA9IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHRhZ3MsIGZpbHRlciwgMCk7XG4rXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIlRyb3VibGUgcmV0cmlldmluZyB2YWxpZCBJT0NUTCBlbnRyaWVzLCBza2lwcGluZy5cXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1x0aWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9GQUlMVVJFKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXG4rXHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcbitleGl0OlxuK1x0ZnJlZSh0YWdzKTtcbitcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbitcdGNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9IFwibW0vbWVtb3J5LmNcIjtcbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRTtcbitcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5maWxlbmFtZSwgdGFyZ2V0X2ZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuK1xuK1x0cmV0dXJuIHJ1bl9maWx0ZXJfdGVzdChcdTAwMjZmaWx0ZXIpO1xuK31cbitcbitzdGF0aWMgaW50IHRlc3RfZnVuY3Rpb25fZmlsdGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuK1x0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXCJkdXBfbW1cIjtcbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjtcbitcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuK1xuK1x0cmV0dXJuIHJ1bl9maWx0ZXJfdGVzdChcdTAwMjZmaWx0ZXIpO1xuK31cbitcbitzdGF0aWMgaW50IHRlc3Rfc2l6ZV9maWx0ZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTtcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4rXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xuK1x0X191NjQgdGFyZ2V0X3NpemUsIGksIHBvcztcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7XG4rXHRjb25zdCBjaGFyICp0YXJnZXRfZnVuY3Rpb24gPSBcImRvX2luaXRfbW9kdWxlXCI7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7XG4rXHRpbnQgcmV0cnkgPSAwO1xuK1x0Y29uc3QgaW50IG1heF9yZXRyaWVzID0gMTA7XG4rXG4rXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGZyZWVtZW07XG4rXHR9XG4rXG4rXHRmZCA9IG9wZW4oQUxMT0NJTkZPX1BST0MsIE9fUkRPTkxZKTtcbitcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkZhaWxlZCB0byBvcGVuIFwiIEFMTE9DSU5GT19QUk9DIFwiOiAlc1xcblwiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4rXHRcdGdvdG8gZnJlZW1lbTtcbitcdH1cbitcbitcdGRvIHtcbitcdFx0Zm91bmRfdGFnID0gTlVMTDtcbitcdFx0cG9zID0gMDtcbitcbitcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcdTAwMjZzdGFydF9jb250X2lkKSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcblwiKTtcbitcdFx0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdFx0Z290byBleGl0O1xuK1x0XHR9XG4rXG4rXHRcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OO1xuK1x0XHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbitcbitcdFx0aWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgXHUwMDI2ZmlsdGVyKSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCIgQUxMT0NJTkZPX1BST0MgXCJcXG5cIik7XG4rXHRcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgPT0gMCkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiRnVuY3Rpb24gJXMgbm90IGZvdW5kIGluIHByb2Nmc1xcblwiLCB0YXJnZXRfZnVuY3Rpb24pO1xuK1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0XHRnb3RvIGV4aXQ7XG4rXHRcdH1cbitcbitcdFx0dGFyZ2V0X3NpemUgPSBwcm9jZnNfZW50cmllcy1cdTAwM2V0YWdbMF0uY291bnRlci5ieXRlcztcbitcbitcdFx0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuK1x0XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkU7XG4rXHRcdGZpbHRlci5taW5fc2l6ZSA9IHRhcmdldF9zaXplO1xuK1x0XHRmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTtcbitcbitcdFx0d2hpbGUgKDEpIHtcbitcdFx0XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuK1xuK1x0XHRcdG1lbXNldChcdTAwMjZnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpO1xuK1x0XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXHUwMDI2ZmlsdGVyLCBzaXplb2YoZmlsdGVyKSk7XG4rXHRcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBwb3M7XG4rXG4rXHRcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9hdChmZCwgXHUwMDI2Z2V0X2F0X3BhcmFtcykpXG4rXHRcdFx0XHRicmVhaztcbitcbitcdFx0XHR0YWdzLVx1MDAzZWNvdW50ID0gMDtcbitcdFx0XHRtZW1jcHkoXHUwMDI2dGFncy1cdTAwM2V0YWdbdGFncy1cdTAwM2Vjb3VudCsrXSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxuK1x0XHRcdCAgICAgICBzaXplb2YoZ2V0X2F0X3BhcmFtcy5kYXRhKSk7XG4rXG4rXHRcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgICAgX19hbGxvY2luZm9fZ2V0X25leHQoZmQsIFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnRdKSA9PSAwKVxuK1x0XHRcdFx0dGFncy1cdTAwM2Vjb3VudCsrO1xuK1xuK1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdFx0aWYgKHN0cmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xuK1x0XHRcdFx0XHRmb3VuZF90YWcgPSBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1tpXTtcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1xuK1x0XHRcdGlmIChmb3VuZF90YWcgfHwgdGFncy1cdTAwM2Vjb3VudCBcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxuK1x0XHRcdFx0YnJlYWs7XG4rXG4rXHRcdFx0cG9zICs9IHRhZ3MtXHUwMDNlY291bnQ7XG4rXHRcdH1cbitcbitcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcdTAwMjZlbmRfY29udF9pZCkpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZClcbitcdFx0XHRicmVhaztcbitcbitcdFx0a3NmdF9wcmludF9tc2coXCJNb2R1bGUgbG9hZCBkZXRlY3RlZCBkdXJpbmcgc2l6ZSB2ZXJpZmljYXRpb24sIHJldHJ5aW5nLi4uXFxuXCIpO1xuK1x0fSB3aGlsZSAocmV0cnkrKyBcdTAwM2MgbWF4X3JldHJpZXMpO1xuK1xuK1x0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQgXHUwMDI2XHUwMDI2ICFmb3VuZF90YWcpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXFxuXCIsXG4rXHRcdFx0ICAgICAgIHRhcmdldF9mdW5jdGlvbik7XG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcdH0gZWxzZSBpZiAoc3RhcnRfY29udF9pZC5pZCAhPSBlbmRfY29udF9pZC5pZCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdH0gZWxzZSBpZiAoZm91bmRfdGFnIFx1MDAyNlx1MDAyNiBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcyAhPSB0YXJnZXRfc2l6ZSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIklPQ1RMIGVudHJ5IHNpemUgJWxsdSBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgc2l6ZSAlbGx1XFxuXCIsXG4rXHRcdFx0ICAgICAgIGZvdW5kX3RhZy1cdTAwM2Vjb3VudGVyLmJ5dGVzLCB0YXJnZXRfc2l6ZSk7XG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcdH1cbitcbitleGl0OlxuK1x0Y2xvc2UoZmQpO1xuK2ZyZWVtZW06XG4rXHRmcmVlKHRhZ3MpO1xuK1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHRlc3RfbGluZW5vX2ZpbHRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbitcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbitcdGVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1cztcbitcdGludCByZXQgPSBLU0ZUX1BBU1M7XG4rXHRfX3U2NCB0YXJnZXRfbGluZW5vLCBpO1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZztcbitcdGJvb2wgZm91bmQgPSBmYWxzZTtcbitcbitcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcbitcdGlmIChnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIFx1MDAyNmZpbHRlcikpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcIiBBTExPQ0lORk9fUFJPQyBcIlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgPT0gMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHQvKlxuK1x0ICogV2UgZGVwZW5kIG9uIHRoZSBwcm9jZnMgcmVzdWx0cyB0byBkZXRlcm1pbmUgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgZmlsdGVyIGJlZm9yZVxuK1x0ICogbWFraW5nIHRoZSBpb2N0bCBxdWVyeS4gSGVuY2UsIHdlIGNhbm5vdCByZXVzZSBydW5fZmlsdGVyX3Rlc3QgaGVyZS5cbitcdCAqL1xuK1x0dGFyZ2V0X3RhZyA9IFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1swXTtcbitcdHRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLVx1MDAzZXRhZy5saW5lbm87XG4rXG4rXHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PO1xuK1x0ZmlsdGVyLmZpZWxkcy5saW5lbm8gPSB0YXJnZXRfbGluZW5vO1xuK1xuK1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXHUwMDI2ZmlsdGVyLCAwKTtcbitcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiVHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0ZBSUxVUkUpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRpZiAodGFncy1cdTAwM2V0YWdbaV0udGFnLmxpbmVubyAhPSB0YXJnZXRfbGluZW5vKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgaSwgdGFncy1cdTAwM2V0YWdbaV0udGFnLmxpbmVubyk7XG4rXHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoc3RybmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF90YWctXHUwMDNldGFnLmZ1bmN0aW9uLFxuK1x0XHRcdCAgICBBTExPQ0lORk9fU1RSX1NJWkUpID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBzdHJuY21wKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5maWxlbmFtZSwgdGFyZ2V0X3RhZy1cdTAwM2V0YWcuZmlsZW5hbWUsXG4rXHRcdFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMClcbitcdFx0XHRmb3VuZCA9IHRydWU7XG4rXHR9XG4rXG4rXHRpZiAoIWZvdW5kKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiT3JpZ2luYWwgcHJvY2ZzIGVudHJ5IG5vdCBmb3VuZCBpbiBJT0NUTCBsaW5lbm8gZmlsdGVyIHJlc3VsdHMuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHR9XG4rXG4rZXhpdDpcbitcdGZyZWUodGFncyk7XG4rXHRmcmVlKHByb2Nmc19lbnRyaWVzKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4re1xuK1x0aW50IHJldDtcbitcbitcdGtzZnRfc2V0X3BsYW4oNCk7XG4rXG4rXHRyZXQgPSB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcigpO1xuK1x0aWYgKHJldCA9PSBLU0ZUX1NLSVApXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIlNraXBwaW5nIHRlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwidGVzdF9maWxlbmFtZV9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X2Z1bmN0aW9uX2ZpbHRlcigpO1xuK1x0aWYgKHJldCA9PSBLU0ZUX1NLSVApXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIlNraXBwaW5nIHRlc3RfZnVuY3Rpb25fZmlsdGVyXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwidGVzdF9mdW5jdGlvbl9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X3NpemVfZmlsdGVyKCk7XG4rXHRpZiAocmV0ID09IEtTRlRfU0tJUClcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiU2tpcHBpbmcgdGVzdF9zaXplX2ZpbHRlclxcblwiKTtcbitcdGVsc2VcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcInRlc3Rfc2l6ZV9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X2xpbmVub19maWx0ZXIoKTtcbitcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCJTa2lwcGluZyB0ZXN0X2xpbmVub19maWx0ZXJcXG5cIik7XG4rXHRlbHNlXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXCJ0ZXN0X2xpbmVub19maWx0ZXJcXG5cIik7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MDUuNjM1ODk2NzExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTgxMDEwNzYwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBOZXcgQWxsb2NhdGlvbiBQcm9maWxpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgbmV3IGBpb2N0bGAgaW50ZXJmYWNlIGZvciBgL3Byb2MvYWxsb2NpbmZvYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgc2VlIGEgZ29vZCByYW5nZSBvZiBmaWxlcyB0b3VjaGVkLCB3aGljaCBpcyB3aGF0IEknZCBleHBlY3QgZm9yIHRoaXMga2luZCBvZiBmZWF0dXJlLiBXZSBoYXZlIGRvY3VtZW50YXRpb24gdXBkYXRlcywgd2hpY2ggaXMgY3J1Y2lhbCwgZXNwZWNpYWxseSByZWdhcmRpbmcgdXNlcnNwYWNlIGludGVyYWN0aW9uIHdpdGggdGhlIG5ldyBgaW9jdGxgIGluIGJvdGggdGhlIGBtbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RgIGFuZCBgdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0YCBmaWxlcy4gVGhlIGBNQUlOVEFJTkVSU2AgY2hhbmdlIGlzIGFsc28gZXhwZWN0ZWQgdG8gZW5zdXJlIHRoZSByaWdodCBwZW9wbGUgYXJlIGluIHRoZSBsb29wLiBUaGUgaGVhZGVyIGZpbGVzIGxpa2UgYGluY2x1ZGUvbGludXgvY29kZXRhZy5oYCBhbmQgYGluY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaGAgdGVsbCBtZSB0aGV5J3JlIHNldHRpbmcgdXAgdGhlIGxvdy1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMsIGFuZCB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlbHkgaW4gYGxpYi9jb2RldGFnLmNgIGFuZCBgbW0vYWxsb2NfdGFnLmNgLiBUaGUgaW5jbHVzaW9uIG9mIGEgc2VsZnRlc3QgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9gIGlzIGEgaHVnZSBwbHVzOyBhbHdheXMgZ29vZCB0byBoYXZlIHNvbWUgc29saWQgdmFsaWRhdGlvbi5cblxuTm93LCB0aGUgbWVhdCBvZiBpdCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB3ZSdyZSBhZGRpbmcgdGhpcyBgYWxsb2NpbmZvX2lvY3RsYCBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGhhbmRsaW5nIHRoZSBgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEYCwgYEFMTE9DSU5GT19JT0NfR0VUX0FUYCwgYW5kIGBBTExPQ0lORk9fSU9DX0dFVF9ORVhUYCBpb2N0bCBjb21tYW5kcy4gU28gdGhpcyBpcyBob3cgdXNlcnNwYWNlIHdpbGwgYWN0dWFsbHkgaW50ZXJhY3Qgd2l0aCB0aGUgbmV3IGAvcHJvYy9hbGxvY2luZm9gIGludGVyZmFjZS5cblxuR2l2ZW4gdGhpcywgSSBzaG91bGQgY29uZmlybSB0aGUgQ09ORklHIG9wdGlvbnMgdGhhdCBjb250cm9sIHRoaXMuIEkgc2VlIHRoYXQgdGhlIGNvcmUgZmlsZSwgYG1tL2FsbG9jX3RhZy5jYCwgaXMgb25seSBjb21waWxlZCB3aGVuIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gVGhhdCBtYWtlcyBzZW5zZSwga2VlcHMgdGhpbmdzIG1vZHVsYXIgYW5kIGF2b2lkcyB1bm5lY2Vzc2FyeSBjb2RlIGJsb2F0IGluIGEgcHJvZHVjdGlvbiBrZXJuZWwuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgdGhlIEtjb25maWcgZmlsZXMgYWN0dWFsbHkgc3RhdGUuIEknbGwgYWxzbyBjaGVjayBvdGhlciBkZXBlbmRlbmNpZXMsIGJ1dCB0aGlzIHNlZW1zIGxpa2UgYSBzb2xpZCBpbml0aWFsIGFwcHJvYWNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTEzNSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0MSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjExLjQ0NjAwNTc3NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI4MjcyMTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWxsb2NfdGFnLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTE0OT1vYmotJChDT05GSUdfTEFaWV9NTVVfTU9ERV9LVU5JVF9URVNUKSArPSB0ZXN0cy9sYXp5X21tdV9tb2RlX2t1bml0Lm9cXG5tbS9NYWtlZmlsZToxNTA6b2JqLSQoQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkcpICs9IGFsbG9jX3RhZy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjExLjU4ODg0Mzg5MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwNzI2NDY2OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBBbGxvY2F0aW9uIFByb2ZpbGluZyBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgIGlzIGRlZmluaXRlbHkgYSBrZXkgcmVxdWlyZW1lbnQgaGVyZS4gTm93LCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgYnJvYWRlciBsb29rIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHRoYXQgbmVlZCBteSBhdHRlbnRpb24uIExldCdzIHNlZS4uLiBJIHNlZSB0aGUgaW9jdGwgaXMgcGx1bWJlZCBpbnRvIGAvcHJvYy9hbGxvY2luZm9gLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBpbnRyb3NwZWN0aW9uLiBCdXQsIHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJJ2xsIG5lZWQgdG8gZGlnIGludG8gYG1tL2FsbG9jX3RhZy5jYCByaWdodCBhd2F5LiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdGhlciBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzIChgI2lmZGVmYHMpIGluIHRoYXQgZmlsZSB0aGF0IHJlbGF0ZSB0byBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgb3IgdGFnZ2luZy4gVGhhdCB3aWxsIHByb2JhYmx5IGJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdWxsIHBpY3R1cmUgb2YgdGhlIGZlYXR1cmUncyBkZXBlbmRlbmNpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1OTE3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MTUuNjYxNDkyNTY3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3NTAyMjc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFsbG9jaW5mb19pb2N0bFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz0yMTQ9c3RhdGljIHZvaWQgYWxsb2NpbmZvX3RvX3BhcmFtcyhzdHJ1Y3QgY29kZXRhZyAqY3QsXFxuLS1cXG5tbS9hbGxvY190YWcuYy0yMzMtICovXFxubW0vYWxsb2NfdGFnLmM6MjM0OnN0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG5tbS9hbGxvY190YWcuYy0yMzUte1xcbi0tXFxubW0vYWxsb2NfdGFnLmM9MjUxPXN0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTMwNy0gKi9cXG5tbS9hbGxvY190YWcuYzozMDg6c3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG5tbS9hbGxvY190YWcuYy0zMDkte1xcbi0tXFxubW0vYWxsb2NfdGFnLmMtMzgyLSAqL1xcbm1tL2FsbG9jX3RhZy5jOjM4MzpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxubW0vYWxsb2NfdGFnLmMtMzg0LXtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQzMy0gKi9cXG5tbS9hbGxvY190YWcuYzo0MzQ6c3RhdGljIGxvbmcgYWxsb2NpbmZvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbm1tL2FsbG9jX3RhZy5jLTQzNS1cXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBfX2FyZylcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQ0MS1cXHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcXG5tbS9hbGxvY190YWcuYzo0NDI6XFx0XFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcXG5tbS9hbGxvY190YWcuYy00NDMtXFx0XFx0YnJlYWs7XFxubW0vYWxsb2NfdGFnLmMtNDQ0LVxcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XFxubW0vYWxsb2NfdGFnLmM6NDQ1OlxcdFxcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbm1tL2FsbG9jX3RhZy5jLTQ0Ni1cXHRcXHRicmVhaztcXG5tbS9hbGxvY190YWcuYy00NDctXFx0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxcbm1tL2FsbG9jX3RhZy5jOjQ0ODpcXHRcXHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbm1tL2FsbG9jX3RhZy5jLTQ0OS1cXHRcXHRicmVhaztcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTQ1OT1zdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbi0tXFxubW0vYWxsb2NfdGFnLmMtNDYxLXtcXG5tbS9hbGxvY190YWcuYzo0NjI6XFx0cmV0dXJuIGFsbG9jaW5mb19pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7XFxubW0vYWxsb2NfdGFnLmMtNDYzLX1cXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTQ2Nj1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQ3MC1cXHQucHJvY19yZWxlYXNlXFx0XFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcXG5tbS9hbGxvY190YWcuYzo0NzE6XFx0LnByb2NfaW9jdGxcXHRcXHQ9IGFsbG9jaW5mb19pb2N0bCxcXG5tbS9hbGxvY190YWcuYy00NzItI2lmZGVmIENPTkZJR19DT01QQVRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MTUuNzE4OTk4NjQ3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTI1MzgxNjgxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gUHJvZmlsaW5nIElvY3RsIEludGVyZmFjZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5LCBteSBleHBlcnQgZXllIGdvZXMgdG8gdGhlIGNvcmU6IHRoZXNlIGBpb2N0bGAgZnVuY3Rpb25zLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkYCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfYXRgLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0YCwgYGFsbG9jaW5mb19pb2N0bGAsIGFuZCBgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bGAuIFRoZXkncmUgY2xlYXJseSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgbmV3IGFsbG9jYXRpb24gcHJvZmlsaW5nIGZ1bmN0aW9uYWxpdHksIGFuZCB0aGUgYC9wcm9jL2FsbG9jaW5mb2Agbm9kZSBjb25maXJtcyB0aGlzIGlzIGEgbGl2ZSBhbmQgZnVuY3Rpb25pbmcgaW50ZXJmYWNlLlxuXG5UaGlzIGlzICpwZXJmZWN0KiBmdXp6aW5nIG1hdGVyaWFsLiBJdCdzIGFuIG9idmlvdXMgdGFyZ2V0LiBCdXQgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCBpbnRvIGZ1enppbmcgc3RyYXRlZ3ksIEkgc2hvdWxkIG1ha2Ugc3VyZSBteSBlbnZpcm9ubWVudCBpcyBwcm9wZXJseSBzZXQgdXAuIFJpZ2h0LCBJIG5lZWQgdG8gY2hlY2sgaWYgYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBZZXMsIGl0IGlzLiBHb29kLlxuXG5Ob3csIGxldCBtZSB0aGluayBpZiB0aGVyZSBhcmUgb3RoZXIsIG1vcmUgc3VidGxlIGNvbmZpZ3VyYXRpb25zIGF0IHBsYXkgaGVyZS4gU2luY2UgaXQncyBpbnRlcmFjdGluZyB3aXRoIGAvcHJvY2AsIEkgc2hvdWxkIG1ha2Ugc3VyZSBgQ09ORklHX1BST0NfRlNgIGlzbid0IHNvbWUgb2JzY3VyZSByZXF1aXJlbWVudC4gQ2hlY2tpbmcgYG1tL2FsbG9jX3RhZy5jYCwgSSBzZWUgYHByb2NfY3JlYXRlYCwgd2hpY2ggcmVsaWVzIG9uIGBDT05GSUdfUFJPQ19GU2AuIEhvd2V2ZXIsIHRoYXQgaXMgYSB2ZXJ5IGNvbW1vbiBjb25maWcsIGFuZCBub3Qgd29ydGggdGhlIGxpc3RpbmcuIE5vdywgd2hlcmUgd2FzIEk/IFJpZ2h0LCBsZXQncyBjaGVjayBgbGliL2NvZGV0YWcuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2OTUxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjIwLjk3MjgxNzA3NloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDc0MjY2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2RldGFnLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvTWFrZWZpbGU9MTk2PW9iai0kKENPTkZJR19GVU5DVElPTl9FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdC5vXFxubGliL01ha2VmaWxlLTE5Ny1cXG5saWIvTWFrZWZpbGU6MTk4Om9iai0kKENPTkZJR19DT0RFX1RBR0dJTkcpICs9IGNvZGV0YWcub1xcbmxpYi9NYWtlZmlsZS0xOTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjIxLjA1NzU2NDc0NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc3MzExNTQ4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKlZlcmlmeWluZyBEZXBlbmRlbmNpZXMgaW4gS2VybmVsIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIHNlZSB0aGF0IGBDT05GSUdfQ09ERV9UQUdHSU5HYCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgSSBhbHdheXMgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGVzcGVjaWFsbHkgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggY29yZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gVGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGtpbmQgb2YgZGVwZW5kZW5jeSBhcmUgcHJldHR5IHNpZ25pZmljYW50LCBhbmQgYSBtaXN1bmRlcnN0YW5kaW5nIGhlcmUgY291bGQgbGVhZCB0byBzb21lIG5hc3R5IGRlYnVnZ2luZyBoZWFkYWNoZXMgbGF0ZXIgb24uIExldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSB0aGF0IHRoZSBkZXBlbmRlbmN5IGlzIGNvZGVkIGNvcnJlY3RseS4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIHJlbGV2YW50IHNlY3Rpb25zIGFuZCBtYWtlIHN1cmUgdGhlIGxvZ2ljIGlzIHNvdW5kIGFuZCB0aGVyZSBhcmUgbm8gdW5leHBlY3RlZCBpbnRlcmFjdGlvbnMgb3IgY29uZGl0aW9uYWxzIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSBiZWhhdmlvci4gSXQncyBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdHJhY2tpbmcgZG93biBhIGh5cG90aGV0aWNhbCBidWcgZG93biB0aGUgbGluZS4gSXQncyBzZWNvbmQgbmF0dXJlIGZvciBtZSB0byBpbW1lZGlhdGVseSB2ZXJpZnkgYSBkZXBlbmRlbmN5IGxpa2UgdGhpcy4gR29vZCB0byBnbyFcblxuXG4iLCJJbnB1dFRva2VucyI6MTc1NzEsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDoyOC43ODg3MjIxNTJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1NDkzNTAwLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MjguODQ0MjIwNzUxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU3NDUxMTM0MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipGaW5kaW5nIHRoZSBEZWZpbml0aW9uIG9mIGBNRU1fQUxMT0NfUFJPRklMSU5HYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIGV4YWN0bHkgd2hlcmUgdGhpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZGVmaW5lZC4gVGhpcyBsaWtlbHkgbWVhbnMgaXQncyBhIHByZXByb2Nlc3NvciBtYWNybyBvciwgbGVzcyBsaWtlbHksIGEgdmFyaWFibGUuIEdpdmVuIHRoZSBuYW1pbmcgY29udmVudGlvbiwgbXkgaW5pdGlhbCBiZXQgaXMgb24gYSBtYWNyby4gSSdsbCBuZWVkIHRvIGtub3cgaXRzIGRlZmluaXRpb24gdG8gdW5kZXJzdGFuZCBpdHMgaW1wYWN0IG9uIHRoZSBjb2RlYmFzZSBhbmQsIHVsdGltYXRlbHksIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgd2l0aCBpdC4gVGhpcyBpcyBjcnVjaWFsIGZvciBkZWJ1Z2dpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGJlaGF2aW9yLCBlc3BlY2lhbGx5IGlmIHRoZXJlJ3MgYW55IGFsbG9jYXRpb24gcHJvZmlsaW5nIGVuYWJsZWQuIE5vdywgbGV0J3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBpbmNsdWRlcywgYnVpbGQgY29uZmlndXJhdGlvbnMsIGFuZCBwcm9qZWN0IHNldHRpbmdzIHRvIG5haWwgZG93biB0aGF0IGRlZmluaXRpb24uIEtub3dpbmcgdGhlIHByZWNpc2UgbG9jYXRpb24gd2lsbCB1bmxvY2sgdGhlIGZ1bGwgY29udGV4dCBvZiBpdHMgdXNhZ2UgYW5kIHdoYXQgZmxhZ3MgZGV0ZXJtaW5lIGl0cyBwcmVzZW5jZS4gVGltZSB0byBwdXQgb24gbXkgZGV0ZWN0aXZlIGhhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NDUsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozNC41ODkzMzc2MDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MTQxODM3MjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzIzLVxcbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMjUtXFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzM3LVxcbm1tL0tjb25maWcuZGVidWc6MzM4OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxcbm1tL0tjb25maWcuZGVidWctMzM5LVxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzQyLVxcbm1tL0tjb25maWcuZGVidWc6MzQzOmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXFx0Ym9vbCBcXFwiTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsZXIgZGVidWdnaW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozNi41MDM1MjYxNzhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzE3NTk2NjcwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBEZWJ1ZyBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCB3aGVyZSdzIHRoZSBiZXN0IHBsYWNlIHRvIGRpZyBpbnRvIHRoZXNlIGRlYnVnIG9wdGlvbnM/IE15IGluc3RpbmN0IGlzIHRvIGNoZWNrIGBtbS9LY29uZmlnLmRlYnVnYC4gVGhhdCdzIHVzdWFsbHkgdGhlIGdvLXRvIHNwb3QgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LXJlbGF0ZWQgZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgY29yZSBtZW1vcnkgYXJlYXMuIEknbSBzcGVjaWZpY2FsbHkgYWltaW5nIGFyb3VuZCBsaW5lIDMyNDsgdGhhdCBmZWVscyBsaWtlIGEgbGlrZWx5IHBvaW50IHRvIHN0YXJ0IHVucmF2ZWxpbmcgd2hhdCdzIGVuYWJsZWQgYW5kIGRpc2FibGVkLiBNeSBob3BlIGlzIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB3aGljaCBmZWF0dXJlcyBhcmUgYWN0aXZlIGluIHRoZSBjdXJyZW50IGJ1aWxkIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggZWFjaCBvdGhlciwgcmlnaHQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UuIEkgYW50aWNpcGF0ZSB0aGVyZSdsbCBiZSBjb25kaXRpb25hbCBibG9ja3MgYW5kIHNvbWUgaW50ZXJlc3RpbmcgZGVwZW5kZW5jaWVzIGluIHRoYXQgYXJlYS4gSXQncyB0aW1lIHRvIGdldCBhIGJldHRlciBncmFzcCBvbiB3aGF0IGNhbiBiZSBhZGp1c3RlZCwgYW5kIGhvdyBpdCBpbXBhY3RzIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODI3OCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjM5LjY3OTQ5NDYxNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDA3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnLmRlYnVnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMyMCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMyMDpcXHRcXHQgIG92ZXJoZWFkIGluIHRoZSBwYWdlIGZhdWx0IHBhdGguXFxuIDMyMTpcXHRcXG4gMzIyOlxcdFxcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxcbiAzMjM6XFx0XFxuIDMyNDpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzMjU6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4gMzI2OlxcdFxcdGRlZmF1bHQgblxcbiAzMjc6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gMzI4OlxcdFxcdGRlcGVuZHMgb24gUFJPQ19GU1xcbiAzMjk6XFx0XFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXFxuIDMzMDpcXHRcXHRzZWxlY3QgQ09ERV9UQUdHSU5HXFxuIDMzMTpcXHRcXHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cXG4gMzMyOlxcdFxcdHNlbGVjdCBTTEFCX09CSl9FWFRcXG4gMzMzOlxcdFxcdGhlbHBcXG4gMzM0OlxcdFxcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxcbiAzMzU6XFx0XFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXFxuIDMzNjpcXHRcXHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxcbiAzMzc6XFx0XFxuIDMzODpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcXG4gMzM5OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4gMzQwOlxcdFxcdGRlZmF1bHQgeVxcbiAzNDE6XFx0XFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXFxuIDM0MjpcXHRcXG4gMzQzOlxcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxuIDM0NDpcXHRcXHRib29sIFxcXCJNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxlciBkZWJ1Z2dpbmdcXFwiXFxuIDM0NTpcXHRcXHRkZWZhdWx0IG5cXG4gMzQ2OlxcdFxcdGRlcGVuZHMgb24gTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzNDc6XFx0XFx0c2VsZWN0IE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXFxuIDM0ODpcXHRcXHRoZWxwXFxuIDM0OTpcXHRcXHQgIEFkZHMgd2FybmluZ3Mgd2l0aCBoZWxwZnVsIGVycm9yIG1lc3NhZ2VzIGZvciBtZW1vcnkgYWxsb2NhdGlvblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozOS42Nzk1ODAyNTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkwNjI1NjY5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmc6IFRoZSBDb25maWd1cmF0aW9uIFBhdGgqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgdGhpcyBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgY29uZmlndXJhdGlvbiwgYW5kIGl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBJdCBsb29rcyBsaWtlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyB0aGUga2V5LiBUaGF0J3MgdGhlIG1haW4gY29uZmlnIGZsYWcgd2UgbmVlZCB0byBmbGlwIHRvIGdldCB0aGlzIHdob2xlIHRoaW5nIHdvcmtpbmcuIEkgd2FzIGluaXRpYWxseSB3b25kZXJpbmcgaWYgd2UnZCBuZWVkIGBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVGAgYXMgd2VsbCwgb3IgaWYgd2UnZCBoYXZlIHRvIHVzZSBgc3lzY3RsYCBvciBhIGJvb3QgcGFyYW1ldGVyLiBCdXQsIGhvbGQgb24uLi4gYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBkZWZhdWx0cyB0byAneScgKmlmKiBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gRXhjZWxsZW50LiBUaGF0IHNpbXBsaWZpZXMgdGhpbmdzIHF1aXRlIGEgYml0LiBKdXN0IHNldHRpbmcgYE1FTV9BTExPQ19QUk9GSUxJTkdgIHNob3VsZCBiZSBzdWZmaWNpZW50LlxuXG5Ob3csIGxldCdzIHNlZSB3aGF0IG5ldyBmdW5jdGlvbmFsaXR5IGlzIGJlaW5nIGludHJvZHVjZWQuIFRpbWUgdG8gY2hlY2sgdGhlIGZvY3VzIHN5bWJvbHMuIExvb2tzIGxpa2Ugd2UgaGF2ZSBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zOiBJIHNlZSBgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkYCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfYXRgLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0YCwgYGFsbG9jaW5mb19pb2N0bGAsIGBhbGxvY2luZm9fY29tcGF0X2lvY3RsYCwgYGFsbG9jaW5mb19vcGVuYCBhbmQgYGFsbG9jaW5mb19yZWxlYXNlYCBmdW5jdGlvbnMuIFRoZXJlJ3MgYWxzbyBgbWF0Y2hlc19maWx0ZXJgLiBHb29kIHRvIGhhdmUgdGhpcyBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkzNCwiT3V0cHV0VG9rZW5zIjoxNDYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDo0NS41ODU4NDAxNDdaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY1OTgwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsX2dldF9hdFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0XCIsXG4gICAgXCJhbGxvY2luZm9faW9jdGxcIixcbiAgICBcImFsbG9jaW5mb19jb21wYXRfaW9jdGxcIixcbiAgICBcImFsbG9jaW5mb19vcGVuXCIsXG4gICAgXCJhbGxvY2luZm9fcmVsZWFzZVwiLFxuICAgIFwibWF0Y2hlc19maWx0ZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGlvY3RsIGludGVyZmFjZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHZpYSAvcHJvYy9hbGxvY2luZm8uIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb25hbCBBUEkgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowhm7pg[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-09 11:43:11 +0000 UTC FinishedAt: 2026-07-09 11:50:47 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "d11ba1f570615ec8d4814d6313ee1d7075a33787", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "d11ba1f570615ec8d4814d6313ee1d7075a33787", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEM_ALLOC_PROFILING" ], "series_id": "f0a980a1-efc1-4beb-87b1-580ef7152ac0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "allocinfo_ioctl_get_content_id", "allocinfo_ioctl_get_at", "allocinfo_ioctl_get_next", "allocinfo_ioctl", "allocinfo_compat_ioctl", "allocinfo_open", "allocinfo_release", "matches_filter" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9hdCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X25leHQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX29wZW4mIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7bWF0Y2hlc19maWx0ZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDBiOTBmZjZhMGI1M2Q5NGE3Y2RkODQ1MDczMjBjNTFlZmE3YjExYTdcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEp1bCA5IDExOjUwOjAzIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuQEAgLTQ2LDYgJiM0Mzs0NiwxMSBAQCBzeXNjdGw6XG4gUnVudGltZSBpbmZvOlxuICAgL3Byb2MvYWxsb2NpbmZvXG4gXG4mIzQzOyAgUHJvZmlsaW5nIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBlaXRoZXIgYnkgcmVhZGluZyBgL3Byb2MvYWxsb2NpbmZvYCBkaXJlY3RseSBhc1xuJiM0MzsgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VgLlxuJiM0MzsgIFRoZSBpb2N0bCBpbnRlcmZhY2Ugc3VwcG9ydHMgc3RydWN0dXJlZCBiaW5hcnkgZGF0YSBleHRyYWN0aW9uIGFzIHdlbGwgYXMgZmlsdGVyaW5nXG4mIzQzOyAgYnkgbW9kdWxlIG5hbWUsIGZ1bmN0aW9uLCBmaWxlLCBsaW5lIG51bWJlciwgYWNjdXJhY3ksIG9yIGFsbG9jYXRpb24gc2l6ZSBsaW1pdHMuXG4mIzQzO1xuIEV4YW1wbGUgb3V0cHV0OjpcbiBcbiAgIHJvb3RAbW9yaWEta3ZtOn4jIHNvcnQgLWcgL3Byb2MvYWxsb2NpbmZvfHRhaWx8bnVtZm10IC0tdG89aWVjXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XG5AQCAtMzQ2LDYgJiM0MzszNDYsOCBAQCBDb2RlICBTZXEjICAgIEluY2x1ZGUgRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2NtYWlsdG86bHV6bWF4aW1pbGlhbkBnbWFpbC5jb21cdTAwM2VcbiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbVx1MDAzZVxuJiM0MzsweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbVx1MDAzZVxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcbiAweEFCICAwMC0xRiAgbGludXgvbmJkLmhcbiAweEFDICAwMC0xRiAgbGludXgvcmF3LmhcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCBkMTk4MjJkNTc0ZmQ0OC4uM2Q1NGZkOGQ2OWMxYzYgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlNcbkBAIC0xNjkzNiw3ICYjNDM7MTY5MzYsOSBAQCBTOlx0TWFpbnRhaW5lZFxuIEY6XHREb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuIEY6XHRpbmNsdWRlL2xpbnV4L2FsbG9jX3RhZy5oXG4gRjpcdGluY2x1ZGUvbGludXgvcGdhbGxvY190YWcuaFxuJiM0MztGOlx0aW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG4gRjpcdG1tL2FsbG9jX3RhZy5jXG4mIzQzO0Y6XHR0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvXG4gXG4gTUVNT1JZIE1BTkFHRU1FTlQgLSBCQUxMT09OXG4gTTpcdEFuZHJldyBNb3J0b24gXHUwMDNjYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZ1x1MDAzZVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcbmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxuQEAgLTc3LDYgJiM0Mzs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHtcbiB2b2lkIGNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIGJvb2wgY29kZXRhZ190cnlsb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuJiM0Mzt1bnNpZ25lZCBsb25nIGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcbiYjNDM7dW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIHN0cnVjdCBjb2RldGFnICpjb2RldGFnX25leHRfY3Qoc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgKml0ZXIpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG5AQCAtMCwwICYjNDM7MSw5OSBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqL1xuJiM0MzsvKlxuJiM0MzsgKiBhbGxvY190YWcgSU9DVEwgQVBJIGRlZmluaXRpb25cbiYjNDM7ICpcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEdvb2dsZSwgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiYjNDM7ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXNcbiYjNDM7ICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBfVUFQSV9BTExPQ19UQUdfSFxuJiM0MzsjZGVmaW5lIF9VQVBJX0FMTE9DX1RBR19IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBGdW5jdGlvbiwgZmlsZSBhbmQgbW9kdWxlIG5hbWVzIG9mdGVuIGhhdmUgdGhlIHNhbWUgcHJlZml4ZXMsIHRoZXJlZm9yZVxuJiM0MzsgKiB3aGVuIGZpbHRlcmluZyBieSB0aGVzZSBjcml0ZXJpYSwgd2UgY29tcGFyZSB0aGUgbGFzdCA2NCBjaGFyYWN0ZXJzIHRvXG4mIzQzOyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fU1RSX1NJWkVcdDY0XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQge1xuJiM0MztcdF9fdTY0IGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWcge1xuJiM0MztcdC8qIExvbmdlciBuYW1lcyBhcmUgdHJpbW1lZCAqL1xuJiM0MztcdGNoYXIgbW9kbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdO1xuJiM0MztcdGNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTtcbiYjNDM7XHRjaGFyIGZpbGVuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4mIzQzO1x0X191NjQgbGluZW5vO1xuJiM0MztcdC8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqL1xuJiM0MztcdF9fdTY0IGluYWNjdXJhdGU7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBUaGUgYWxpZ25tZW50IGVuc3VyZXMgMzItYml0IGNvbXBhdGlibGUgaW50ZXJmYWNlcyBhcmUgbm90IGJyb2tlbiAqL1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvdW50ZXIge1xuJiM0MztcdF9fdTY0IGJ5dGVzO1xuJiM0MztcdF9fdTY0IGNhbGxzO1xuJiM0MztcdF9fdTggYWNjdXJhdGU7XG4mIzQzO30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWcgdGFnO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7ZW51bSB7XG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FLFxuJiM0MztcdEFMTE9DSU5GT19GSUxURVJfRlVOQ1RJT04sXG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX0xJTkVOTyxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUsXG4mIzQzO1x0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcbiYjNDM7XHRBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFLFxuJiM0MztcdF9fQUxMT0NJTkZPX0ZJTFRFUl9MQVNUID0gQUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRVxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTU9ETkFNRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FKVxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTilcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfRklMRU5BTUUpXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOT1x0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8pXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFXHRcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFKVxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLUyBcXFxuJiM0MztcdCgoMSBcdTAwM2NcdTAwM2MgKF9fQUxMT0NJTkZPX0ZJTFRFUl9MQVNUICYjNDM7IDEpKSAtIDEpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7XG4mIzQzO1x0X191NjQgbWFzazsgLyogYml0bWFzayBvZiB0aGUgZmlsdGVyIGZpZWxkcyB1c2VkICovXG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWcgZmllbGRzO1xuJiM0MztcdF9fdTY0IG1pbl9zaXplO1xuJiM0MztcdF9fdTY0IG1heF9zaXplO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb19nZXRfYXQge1xuJiM0MztcdC8qIGlucHV0cyAqL1xuJiM0MztcdF9fdTY0IHBvcztcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4mIzQzO1x0Lyogb3V0cHV0ICovXG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXHQwXG4mIzQzOyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX0FUXHRcdDFcbiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRVx0XHQweEE2XG4mIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZClcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9BVFx0XHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdClcbiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUXHRcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCxcdFxcXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi9cbmRpZmYgLS1naXQgYS9saWIvY29kZXRhZy5jIGIvbGliL2NvZGV0YWcuY1xuaW5kZXggNDAwMWE3ZWE2Njc1NDIuLmE5Y2RhNGM5NjJhMzAzIDEwMDY0NFxuLS0tIGEvbGliL2NvZGV0YWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbGliL2NvZGV0YWcuY1xuQEAgLTE5LDYgJiM0MzsxOSw4IEBAIHN0cnVjdCBjb2RldGFnX3R5cGUge1xuIFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XG4gXHQvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgbmV4dF9tb2Rfc2VxO1xuJiM0MztcdC8qIGJ1bXBlZCBvbiBldmVyeSBtb2R1bGUgbG9hZCBhbmQgdW5sb2FkICovXG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjb250ZW50X2lkO1xuIH07XG4gXG4gc3RydWN0IGNvZGV0YWdfcmFuZ2Uge1xuQEAgLTUwLDYgJiM0Mzs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiBcdHVwX3JlYWQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiB9XG4gXG4mIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjdHR5cGUtXHUwMDNlY29udGVudF9pZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGN0dHlwZS1cdTAwM2Vjb3VudDtcbiYjNDM7fVxuJiM0MztcbiBzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBjb2RldGFnX2dldF9jdF9pdGVyKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyID0ge1xuQEAgLTIwNCw2ICYjNDM7MjIwLDcgQEAgc3RhdGljIGludCBjb2RldGFnX21vZHVsZV9pbml0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSwgc3RydWN0IG1vZHVsZSAqbW9kKVxuIFxuIFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIFx0Y21vZC1cdTAwM2Vtb2Rfc2VxID0gJiM0MzsmIzQzO2N0dHlwZS1cdTAwM2VuZXh0X21vZF9zZXE7XG4mIzQzO1x0JiM0MzsmIzQzO2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0bW9kX2lkID0gaWRyX2FsbG9jKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfaWRyLCBjbW9kLCAwLCAwLCBHRlBfS0VSTkVMKTtcbiBcdGlmIChtb2RfaWQgXHUwMDNlPSAwKSB7XG4gXHRcdGlmIChjdHR5cGUtXHUwMDNlZGVzYy5tb2R1bGVfbG9hZCkge1xuQEAgLTM2OCw2ICYjNDM7Mzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuIFx0XHRcdGN0dHlwZS1cdTAwM2Vjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgXHUwMDI2Y21vZC1cdTAwM2VyYW5nZSk7XG4gXHRcdFx0aWRyX3JlbW92ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcbiBcdFx0XHRrZnJlZShjbW9kKTtcbiYjNDM7XHRcdFx0JiM0MzsmIzQzO2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0XHR9XG4gXHRcdHVwX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gXHRcdGlmIChmb3VuZCBcdTAwMjZcdTAwMjYgY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCBjZjY1ZTk5OTJmZGEzMy4uMmM4MTlmYTllYWZhZDAgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vYWxsb2NfdGFnLmNcbkBAIC01LDYgJiM0Mzs1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2thbGxzeW1zLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZV9leHQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BnYWxsb2NfdGFnLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX2ZzLmhcdTAwM2VcbkBAIC0xNCw2ICYjNDM7MTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19jaG9pY2VzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bWFsbG9jLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rbWVtbGVhay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7cGFnZV9hbGxvYy5oXCYjMzQ7XG5AQCAtNTAsNiAmIzQzOzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyO1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcbiBcdGJvb2wgcHJpbnRfaGVhZGVyO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbiYjNDM7XHQvKiBpb2N0bCB1c2VzIGEgc2VwYXJhdGUgaXRlcmF0b3Igbm90IHRvIGludGVyZmVyZSB3aXRoIHJlYWRzICovXG4mIzQzO1x0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjtcbiYjNDM7XHRib29sIHBvc2l0aW9uZWQ7IC8qIHNlcV9vcGVuX3ByaXZhdGUoKSBzZXRzIHRvIDAgKi9cbiYjNDM7XHRzdHJ1Y3QgbXV0ZXggaW9jdGxfbG9jaztcbiB9O1xuIFxuIHN0YXRpYyB2b2lkICphbGxvY2luZm9fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcylcbkBAIC0xMzMsNiAmIzQzOzE0MCwzNDAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhbGxvY2luZm9fc2VxX29wID0ge1xuIFx0LnNob3dcdD0gYWxsb2NpbmZvX3Nob3csXG4gfTtcbiBcbiYjNDM7LypcbiYjNDM7ICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nXG4mIzQzOyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbiYjNDM7XHRcdFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpKTtcbiYjNDM7XHRpZiAoIXJldCkge1xuJiM0MztcdFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0XHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBDbGVhbnMgdXAgdGhlIHNlcV9maWxlIHN0YXRlIGFuZCBmcmVlcyB1cCB0aGUgcHJpdmF0ZSBzdGF0ZSBhbGxvY2F0ZWQgaW5cbiYjNDM7ICogYWxsb2NpbmZvX29wZW4oKSB3aGVuIGNsb3NpbmcgdGhlIC9wcm9jL2FsbG9jaW5mbyBmaWxlIGRlc2NyaXB0b3IuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9kZXN0cm95KFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4mIzQzO1x0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHNvIHRoYXQgaXRzIGxlbmd0aCBmaXRzIHdpdGhpblxuJiM0MzsgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuXG4mIzQzOyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4mIzQzOyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG9cbiYjNDM7ICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAgYW4gZXh0cmEgc3BhY2UgZm9yIHRoZSB0cmFpbGluZyBOVUxMLiAqL1xuJiM0MztcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4mIzQzO1x0XHRzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7XG4mIzQzO1x0cmV0dXJuIHN0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ29weSBhIHN0cmluZyBhbmQgdHJpbSBmcm9tIHRoZSBiZWdpbm5pbmcgaWYgaXQmIzM5O3MgdG9vIGxvbmcgKi9cbiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbiYjNDM7e1xuJiM0MztcdHN0cnNjcHlfcGFkKGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ29tcGFyZSB0d28gc3RyaW5ncyBhbmQgb25seSBjb25zaWRlciB0aGUgdHJpbW1lZCBzdWZmaXggaWYgczEgaXMgdG9vIGxvbmcgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fY21wX3N0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHN0cm5jbXAoYWxsb2NpbmZvX3N0cihzdHIpLCB0ZW1wbGF0ZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmV0Y2ggdGhlIHBlci1DUFUgY291bnRlcnMgKi9cbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYWxsb2NfdGFnX3JlYWQoY3RfdG9fYWxsb2NfdGFnKGN0KSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWVcbiYjNDM7ICogcHJvZmlsaW5nIGNvdW50ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBnaXZlbiBrZXJuZWwgY29kZXRhZy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuJiM0MztcdFx0XHRcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMpXG4mIzQzO3tcbiYjNDM7XHRpZiAoY3QtXHUwMDNlbW9kbmFtZSlcbiYjNDM7XHRcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVx1MDAzZXRhZy5tb2RuYW1lLCBjdC1cdTAwM2Vtb2RuYW1lKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRkYXRhLVx1MDAzZXRhZy5tb2RuYW1lWzBdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcuZnVuY3Rpb24sIGN0LVx1MDAzZWZ1bmN0aW9uKTtcbiYjNDM7XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcuZmlsZW5hbWUsIGN0LVx1MDAzZWZpbGVuYW1lKTtcbiYjNDM7XHRkYXRhLVx1MDAzZXRhZy5saW5lbm8gPSBjdC1cdTAwM2VsaW5lbm87XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmJ5dGVzID0gY291bnRlcnMtXHUwMDNlYnl0ZXM7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmNhbGxzID0gY291bnRlcnMtXHUwMDNlY2FsbHM7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBjb250ZW50IElEIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uIHRhZyBtb2R1bGVcbiYjNDM7ICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBwYXJhbXM7XG4mIzQzO1xuJiM0MztcdGNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XG4mIzQzOyAqIG1hdGNoaW5nIGl0cyBjaGFyYWN0ZXJpc3RpY3MgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGZpbHRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMsXG4mIzQzO1x0XHRcdCAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpXG4mIzQzO3tcbiYjNDM7XHRib29sIGluYWNjdXJhdGU7XG4mIzQzO1xuJiM0MztcdGlmICghZmlsdGVyIHx8ICFmaWx0ZXItXHUwMDNlbWFzaylcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcbiYjNDM7XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FKSB7XG4mIzQzO1x0XHQvKiB1c2VyIHdhbnRzIHRvIGZpbHRlciBieSBtb2RuYW1lIGJ1dCBjdC1cdTAwM2Vtb2RuYW1lIGlzIE5VTEwgKi9cbiYjNDM7XHRcdGlmICghY3QtXHUwMDNlbW9kbmFtZSkge1xuJiM0MztcdFx0XHQvKiB2YWxpZGF0ZSBpZiB1c2VyIHdhcyBhdHRlbXB0aW5nIHRvIGZpbHRlciBmb3IgYnVpbHQtaW4gYWxsb2NhdGlvbnMgKi9cbiYjNDM7XHRcdFx0aWYgKGZpbHRlci1cdTAwM2VmaWVsZHMubW9kbmFtZVswXSAhPSAmIzM5O1xcMCYjMzk7KVxuJiM0MztcdFx0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdH0gZWxzZSBpZiAoYWxsb2NpbmZvX2NtcF9zdHIoY3QtXHUwMDNlbW9kbmFtZSwgZmlsdGVyLVx1MDAzZWZpZWxkcy5tb2RuYW1lKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3QtXHUwMDNlZnVuY3Rpb24gXHUwMDI2XHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZWZ1bmN0aW9uLCBmaWx0ZXItXHUwMDNlZmllbGRzLmZ1bmN0aW9uKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgY3QtXHUwMDNlZmlsZW5hbWUgXHUwMDI2XHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZWZpbGVuYW1lLCBmaWx0ZXItXHUwMDNlZmllbGRzLmZpbGVuYW1lKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGN0LVx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xuJiM0MztcdFx0aW5hY2N1cmF0ZSA9ICEhKGN0LVx1MDAzZWZsYWdzIFx1MDAyNiBDT0RFVEFHX0ZMQUdfSU5BQ0NVUkFURSk7XG4mIzQzO1x0XHRpZiAoaW5hY2N1cmF0ZSAhPSAhIShmaWx0ZXItXHUwMDNlZmllbGRzLmluYWNjdXJhdGUpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7XG4mIzQzO1x0XHRpZiAoISpmZXRjaGVkX2NvdW50ZXJzKSB7XG4mIzQzO1x0XHRcdCpjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRcdCpmZXRjaGVkX2NvdW50ZXJzID0gdHJ1ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgY291bnRlcnMtXHUwMDNlYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjb3VudGVycy1cdTAwM2VieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2Vla3MgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgMC1pbmRleGVkIHRhZyBwb3NpdGlvbiwgcmVhZHMgaXRzXG4mIzQzOyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXY7XG4mIzQzO1x0c3RydWN0IGNvZGV0YWcgKmN0O1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcbiYjNDM7XHRfX3U2NCBza2lwX2NvdW50O1xuJiM0MztcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcnM7XG4mIzQzO1x0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xuJiM0MztcbiYjNDM7XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2cGFyYW1zLCBhcmcsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyYW1zLmZpbHRlci5tYXNrIFx1MDAyNiB+QUxMT0NJTkZPX0ZJTFRFUl9NQVNLUylcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRpZiAoKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgcGFyYW1zLmZpbHRlci5taW5fc2l6ZSBcdTAwM2UgcGFyYW1zLmZpbHRlci5tYXhfc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4mIzQzO1x0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyYW1zLnBvcyBcdTAwM2U9IGNvZGV0YWdfZ2V0X2NvdW50KGFsbG9jX3RhZ19jdHR5cGUpKSB7XG4mIzQzO1x0XHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRza2lwX2NvdW50ID0gcGFyYW1zLnBvcztcbiYjNDM7XG4mIzQzO1x0aWYgKHBhcmFtcy5maWx0ZXIubWFzaylcbiYjNDM7XHRcdHByaXYtXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwcml2LVx1MDAzZWZpbHRlci5tYXNrID0gMDtcbiYjNDM7XG4mIzQzO1x0LyogRmluZCB0aGUgY29kZXRhZyAqL1xuJiM0MztcdHByaXYtXHUwMDNlaW9jdGxfaXRlciA9IGNvZGV0YWdfZ2V0X2N0X2l0ZXIoYWxsb2NfdGFnX2N0dHlwZSk7XG4mIzQzO1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGN0KSB7XG4mIzQzO1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFx1MDAyNnByaXYtXHUwMDNlZmlsdGVyLCBcdTAwMjZjb3VudGVycywgXHUwMDI2ZmV0Y2hlZF9jb3VudGVycykpIHtcbiYjNDM7XHRcdFx0aWYgKHNraXBfY291bnQgPT0gMClcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0c2tpcF9jb3VudC0tO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdCkge1xuJiM0MztcdFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxuJiM0MztcdFx0XHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMuZGF0YSwgXHUwMDI2Y291bnRlcnMpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAoIWN0KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9FTlQ7XG4mIzQzO1xuJiM0MztcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWR2YW5jZXMgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGFsbG9jYXRpb24gdGFnIGluIHRoZSBzZXF1ZW5jZSBhbmRcbiYjNDM7ICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xuJiM0MztcdHN0cnVjdCBjb2RldGFnICpjdDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtcztcbiYjNDM7XHRpbnQgcmV0ID0gMDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXJzO1xuJiM0MztcdGJvb2wgZmV0Y2hlZF9jb3VudGVycztcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xuJiM0MztcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbiYjNDM7XHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4mIzQzO1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2Vwb3NpdGlvbmVkKSB7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGN0ID0gY29kZXRhZ19uZXh0X2N0KFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfaXRlcik7XG4mIzQzO1x0d2hpbGUgKGN0KSB7XG4mIzQzO1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFx1MDAyNnByaXYtXHUwMDNlZmlsdGVyLCBcdTAwMjZjb3VudGVycywgXHUwMDI2ZmV0Y2hlZF9jb3VudGVycykpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjdCkge1xuJiM0MztcdFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxuJiM0MztcdFx0XHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XG4mIzQzO1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMsIFx1MDAyNmNvdW50ZXJzKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFjdCkge1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XG4mIzQzO1x0XHRyZXQgPSAtRU5PRU5UO1xuJiM0MztcdH1cbiYjNDM7XHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSAwKSB7XG4mIzQzO1x0XHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2cGFyYW1zLCBzaXplb2YocGFyYW1zKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFbnRyeSBwb2ludCBpb2N0bCBmdW5jdGlvbiBmb3IgL3Byb2MvYWxsb2NpbmZvIHJvdXRpbmcgcmVxdWVzdHMgdG8gZmV0Y2ggdGhlXG4mIzQzOyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBsb25nIGFsbG9jaW5mb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4mIzQzO3tcbiYjNDM7XHR2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopX19hcmc7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChjbWQpIHtcbiYjNDM7XHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcbiYjNDM7XHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XG4mIzQzO1x0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxuJiM0MztcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldCA9IC1FTk9JT0NUTENNRDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2lmZGVmIENPTkZJR19DT01QQVRcbiYjNDM7c3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGFyZylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBhbGxvY2luZm9fcHJvY19vcHMgPSB7XG4mIzQzO1x0LnByb2Nfb3Blblx0XHQ9IGFsbG9jaW5mb19vcGVuLFxuJiM0MztcdC5wcm9jX3JlYWRfaXRlclx0XHQ9IHNlcV9yZWFkX2l0ZXIsXG4mIzQzO1x0LnByb2NfbHNlZWtcdFx0PSBzZXFfbHNlZWssXG4mIzQzO1x0LnByb2NfcmVsZWFzZVx0XHQ9IGFsbG9jaW5mb19yZWxlYXNlLFxuJiM0MztcdC5wcm9jX2lvY3RsXHRcdD0gYWxsb2NpbmZvX2lvY3RsLFxuJiM0MzsjaWZkZWYgQ09ORklHX0NPTVBBVFxuJiM0MztcdC5wcm9jX2NvbXBhdF9pb2N0bFx0PSBhbGxvY2luZm9fY29tcGF0X2lvY3RsLFxuJiM0MzsjZW5kaWZcbiYjNDM7fTtcbiYjNDM7XG4gc2l6ZV90IGFsbG9jX3RhZ190b3BfdXNlcnMoc3RydWN0IGNvZGV0YWdfYnl0ZXMgKnRhZ3MsIHNpemVfdCBjb3VudCwgYm9vbCBjYW5fc2xlZXApXG4ge1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjtcbkBAIC05ODQsOCAmIzQzOzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKVxuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XG4mIzQzO1x0aWYgKCFwcm9jX2NyZWF0ZShBTExPQ0lORk9fRklMRV9OQU1FLCAwNDAwLCBOVUxMLCBcdTAwMjZhbGxvY2luZm9fcHJvY19vcHMpKSB7XG4gXHRcdHByX2VycihcJiMzNDtGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcXG5cJiMzNDssIEFMTE9DSU5GT19GSUxFX05BTUUpO1xuIFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuaW5kZXggOGQ0ZGIyMjQxY2MyYTIuLjEyOTQxZDY4YTdmOGFlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtMSw1ICYjNDM7MSw2IEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIFRBUkdFVFMgJiM0Mzs9IGFjY3RcbiYjNDM7VEFSR0VUUyAmIzQzOz0gYWxsb2NfdGFnXG4gVEFSR0VUUyAmIzQzOz0gYWxzYVxuIFRBUkdFVFMgJiM0Mzs9IGFtZC1wc3RhdGVcbiBUQVJHRVRTICYjNDM7PSBhcm02NFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5mNDFkOTJkMDZiMTg0OFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXG5AQCAtMCwwICYjNDM7MSw5IEBAXG4mIzQzOyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzO1RFU1RfR0VOX1BST0dTIDo9IGFsbG9jaW5mb19pb2N0bF90ZXN0XG4mIzQzO1xuJiM0MztDRkxBR1MgJiM0Mzs9IC1XYWxsXG4mIzQzO0NGTEFHUyAmIzQzOz0gJChLSERSX0lOQ0xVREVTKVxuJiM0MztcbiYjNDM7aW5jbHVkZSAuLi9saWIubWtcbiYjNDM7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43ZDk0YWJiNzg1YTE0OFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmNcbkBAIC0wLDAgJiM0MzsxLDU0OCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzO1xuJiM0MzsvKiBrc2VsZnRlc3QgZm9yIGFsbG9jaW5mbyBpb2N0bFxuJiM0MzsgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYWxsb2NfdGFnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4va3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTUFYX0xJTkVfTEVOXHRcdDUxMlxuJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19QUk9DXHRcdFwmIzM0Oy9wcm9jL2FsbG9jaW5mb1wmIzM0O1xuJiM0MztcbiYjNDM7ZW51bSBpb2N0bF9yZXQge1xuJiM0MztcdElPQ1RMX1NVQ0NFU1MgPSAwLFxuJiM0MztcdElPQ1RMX0ZBSUxVUkUgPSAxLFxuJiM0MztcdElPQ1RMX0lOVkFMSURfREFUQSA9IDIsXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFZFQ19NQVhfRU5UUklFUyAzMlxuJiM0MztcbiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMge1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgdGFnW1ZFQ19NQVhfRU5UUklFU107XG4mIzQzO1x0X191NjQgY291bnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X2F0KGludCBkZXZfZmQsIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0ICpwYXJhbXMpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0dFVF9BVCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X25leHQoaW50IGRldl9mZCwgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcGFyYW1zKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxuJiM0MztcdFx0XHRjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YWdfZGF0YSxcbiYjNDM7XHRcdFx0Ym9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXG4mIzQzO1x0XHRcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpZiAobWF0Y2hfYnl0ZXMgXHUwMDI2XHUwMDI2IHRhZ19kYXRhLVx1MDAzZWNvdW50ZXIuYnl0ZXMgIT0gcHJvY2ZzX2VudHJ5LVx1MDAzZWNvdW50ZXIuYnl0ZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O3NpemUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtYXRjaF9jYWxscyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXHUwMDNlY291bnRlci5jYWxscykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Y2FsbCBjb3VudCByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hdGNoX2xpbmVubyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNldGFnLmxpbmVubyAhPSBwcm9jZnNfZW50cnktXHUwMDNldGFnLmxpbmVubykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWF0Y2hfZnVuY3Rpb24gXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHN0cm5jbXAodGFnX2RhdGEtXHUwMDNldGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1hdGNoX2ZpbGVuYW1lIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBzdHJuY21wKHRhZ19kYXRhLVx1MDAzZXRhZy5maWxlbmFtZSwgcHJvY2ZzX2VudHJ5LVx1MDAzZXRhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7ZmlsZW5hbWUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIG1hdGNoX2VudHJpZXMoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxuJiM0MztcdFx0XHQgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuJiM0MztcdFx0XHQgIGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLFxuJiM0MztcdFx0XHQgIGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRfX3U2NCBpO1xuJiM0MztcbiYjNDM7XHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgIT0gdGFncy1cdTAwM2Vjb3VudCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RW50cnkgY291bnQgbWlzbWF0Y2guIGlvY3RsIGVudHJpZXM6ICVsbHUsIHByb2MgZW50cmllczogJWxsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHRhZ3MtXHUwMDNlY291bnQsIHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIW1hdGNoX2VudHJ5KFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1tpXSwgXHUwMDI2dGFncy1cdTAwM2V0YWdbaV0sXG4mIzQzO1x0XHRcdFx0IG1hdGNoX2J5dGVzLCBtYXRjaF9jYWxscywgbWF0Y2hfbGluZW5vLFxuJiM0MztcdFx0XHRcdCBtYXRjaF9mdW5jdGlvbiwgbWF0Y2hfZmlsZW5hbWUpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVsbHV0aCBlbnRyeSBkb2VzIG5vdCBtYXRjaC5cXG5cJiMzNDssIGkpO1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4mIzQzO1xuJiM0MztcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4mIzQzO1x0XHRzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7XG4mIzQzO1x0cmV0dXJuIHN0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbiYjNDM7e1xuJiM0MztcdHN0cm5jcHkoZGVzdCwgYWxsb2NpbmZvX3N0cihzcmMpLCBBTExPQ0lORk9fU1RSX1NJWkUgLSAxKTtcbiYjNDM7XHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxuJiM0MztcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxuJiM0Mzt7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihBTExPQ0lORk9fUFJPQywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0Y2hhciBsaW5lW01BWF9MSU5FX0xFTl07XG4mIzQzO1x0aW50IG1hdGNoZXM7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBwcm9jZnNfZW50cnk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZhaWxlZCB0byBvcGVuIFwmIzM0OyBBTExPQ0lORk9fUFJPQyBcJiMzNDsgZm9yIHJlYWRpbmdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0fVxuJiM0MztcdG1lbXNldChwcm9jZnNfZW50cmllcywgMCwgc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUykge1xuJiM0MztcdFx0Y2hhciBmaWxlbmFtZVtNQVhfTElORV9MRU5dO1xuJiM0MztcdFx0Y2hhciBmdW5jdGlvbltNQVhfTElORV9MRU5dO1xuJiM0MztcbiYjNDM7XHRcdG1lbXNldChcdTAwMjZwcm9jZnNfZW50cnksIDAsIHNpemVvZihwcm9jZnNfZW50cnkpKTtcbiYjNDM7XHRcdG1hdGNoZXMgPSBzc2NhbmYobGluZSwgXCYjMzQ7JWxsdSAlbGx1ICVbXjpdOiVsbHUgZnVuYzolc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgXHUwMDI2cHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMsXG4mIzQzO1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLFxuJiM0MztcdFx0XHRcdCBmaWxlbmFtZSxcbiYjNDM7XHRcdFx0XHQgXHUwMDI2cHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8sXG4mIzQzO1x0XHRcdFx0IGZ1bmN0aW9uKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWF0Y2hlcyAhPSA1KVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5maWxlbmFtZSwgZmlsZW5hbWUpO1xuJiM0MztcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sIGZ1bmN0aW9uKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkge1xuJiM0MztcdFx0XHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdCAgICBmaWx0ZXItXHUwMDNlZmllbGRzLmZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHtcbiYjNDM7XHRcdFx0aWYgKHN0cm5jbXAocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbixcbiYjNDM7XHRcdFx0XHQgICAgZmlsdGVyLVx1MDAzZWZpZWxkcy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xuJiM0MztcdFx0XHRpZiAocHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8gIT0gZmlsdGVyLVx1MDAzZWZpZWxkcy5saW5lbm8pXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkge1xuJiM0MztcdFx0XHRpZiAocHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSB7XG4mIzQzO1x0XHRcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZwcm9jZnNfZW50cmllcy1cdTAwM2V0YWdbcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2cHJvY2ZzX2VudHJ5LFxuJiM0MztcdFx0ICAgICAgIHNpemVvZihwcm9jZnNfZW50cnkpKTtcbiYjNDM7XHR9XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGVudW0gaW9jdGxfcmV0IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuJiM0MztcdFx0XHRcdFx0XHQgY29uc3Qgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbiYjNDM7XHRcdFx0XHRcdFx0IF9fdTY0IHN0YXJ0X3BvcylcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oQUxMT0NJTkZPX1BST0MsIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGYWlsZWQgdG8gb3BlbiBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7IGZvciBJT0NUTFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gSU9DVExfRkFJTFVSRTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBzdGFydF9jb250X2lkLCBlbmRfY29udF9pZDtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuJiM0MztcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xuJiM0MztcdGludCByZXRyeV9jb3VudCA9IDA7XG4mIzQzO1x0aW50IHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgaWYgYSBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWRcbiYjNDM7XHQgKiBiZXR3ZWVuIHRoZSB0d28gY2FsbHMuIElmIHRoYXQgaGFwcGVucywgdGhlIGRhdGEgZ2F0aGVyZWQgY2Fubm90IGJlIGNvbnNpZGVyZWQgY29uc2lzdGVudFxuJiM0MztcdCAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBmZXRjaGVkIGFnYWluIHRvIGF2b2lkIGZsYWtpbmVzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFx1MDAyNnN0YXJ0X2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRtZW1zZXQodGFncywgMCwgc2l6ZW9mKCp0YWdzKSk7XG4mIzQzO1x0XHRtZW1zZXQoXHUwMDI2Z2V0X2F0X3BhcmFtcywgMCwgc2l6ZW9mKGdldF9hdF9wYXJhbXMpKTtcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgZmlsdGVyLCBzaXplb2YoKmZpbHRlcikpO1xuJiM0MztcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XG4mIzQzO1x0XHRpZiAoX19hbGxvY2luZm9fZ2V0X2F0KGZkLCBcdTAwMjZnZXRfYXRfcGFyYW1zKSkge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDthbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bWVtY3B5KFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLCBzaXplb2YoZ2V0X2F0X3BhcmFtcy5kYXRhKSk7XG4mIzQzO1xuJiM0MztcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXHUwMDI2dGFncy1cdTAwM2V0YWdbdGFncy1cdTAwM2Vjb3VudF0pID09IDApXG4mIzQzO1x0XHRcdHRhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7O1xuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZCkge1xuJiM0MztcdFx0XHRzdGF0dXMgPSBJT0NUTF9TVUNDRVNTO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIG1pc21hdGNoLCByZXRyeWluZy4uLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHN0YXR1cyA9IElPQ1RMX0lOVkFMSURfREFUQTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IHdoaWxlIChzdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBIFx1MDAyNlx1MDAyNiByZXRyeV9jb3VudCYjNDM7JiM0MzsgXHUwMDNjIG1heF9yZXRyaWVzKTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiBzdGF0dXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuJiM0MztcdGludCBpb2N0bF9zdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IEtTRlRfUEFTUztcbiYjNDM7XG4mIzQzO1x0aWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7TWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCA9PSAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtObyBlbnRyaWVzIGZvdW5kIGluIFwmIzM0OyBBTExPQ0lORk9fUFJPQyBcJiMzNDssIHNraXBwaW5nIHRlc3RcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9TS0lQO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgZmlsdGVyLCAwKTtcbiYjNDM7XHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1xuJiM0MztleGl0OlxuJiM0MztcdGZyZWUodGFncyk7XG4mIzQzO1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuJiM0MztcdGNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9IFwmIzM0O21tL21lbW9yeS5jXCYjMzQ7O1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XG4mIzQzO1x0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FO1xuJiM0MztcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5maWxlbmFtZSwgdGFyZ2V0X2ZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcnVuX2ZpbHRlcl90ZXN0KFx1MDAyNmZpbHRlcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgdGVzdF9mdW5jdGlvbl9maWx0ZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbiYjNDM7XHRjb25zdCBjaGFyICp0YXJnZXRfZnVuY3Rpb24gPSBcJiMzNDtkdXBfbW1cJiMzNDs7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbiYjNDM7XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047XG4mIzQzO1x0c3RybmNweShmaWx0ZXIuZmllbGRzLmZ1bmN0aW9uLCB0YXJnZXRfZnVuY3Rpb24sIEFMTE9DSU5GT19TVFJfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXHUwMDI2ZmlsdGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X3NpemVfZmlsdGVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbiYjNDM7XHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4mIzQzO1x0aW50IHJldCA9IEtTRlRfUEFTUztcbiYjNDM7XHRfX3U2NCB0YXJnZXRfc2l6ZSwgaSwgcG9zO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7XG4mIzQzO1x0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXCYjMzQ7ZG9faW5pdF9tb2R1bGVcJiMzNDs7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xuJiM0MztcdGludCByZXRyeSA9IDA7XG4mIzQzO1x0Y29uc3QgaW50IG1heF9yZXRyaWVzID0gMTA7XG4mIzQzO1xuJiM0MztcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0Z290byBmcmVlbWVtO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtGYWlsZWQgdG8gb3BlbiBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7OiAlc1xcblwmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZnJlZW1lbTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGZvdW5kX3RhZyA9IE5VTEw7XG4mIzQzO1x0XHRwb3MgPSAwO1xuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfRkFJTDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbiYjNDM7XHRcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjtcbiYjNDM7XHRcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIFx1MDAyNmZpbHRlcikpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCYjMzQ7IEFMTE9DSU5GT19QUk9DIFwmIzM0O1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCA9PSAwKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0Z1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcXG5cJiMzNDssIHRhcmdldF9mdW5jdGlvbik7XG4mIzQzO1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdFx0Z290byBleGl0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRhcmdldF9zaXplID0gcHJvY2ZzX2VudHJpZXMtXHUwMDNldGFnWzBdLmNvdW50ZXIuYnl0ZXM7XG4mIzQzO1xuJiM0MztcdFx0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuJiM0MztcdFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFIHwgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFO1xuJiM0MztcdFx0ZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7XG4mIzQzO1x0XHRmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAoMSkge1xuJiM0MztcdFx0XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuJiM0MztcbiYjNDM7XHRcdFx0bWVtc2V0KFx1MDAyNmdldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7XG4mIzQzO1x0XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXHUwMDI2ZmlsdGVyLCBzaXplb2YoZmlsdGVyKSk7XG4mIzQzO1x0XHRcdGdldF9hdF9wYXJhbXMucG9zID0gcG9zO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9hdChmZCwgXHUwMDI2Z2V0X2F0X3BhcmFtcykpXG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0XHR0YWdzLVx1MDAzZWNvdW50ID0gMDtcbiYjNDM7XHRcdFx0bWVtY3B5KFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnQmIzQzOyYjNDM7XSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxuJiM0MztcdFx0XHQgICAgICAgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xuJiM0MztcbiYjNDM7XHRcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgICAgIF9fYWxsb2NpbmZvX2dldF9uZXh0KGZkLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50XSkgPT0gMClcbiYjNDM7XHRcdFx0XHR0YWdzLVx1MDAzZWNvdW50JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKHN0cmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xuJiM0MztcdFx0XHRcdFx0Zm91bmRfdGFnID0gXHUwMDI2dGFncy1cdTAwM2V0YWdbaV07XG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChmb3VuZF90YWcgfHwgdGFncy1cdTAwM2Vjb3VudCBcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdFx0cG9zICYjNDM7PSB0YWdzLVx1MDAzZWNvdW50O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7TW9kdWxlIGxvYWQgZGV0ZWN0ZWQgZHVyaW5nIHNpemUgdmVyaWZpY2F0aW9uLCByZXRyeWluZy4uLlxcblwmIzM0Oyk7XG4mIzQzO1x0fSB3aGlsZSAocmV0cnkmIzQzOyYjNDM7IFx1MDAzYyBtYXhfcmV0cmllcyk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkIFx1MDAyNlx1MDAyNiAhZm91bmRfdGFnKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgdGFyZ2V0X2Z1bmN0aW9uKTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfRkFJTDtcbiYjNDM7XHR9IGVsc2UgaWYgKHN0YXJ0X2NvbnRfaWQuaWQgIT0gZW5kX2NvbnRfaWQuaWQpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9TS0lQO1xuJiM0MztcdH0gZWxzZSBpZiAoZm91bmRfdGFnIFx1MDAyNlx1MDAyNiBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcyAhPSB0YXJnZXRfc2l6ZSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7SU9DVEwgZW50cnkgc2l6ZSAlbGx1IGRvZXMgbm90IG1hdGNoIHRhcmdldCBzaXplICVsbHVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcywgdGFyZ2V0X3NpemUpO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO2V4aXQ6XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztmcmVlbWVtOlxuJiM0MztcdGZyZWUodGFncyk7XG4mIzQzO1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0ZXN0X2xpbmVub19maWx0ZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xuJiM0MztcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuJiM0MztcdGVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xuJiM0MztcdF9fdTY0IHRhcmdldF9saW5lbm8sIGk7XG4mIzQzO1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZztcbiYjNDM7XHRib29sIGZvdW5kID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBcdTAwMjZmaWx0ZXIpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcJiMzNDsgQUxMT0NJTkZPX1BST0MgXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IEtTRlRfU0tJUDtcbiYjNDM7XHRcdGdvdG8gZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50ID09IDApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2UgZGVwZW5kIG9uIHRoZSBwcm9jZnMgcmVzdWx0cyB0byBkZXRlcm1pbmUgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgZmlsdGVyIGJlZm9yZVxuJiM0MztcdCAqIG1ha2luZyB0aGUgaW9jdGwgcXVlcnkuIEhlbmNlLCB3ZSBjYW5ub3QgcmV1c2UgcnVuX2ZpbHRlcl90ZXN0IGhlcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0dGFyZ2V0X3RhZyA9IFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1swXTtcbiYjNDM7XHR0YXJnZXRfbGluZW5vID0gdGFyZ2V0X3RhZy1cdTAwM2V0YWcubGluZW5vO1xuJiM0MztcbiYjNDM7XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PO1xuJiM0MztcdGZpbHRlci5maWVsZHMubGluZW5vID0gdGFyZ2V0X2xpbmVubztcbiYjNDM7XG4mIzQzO1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXHUwMDI2ZmlsdGVyLCAwKTtcbiYjNDM7XHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7RXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWdzLVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5saW5lbm8gIT0gdGFyZ2V0X2xpbmVubykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICBpLCB0YWdzLVx1MDAzZXRhZ1tpXS50YWcubGluZW5vKTtcbiYjNDM7XHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuJiM0MztcdFx0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0cm5jbXAodGFncy1cdTAwM2V0YWdbaV0udGFnLmZ1bmN0aW9uLCB0YXJnZXRfdGFnLVx1MDAzZXRhZy5mdW5jdGlvbixcbiYjNDM7XHRcdFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBzdHJuY21wKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5maWxlbmFtZSwgdGFyZ2V0X3RhZy1cdTAwM2V0YWcuZmlsZW5hbWUsXG4mIzQzO1x0XHRcdCAgICBBTExPQ0lORk9fU1RSX1NJWkUpID09IDApXG4mIzQzO1x0XHRcdGZvdW5kID0gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghZm91bmQpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O09yaWdpbmFsIHByb2NmcyBlbnRyeSBub3QgZm91bmQgaW4gSU9DVEwgbGluZW5vIGZpbHRlciByZXN1bHRzLlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7ZXhpdDpcbiYjNDM7XHRmcmVlKHRhZ3MpO1xuJiM0MztcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKDQpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcigpO1xuJiM0MztcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0O1NraXBwaW5nIHRlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwmIzM0O3Rlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gdGVzdF9mdW5jdGlvbl9maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcJiMzNDt0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHRlc3Rfc2l6ZV9maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X3NpemVfZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwmIzM0O3Rlc3Rfc2l6ZV9maWx0ZXJcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRyZXQgPSB0ZXN0X2xpbmVub19maWx0ZXIoKTtcbiYjNDM7XHRpZiAocmV0ID09IEtTRlRfU0tJUClcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDtTa2lwcGluZyB0ZXN0X2xpbmVub19maWx0ZXJcXG5cJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXCYjMzQ7dGVzdF9saW5lbm9fZmlsdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNX0FMTE9DX1BST0ZJTElORyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2F0JiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfbmV4dCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2NvbXBhdF9pb2N0bCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fb3BlbiYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fcmVsZWFzZSYjMzQ7LAogICAgJiMzNDttYXRjaGVzX2ZpbHRlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGlvY3RsIGludGVyZmFjZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHZpYSAvcHJvYy9hbGxvY2luZm8uIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb25hbCBBUEkgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBKdWwgOSAxMTo1MDowMyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3QKaW5kZXggNTM4OWQyNDExNzZhOGEuLmMzYTI4NDY3OTU1ZjNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdApAQCAtNDYsNiAmIzQzOzQ2LDExIEBAIHN5c2N0bDoKIFJ1bnRpbWUgaW5mbzoKICAgL3Byb2MvYWxsb2NpbmZvCiAKJiM0MzsgIFByb2ZpbGluZyBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZWl0aGVyIGJ5IHJlYWRpbmcgYC9wcm9jL2FsbG9jaW5mb2AgZGlyZWN0bHkgYXMKJiM0MzsgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYCZsdDt1YXBpL2xpbnV4L2FsbG9jX3RhZy5oJmd0O2AuCiYjNDM7ICBUaGUgaW9jdGwgaW50ZXJmYWNlIHN1cHBvcnRzIHN0cnVjdHVyZWQgYmluYXJ5IGRhdGEgZXh0cmFjdGlvbiBhcyB3ZWxsIGFzIGZpbHRlcmluZwomIzQzOyAgYnkgbW9kdWxlIG5hbWUsIGZ1bmN0aW9uLCBmaWxlLCBsaW5lIG51bWJlciwgYWNjdXJhY3ksIG9yIGFsbG9jYXRpb24gc2l6ZSBsaW1pdHMuCiYjNDM7CiBFeGFtcGxlIG91dHB1dDo6CiAKICAgcm9vdEBtb3JpYS1rdm06fiMgc29ydCAtZyAvcHJvYy9hbGxvY2luZm98dGFpbHxudW1mbXQgLS10bz1pZWMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0IGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QKaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdApAQCAtMzQ2LDYgJiM0MzszNDYsOCBAQCBDb2RlICBTZXEjICAgIEluY2x1ZGUgRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDttYWlsdG86bHV6bWF4aW1pbGlhbkBnbWFpbC5jb20mZ3Q7CiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbSZndDsKJiM0MzsweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZwomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbSZndDsKIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmgKIDB4QUIgIDAwLTFGICBsaW51eC9uYmQuaAogMHhBQyAgMDAtMUYgIGxpbnV4L3Jhdy5oCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGQxOTgyMmQ1NzRmZDQ4Li4zZDU0ZmQ4ZDY5YzFjNiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKJiM0MzsmIzQzOyYjNDM7IGIvTUFJTlRBSU5FUlMKQEAgLTE2OTM2LDcgJiM0MzsxNjkzNiw5IEBAIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0CiBGOglpbmNsdWRlL2xpbnV4L2FsbG9jX3RhZy5oCiBGOglpbmNsdWRlL2xpbnV4L3BnYWxsb2NfdGFnLmgKJiM0MztGOglpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmgKIEY6CW1tL2FsbG9jX3RhZy5jCiYjNDM7RjoJdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnLwogCiBNRU1PUlkgTUFOQUdFTUVOVCAtIEJBTExPT04KIE06CUFuZHJldyBNb3J0b24gJmx0O2FrcG1AbGludXgtZm91bmRhdGlvbi5vcmcmZ3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaCBiL2luY2x1ZGUvbGludXgvY29kZXRhZy5oCmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb2RldGFnLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmgKQEAgLTc3LDYgJiM0Mzs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHsKIHZvaWQgY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7CiBib29sIGNvZGV0YWdfdHJ5bG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwomIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwomIzQzO3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpOwogc3RydWN0IGNvZGV0YWcgKmNvZGV0YWdfbmV4dF9jdChzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciAqaXRlcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uMjcwZjY5M2IxODIyMDQKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmgKQEAgLTAsMCAmIzQzOzEsOTkgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBXSVRIIExpbnV4LXN5c2NhbGwtbm90ZSAqLwomIzQzOy8qCiYjNDM7ICogYWxsb2NfdGFnIElPQ1RMIEFQSSBkZWZpbml0aW9uCiYjNDM7ICoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgomIzQzOyAqCiYjNDM7ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJiM0MzsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwomIzQzOyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX1VBUElfQUxMT0NfVEFHX0gKJiM0MzsjZGVmaW5lIF9VQVBJX0FMTE9DX1RBR19ICiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBGdW5jdGlvbiwgZmlsZSBhbmQgbW9kdWxlIG5hbWVzIG9mdGVuIGhhdmUgdGhlIHNhbWUgcHJlZml4ZXMsIHRoZXJlZm9yZQomIzQzOyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG8KJiM0MzsgKiBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBuYW1lIGNvbGxpc2lvbnMKJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19TVFJfU0laRQk2NAomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7CiYjNDM7CV9fdTY0IGlkOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWcgewomIzQzOwkvKiBMb25nZXIgbmFtZXMgYXJlIHRyaW1tZWQgKi8KJiM0MzsJY2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07CiYjNDM7CWNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTsKJiM0MzsJY2hhciBmaWxlbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdOwomIzQzOwlfX3U2NCBsaW5lbm87CiYjNDM7CS8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqLwomIzQzOwlfX3U2NCBpbmFjY3VyYXRlOwomIzQzO307CiYjNDM7CiYjNDM7LyogVGhlIGFsaWdubWVudCBlbnN1cmVzIDMyLWJpdCBjb21wYXRpYmxlIGludGVyZmFjZXMgYXJlIG5vdCBicm9rZW4gKi8KJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2NvdW50ZXIgewomIzQzOwlfX3U2NCBieXRlczsKJiM0MzsJX191NjQgY2FsbHM7CiYjNDM7CV9fdTggYWNjdXJhdGU7CiYjNDM7fSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CiYjNDM7c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnIHRhZzsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19jb3VudGVyIGNvdW50ZXI7CiYjNDM7fTsKJiM0MzsKJiM0MztlbnVtIHsKJiM0MzsJQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0ZVTkNUSU9OLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0ZJTEVOQU1FLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX0xJTkVOTywKJiM0MzsJQUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFLAomIzQzOwlBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFLAomIzQzOwlfX0FMTE9DSU5GT19GSUxURVJfTEFTVCA9IEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUUJCSgxICZsdDsmbHQ7IEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTgkJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTikKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRQkJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8JCSgxICZsdDsmbHQ7IEFMTE9DSU5GT19GSUxURVJfTElORU5PKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEUJKDEgJmx0OyZsdDsgQUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFCQkoMSAmbHQ7Jmx0OyBBTExPQ0lORk9fRklMVEVSX01JTl9TSVpFKQomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFCQkoMSAmbHQ7Jmx0OyBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFKQomIzQzOwomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLUyBcCiYjNDM7CSgoMSAmbHQ7Jmx0OyAoX19BTExPQ0lORk9fRklMVEVSX0xBU1QgJiM0MzsgMSkpIC0gMSkKJiM0MzsKJiM0MztzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7CiYjNDM7CV9fdTY0IG1hc2s7IC8qIGJpdG1hc2sgb2YgdGhlIGZpbHRlciBmaWVsZHMgdXNlZCAqLwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7CiYjNDM7CV9fdTY0IG1pbl9zaXplOwomIzQzOwlfX3U2NCBtYXhfc2l6ZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHsKJiM0MzsJLyogaW5wdXRzICovCiYjNDM7CV9fdTY0IHBvczsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyOwomIzQzOwkvKiBvdXRwdXQgKi8KJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lECTAKJiM0MzsjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9BVAkJMQomIzQzOyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQJCTIKJiM0MzsKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRQkJMHhBNgomIzQzOyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lECV9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELAlcCiYjNDM7CQkJCQkgICAgIHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCkKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19JT0NfR0VUX0FUCQlfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCwJXAomIzQzOwkJCQkJICAgICAgc3RydWN0IGFsbG9jaW5mb19nZXRfYXQpCiYjNDM7I2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUCQlfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsCVwKJiM0MzsJCQkJCSAgICAgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSkKJiM0MzsKJiM0MzsjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jb2RldGFnLmMgYi9saWIvY29kZXRhZy5jCmluZGV4IDQwMDFhN2VhNjY3NTQyLi5hOWNkYTRjOTYyYTMwMyAxMDA2NDQKLS0tIGEvbGliL2NvZGV0YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9saWIvY29kZXRhZy5jCkBAIC0xOSw2ICYjNDM7MTksOCBAQCBzdHJ1Y3QgY29kZXRhZ190eXBlIHsKIAlzdHJ1Y3QgY29kZXRhZ190eXBlX2Rlc2MgZGVzYzsKIAkvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi8KIAl1bnNpZ25lZCBsb25nIG5leHRfbW9kX3NlcTsKJiM0MzsJLyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBjb250ZW50X2lkOwogfTsKIAogc3RydWN0IGNvZGV0YWdfcmFuZ2UgewpAQCAtNTAsNiAmIzQzOzUyLDIwIEBAIHZvaWQgY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKQogCXVwX3JlYWQoJmFtcDtjdHR5cGUtJmd0O21vZF9sb2NrKTsKIH0KIAomIzQzO3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y3R0eXBlLSZndDttb2RfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiBjdHR5cGUtJmd0O2NvbnRlbnRfaWQ7CiYjNDM7fQomIzQzOwomIzQzO3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7Y3R0eXBlLSZndDttb2RfbG9jayk7CiYjNDM7CiYjNDM7CXJldHVybiBjdHR5cGUtJmd0O2NvdW50OwomIzQzO30KJiM0MzsKIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKQogewogCXN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXIgPSB7CkBAIC0yMDQsNiAmIzQzOzIyMCw3IEBAIHN0YXRpYyBpbnQgY29kZXRhZ19tb2R1bGVfaW5pdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIAogCWRvd25fd3JpdGUoJmFtcDtjdHR5cGUtJmd0O21vZF9sb2NrKTsKIAljbW9kLSZndDttb2Rfc2VxID0gJiM0MzsmIzQzO2N0dHlwZS0mZ3Q7bmV4dF9tb2Rfc2VxOwomIzQzOwkmIzQzOyYjNDM7Y3R0eXBlLSZndDtjb250ZW50X2lkOwogCW1vZF9pZCA9IGlkcl9hbGxvYygmYW1wO2N0dHlwZS0mZ3Q7bW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1vZF9pZCAmZ3Q7PSAwKSB7CiAJCWlmIChjdHR5cGUtJmd0O2Rlc2MubW9kdWxlX2xvYWQpIHsKQEAgLTM2OCw2ICYjNDM7Mzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKQogCQkJY3R0eXBlLSZndDtjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgJmFtcDtjbW9kLSZndDtyYW5nZSk7CiAJCQlpZHJfcmVtb3ZlKCZhbXA7Y3R0eXBlLSZndDttb2RfaWRyLCBtb2RfaWQpOwogCQkJa2ZyZWUoY21vZCk7CiYjNDM7CQkJJiM0MzsmIzQzO2N0dHlwZS0mZ3Q7Y29udGVudF9pZDsKIAkJfQogCQl1cF93cml0ZSgmYW1wO2N0dHlwZS0mZ3Q7bW9kX2xvY2spOwogCQlpZiAoZm91bmQgJmFtcDsmYW1wOyBjdHR5cGUtJmd0O2Rlc2MuZnJlZV9zZWN0aW9uX21lbSkKZGlmZiAtLWdpdCBhL21tL2FsbG9jX3RhZy5jIGIvbW0vYWxsb2NfdGFnLmMKaW5kZXggY2Y2NWU5OTkyZmRhMzMuLjJjODE5ZmE5ZWFmYWQwIDEwMDY0NAotLS0gYS9tbS9hbGxvY190YWcuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9hbGxvY190YWcuYwpAQCAtNSw2ICYjNDM7NSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgva2FsbHN5bXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbXV0ZXguaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYWdlX2V4dC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3BnYWxsb2NfdGFnLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHJvY19mcy5oJmd0OwpAQCAtMTQsNiAmIzQzOzE1LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmdfY2hvaWNlcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3ZtYWxsb2MuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9rbWVtbGVhay5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1YXBpL2xpbnV4L2FsbG9jX3RhZy5oJmd0OwogCiAjaW5jbHVkZSAmIzM0O2ludGVybmFsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDtwYWdlX2FsbG9jLmgmIzM0OwpAQCAtNTAsNiAmIzQzOzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7CiAJc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjsKIAlzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciByZXBvcnRlZF9pdGVyOwogCWJvb2wgcHJpbnRfaGVhZGVyOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CS8qIGlvY3RsIHVzZXMgYSBzZXBhcmF0ZSBpdGVyYXRvciBub3QgdG8gaW50ZXJmZXJlIHdpdGggcmVhZHMgKi8KJiM0MzsJc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjsKJiM0MzsJYm9vbCBwb3NpdGlvbmVkOyAvKiBzZXFfb3Blbl9wcml2YXRlKCkgc2V0cyB0byAwICovCiYjNDM7CXN0cnVjdCBtdXRleCBpb2N0bF9sb2NrOwogfTsKIAogc3RhdGljIHZvaWQgKmFsbG9jaW5mb19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQpAQCAtMTMzLDYgJiM0MzsxNDAsMzQwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWxsb2NpbmZvX3NlcV9vcCA9IHsKIAkuc2hvdwk9IGFsbG9jaW5mb19zaG93LAogfTsKIAomIzQzOy8qCiYjNDM7ICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nCiYjNDM7ICogdGhlIC9wcm9jL2FsbG9jaW5mbyBwcm9jZnMgZW50cnkuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgJmFtcDthbGxvY2luZm9fc2VxX29wLAomIzQzOwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGFsbG9jaW5mb19wcml2YXRlKSk7CiYjNDM7CWlmICghcmV0KSB7CiYjNDM7CQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CQlzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwkJbXV0ZXhfaW5pdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2xlYW5zIHVwIHRoZSBzZXFfZmlsZSBzdGF0ZSBhbmQgZnJlZXMgdXAgdGhlIHByaXZhdGUgc3RhdGUgYWxsb2NhdGVkIGluCiYjNDM7ICogYWxsb2NpbmZvX29wZW4oKSB3aGVuIGNsb3NpbmcgdGhlIC9wcm9jL2FsbG9jaW5mbyBmaWxlIGRlc2NyaXB0b3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhbGxvY2luZm9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJbXV0ZXhfZGVzdHJveSgmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN1ZmZpeCBvZiBhIHN0cmluZyBzbyB0aGF0IGl0cyBsZW5ndGggZml0cyB3aXRoaW4KJiM0MzsgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuCiYjNDM7ICogRnVuY3Rpb24sIGZpbGUgYW5kIG1vZHVsZSBuYW1lcyBvZnRlbiBoYXZlIHRoZSBzYW1lIHByZWZpeGVzLCB0aGVyZWZvcmUKJiM0MzsgKiB3aGVuIGZpbHRlcmluZyBieSB0aGVzZSBjcml0ZXJpYSwgd2UgY29tcGFyZSB0aGUgbGFzdCA2NCBjaGFyYWN0ZXJzIHRvCiYjNDM7ICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKmFsbG9jaW5mb19zdHIoY29uc3QgY2hhciAqc3RyKQomIzQzO3sKJiM0MzsJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOwomIzQzOwomIzQzOwkvKiBLZWVwIGFuIGV4dHJhIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgTlVMTC4gKi8KJiM0MzsJaWYgKGxlbiAmZ3Q7PSBBTExPQ0lORk9fU1RSX1NJWkUpCiYjNDM7CQlzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7CiYjNDM7CXJldHVybiBzdHI7CiYjNDM7fQomIzQzOwomIzQzOy8qIENvcHkgYSBzdHJpbmcgYW5kIHRyaW0gZnJvbSB0aGUgYmVnaW5uaW5nIGlmIGl0JiMzOTtzIHRvbyBsb25nICovCiYjNDM7c3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKJiM0Mzt7CiYjNDM7CXN0cnNjcHlfcGFkKGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ29tcGFyZSB0d28gc3RyaW5ncyBhbmQgb25seSBjb25zaWRlciB0aGUgdHJpbW1lZCBzdWZmaXggaWYgczEgaXMgdG9vIGxvbmcgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19jbXBfc3RyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqdGVtcGxhdGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gc3RybmNtcChhbGxvY2luZm9fc3RyKHN0ciksIHRlbXBsYXRlLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBGZXRjaCB0aGUgcGVyLUNQVSBjb3VudGVycyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoc3RydWN0IGNvZGV0YWcgKmN0KQomIzQzO3sKJiM0MzsJcmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWUKJiM0MzsgKiBwcm9maWxpbmcgY291bnRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIGtlcm5lbCBjb2RldGFnLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LAomIzQzOwkJCQlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpkYXRhLAomIzQzOwkJCQlzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzICpjb3VudGVycykKJiM0Mzt7CiYjNDM7CWlmIChjdC0mZ3Q7bW9kbmFtZSkKJiM0MzsJCWFsbG9jaW5mb19jb3B5X3N0cihkYXRhLSZndDt0YWcubW9kbmFtZSwgY3QtJmd0O21vZG5hbWUpOwomIzQzOwllbHNlCiYjNDM7CQlkYXRhLSZndDt0YWcubW9kbmFtZVswXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJYWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtJmd0O3RhZy5mdW5jdGlvbiwgY3QtJmd0O2Z1bmN0aW9uKTsKJiM0MzsJYWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtJmd0O3RhZy5maWxlbmFtZSwgY3QtJmd0O2ZpbGVuYW1lKTsKJiM0MzsJZGF0YS0mZ3Q7dGFnLmxpbmVubyA9IGN0LSZndDtsaW5lbm87CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuYnl0ZXMgPSBjb3VudGVycy0mZ3Q7Ynl0ZXM7CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuY2FsbHMgPSBjb3VudGVycy0mZ3Q7Y2FsbHM7CiYjNDM7CWRhdGEtJmd0O2NvdW50ZXIuYWNjdXJhdGUgPSAhYWxsb2NfdGFnX2lzX2luYWNjdXJhdGUoY3RfdG9fYWxsb2NfdGFnKGN0KSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0cmlldmVzIHRoZSB1bmlxdWUgY29udGVudCBJRCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiB0YWcgbW9kdWxlCiYjNDM7ICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgcGFyYW1zOwomIzQzOwomIzQzOwljb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CXBhcmFtcy5pZCA9IGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CWNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwlpZiAoY29weV90b191c2VyKGFyZywgJmFtcDtwYXJhbXMsIHNpemVvZihwYXJhbXMpKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBWZXJpZmllcyB3aGV0aGVyIGEgZ2l2ZW4gY29kZXRhZyBzYXRpc2ZpZXMgdGhlIGFjdGl2ZSBmaWx0ZXJpbmcgY3JpdGVyaWEgYnkKJiM0MzsgKiBtYXRjaGluZyBpdHMgY2hhcmFjdGVyaXN0aWNzIGFnYWluc3QgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hlc19maWx0ZXIoc3RydWN0IGNvZGV0YWcgKmN0LCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyLAomIzQzOwkJCSAgIHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgKmNvdW50ZXJzLAomIzQzOwkJCSAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpCiYjNDM7ewomIzQzOwlib29sIGluYWNjdXJhdGU7CiYjNDM7CiYjNDM7CWlmICghZmlsdGVyIHx8ICFmaWx0ZXItJmd0O21hc2spCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTU9ETkFNRSkgewomIzQzOwkJLyogdXNlciB3YW50cyB0byBmaWx0ZXIgYnkgbW9kbmFtZSBidXQgY3QtJmd0O21vZG5hbWUgaXMgTlVMTCAqLwomIzQzOwkJaWYgKCFjdC0mZ3Q7bW9kbmFtZSkgewomIzQzOwkJCS8qIHZhbGlkYXRlIGlmIHVzZXIgd2FzIGF0dGVtcHRpbmcgdG8gZmlsdGVyIGZvciBidWlsdC1pbiBhbGxvY2F0aW9ucyAqLwomIzQzOwkJCWlmIChmaWx0ZXItJmd0O2ZpZWxkcy5tb2RuYW1lWzBdICE9ICYjMzk7XDAmIzM5OykKJiM0MzsJCQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJfSBlbHNlIGlmIChhbGxvY2luZm9fY21wX3N0cihjdC0mZ3Q7bW9kbmFtZSwgZmlsdGVyLSZndDtmaWVsZHMubW9kbmFtZSkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTikgJmFtcDsmYW1wOwomIzQzOwkgICAgY3QtJmd0O2Z1bmN0aW9uICZhbXA7JmFtcDsgYWxsb2NpbmZvX2NtcF9zdHIoY3QtJmd0O2Z1bmN0aW9uLCBmaWx0ZXItJmd0O2ZpZWxkcy5mdW5jdGlvbikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgY3QtJmd0O2ZpbGVuYW1lICZhbXA7JmFtcDsgYWxsb2NpbmZvX2NtcF9zdHIoY3QtJmd0O2ZpbGVuYW1lLCBmaWx0ZXItJmd0O2ZpZWxkcy5maWxlbmFtZSkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8pICZhbXA7JmFtcDsKJiM0MzsJICAgIGN0LSZndDtsaW5lbm8gIT0gZmlsdGVyLSZndDtmaWVsZHMubGluZW5vKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19JTkFDQ1VSQVRFKSB7CiYjNDM7CQlpbmFjY3VyYXRlID0gISEoY3QtJmd0O2ZsYWdzICZhbXA7IENPREVUQUdfRkxBR19JTkFDQ1VSQVRFKTsKJiM0MzsJCWlmIChpbmFjY3VyYXRlICE9ICEhKGZpbHRlci0mZ3Q7ZmllbGRzLmluYWNjdXJhdGUpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7CiYjNDM7CQlpZiAoISpmZXRjaGVkX2NvdW50ZXJzKSB7CiYjNDM7CQkJKmNvdW50ZXJzID0gYWxsb2NpbmZvX3ByZWZldGNoX2NvdW50ZXJzKGN0KTsKJiM0MzsJCQkqZmV0Y2hlZF9jb3VudGVycyA9IHRydWU7CiYjNDM7CQl9CiYjNDM7CQlpZiAoKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjb3VudGVycy0mZ3Q7Ynl0ZXMgJmx0OyBmaWx0ZXItJmd0O21pbl9zaXplKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCWlmICgoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgJmFtcDsmYW1wOwomIzQzOwkJICAgIGNvdW50ZXJzLSZndDtieXRlcyAmZ3Q7IGZpbHRlci0mZ3Q7bWF4X3NpemUpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNlZWtzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgc3BlY2lmaWVkIDAtaW5kZXhlZCB0YWcgcG9zaXRpb24sIHJlYWRzIGl0cwomIzQzOyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKQomIzQzO3sKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2OwomIzQzOwlzdHJ1Y3QgY29kZXRhZyAqY3Q7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTsKJiM0MzsJX191NjQgc2tpcF9jb3VudDsKJiM0MzsJc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVyczsKJiM0MzsJYm9vbCBmZXRjaGVkX2NvdW50ZXJzOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDtwYXJhbXMsIGFyZywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CWlmIChwYXJhbXMuZmlsdGVyLm1hc2sgJmFtcDsgfkFMTE9DSU5GT19GSUxURVJfTUFTS1MpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaWYgKChwYXJhbXMuZmlsdGVyLm1hc2sgJmFtcDsgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAocGFyYW1zLmZpbHRlci5tYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgcGFyYW1zLmZpbHRlci5taW5fc2l6ZSAmZ3Q7IHBhcmFtcy5maWx0ZXIubWF4X3NpemUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJcHJpdiA9IG0tJmd0O3ByaXZhdGU7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtwcml2LSZndDtpb2N0bF9sb2NrKTsKJiM0MzsJY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLnBvcyAmZ3Q7PSBjb2RldGFnX2dldF9jb3VudChhbGxvY190YWdfY3R0eXBlKSkgewomIzQzOwkJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDtpb2N0bF9sb2NrKTsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNraXBfY291bnQgPSBwYXJhbXMucG9zOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLmZpbHRlci5tYXNrKQomIzQzOwkJcHJpdi0mZ3Q7ZmlsdGVyID0gcGFyYW1zLmZpbHRlcjsKJiM0MzsJZWxzZQomIzQzOwkJcHJpdi0mZ3Q7ZmlsdGVyLm1hc2sgPSAwOwomIzQzOwomIzQzOwkvKiBGaW5kIHRoZSBjb2RldGFnICovCiYjNDM7CXByaXYtJmd0O2lvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpOwomIzQzOwljdCA9IGNvZGV0YWdfbmV4dF9jdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2l0ZXIpOwomIzQzOwomIzQzOwl3aGlsZSAoY3QpIHsKJiM0MzsJCWZldGNoZWRfY291bnRlcnMgPSBmYWxzZTsKJiM0MzsJCWlmIChtYXRjaGVzX2ZpbHRlcihjdCwgJmFtcDtwcml2LSZndDtmaWx0ZXIsICZhbXA7Y291bnRlcnMsICZhbXA7ZmV0Y2hlZF9jb3VudGVycykpIHsKJiM0MzsJCQlpZiAoc2tpcF9jb3VudCA9PSAwKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCQlza2lwX2NvdW50LS07CiYjNDM7CQl9CiYjNDM7CQljdCA9IGNvZGV0YWdfbmV4dF9jdCgmYW1wO3ByaXYtJmd0O2lvY3RsX2l0ZXIpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjdCkgewomIzQzOwkJaWYgKCFmZXRjaGVkX2NvdW50ZXJzKQomIzQzOwkJCWNvdW50ZXJzID0gYWxsb2NpbmZvX3ByZWZldGNoX2NvdW50ZXJzKGN0KTsKJiM0MzsJCWFsbG9jaW5mb190b19wYXJhbXMoY3QsICZhbXA7cGFyYW1zLmRhdGEsICZhbXA7Y291bnRlcnMpOwomIzQzOwkJcHJpdi0mZ3Q7cG9zaXRpb25lZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIWN0KQomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CiYjNDM7CWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO3BhcmFtcywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEFkdmFuY2VzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIHRhZyBpbiB0aGUgc2VxdWVuY2UgYW5kCiYjNDM7ICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdjsKJiM0MzsJc3RydWN0IGNvZGV0YWcgKmN0OwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtczsKJiM0MzsJaW50IHJldCA9IDA7CiYjNDM7CXN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgY291bnRlcnM7CiYjNDM7CWJvb2wgZmV0Y2hlZF9jb3VudGVyczsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7cGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CiYjNDM7CXByaXYgPSBtLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7cHJpdi0mZ3Q7aW9jdGxfbG9jayk7CiYjNDM7CWNvZGV0YWdfbG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTsKJiM0MzsKJiM0MzsJaWYgKCFwcml2LSZndDtwb3NpdGlvbmVkKSB7CiYjNDM7CQlwcml2LSZndDtpb2N0bF9pdGVyID0gY29kZXRhZ19nZXRfY3RfaXRlcihhbGxvY190YWdfY3R0eXBlKTsKJiM0MzsJCXByaXYtJmd0O3Bvc2l0aW9uZWQgPSB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWN0ID0gY29kZXRhZ19uZXh0X2N0KCZhbXA7cHJpdi0mZ3Q7aW9jdGxfaXRlcik7CiYjNDM7CXdoaWxlIChjdCkgewomIzQzOwkJZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlOwomIzQzOwkJaWYgKG1hdGNoZXNfZmlsdGVyKGN0LCAmYW1wO3ByaXYtJmd0O2ZpbHRlciwgJmFtcDtjb3VudGVycywgJmFtcDtmZXRjaGVkX2NvdW50ZXJzKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWN0ID0gY29kZXRhZ19uZXh0X2N0KCZhbXA7cHJpdi0mZ3Q7aW9jdGxfaXRlcik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGN0KSB7CiYjNDM7CQlpZiAoIWZldGNoZWRfY291bnRlcnMpCiYjNDM7CQkJY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpOwomIzQzOwkJYWxsb2NpbmZvX3RvX3BhcmFtcyhjdCwgJmFtcDtwYXJhbXMsICZhbXA7Y291bnRlcnMpOwomIzQzOwl9CiYjNDM7CWlmICghY3QpIHsKJiM0MzsJCXByaXYtJmd0O3Bvc2l0aW9uZWQgPSBmYWxzZTsKJiM0MzsJCXJldCA9IC1FTk9FTlQ7CiYjNDM7CX0KJiM0MzsJY29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O2lvY3RsX2xvY2spOwomIzQzOwomIzQzOwlpZiAocmV0ID09IDApIHsKJiM0MzsJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO3BhcmFtcywgc2l6ZW9mKHBhcmFtcykpKQomIzQzOwkJCXJldHVybiAtRUZBVUxUOwomIzQzOwl9CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZQomIzQzOyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiYjNDM7CQkJICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpCiYjNDM7ewomIzQzOwl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopX19hcmc7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXN3aXRjaCAoY21kKSB7CiYjNDM7CWNhc2UgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtJmd0O3ByaXZhdGVfZGF0YSwgYXJnKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIEFMTE9DSU5GT19JT0NfR0VUX0FUOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9hdChmaWxlLSZndDtwcml2YXRlX2RhdGEsIGFyZyk7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOgomIzQzOwkJcmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtJmd0O3ByaXZhdGVfZGF0YSwgYXJnKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0ID0gLUVOT0lPQ1RMQ01EOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2lmZGVmIENPTkZJR19DT01QQVQKJiM0MztzdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOwomIzQzO30KJiM0MzsjZW5kaWYKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHsKJiM0MzsJLnByb2Nfb3BlbgkJPSBhbGxvY2luZm9fb3BlbiwKJiM0MzsJLnByb2NfcmVhZF9pdGVyCQk9IHNlcV9yZWFkX2l0ZXIsCiYjNDM7CS5wcm9jX2xzZWVrCQk9IHNlcV9sc2VlaywKJiM0MzsJLnByb2NfcmVsZWFzZQkJPSBhbGxvY2luZm9fcmVsZWFzZSwKJiM0MzsJLnByb2NfaW9jdGwJCT0gYWxsb2NpbmZvX2lvY3RsLAomIzQzOyNpZmRlZiBDT05GSUdfQ09NUEFUCiYjNDM7CS5wcm9jX2NvbXBhdF9pb2N0bAk9IGFsbG9jaW5mb19jb21wYXRfaW9jdGwsCiYjNDM7I2VuZGlmCiYjNDM7fTsKJiM0MzsKIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKQogewogCXN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7CkBAIC05ODQsOCAmIzQzOzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKQogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXByb2NfY3JlYXRlX3NlcV9wcml2YXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsICZhbXA7YWxsb2NpbmZvX3NlcV9vcCwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpLCBOVUxMKSkgewomIzQzOwlpZiAoIXByb2NfY3JlYXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsICZhbXA7YWxsb2NpbmZvX3Byb2Nfb3BzKSkgewogCQlwcl9lcnIoJiMzNDtGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcbiYjMzQ7LCBBTExPQ0lORk9fRklMRV9OQU1FKTsKIAkJc2h1dGRvd25fbWVtX3Byb2ZpbGluZyhmYWxzZSk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQppbmRleCA4ZDRkYjIyNDFjYzJhMi4uMTI5NDFkNjhhN2Y4YWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCkBAIC0xLDUgJiM0MzsxLDYgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKIFRBUkdFVFMgJiM0Mzs9IGFjY3QKJiM0MztUQVJHRVRTICYjNDM7PSBhbGxvY190YWcKIFRBUkdFVFMgJiM0Mzs9IGFsc2EKIFRBUkdFVFMgJiM0Mzs9IGFtZC1wc3RhdGUKIFRBUkdFVFMgJiM0Mzs9IGFybTY0CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY0MWQ5MmQwNmIxODQ4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDkgQEAKJiM0MzsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7VEVTVF9HRU5fUFJPR1MgOj0gYWxsb2NpbmZvX2lvY3RsX3Rlc3QKJiM0MzsKJiM0MztDRkxBR1MgJiM0Mzs9IC1XYWxsCiYjNDM7Q0ZMQUdTICYjNDM7PSAkKEtIRFJfSU5DTFVERVMpCiYjNDM7CiYjNDM7aW5jbHVkZSAuLi9saWIubWsKJiM0MzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdkOTRhYmI3ODVhMTQ4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmMKQEAgLTAsMCAmIzQzOzEsNTQ4IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOwomIzQzOy8qIGtzZWxmdGVzdCBmb3IgYWxsb2NpbmZvIGlvY3RsCiYjNDM7ICogYWxsb2NpbmZvIGlvY3RsIHJldHJpdmVzIGFsbG9jaW5mbyBkYXRhIHRocm91Z2ggaW9jdGwKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkYm9vbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2FsbG9jX3RhZy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7Li4va3NlbGZ0ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTUFYX0xJTkVfTEVOCQk1MTIKJiM0MzsjZGVmaW5lIEFMTE9DSU5GT19QUk9DCQkmIzM0Oy9wcm9jL2FsbG9jaW5mbyYjMzQ7CiYjNDM7CiYjNDM7ZW51bSBpb2N0bF9yZXQgewomIzQzOwlJT0NUTF9TVUNDRVNTID0gMCwKJiM0MzsJSU9DVExfRkFJTFVSRSA9IDEsCiYjNDM7CUlPQ1RMX0lOVkFMSURfREFUQSA9IDIsCiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIFZFQ19NQVhfRU5UUklFUyAzMgomIzQzOwomIzQzO3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjIHsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB0YWdbVkVDX01BWF9FTlRSSUVTXTsKJiM0MzsJX191NjQgY291bnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcykKJiM0Mzt7CiYjNDM7CXJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X2F0KGludCBkZXZfZmQsIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0ICpwYXJhbXMpCiYjNDM7ewomIzQzOwlyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0dFVF9BVCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgX19hbGxvY2luZm9fZ2V0X25leHQoaW50IGRldl9mZCwgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcGFyYW1zKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LAomIzQzOwkJCWNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKnRhZ19kYXRhLAomIzQzOwkJCWJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLAomIzQzOwkJCWJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpZiAobWF0Y2hfYnl0ZXMgJmFtcDsmYW1wOyB0YWdfZGF0YS0mZ3Q7Y291bnRlci5ieXRlcyAhPSBwcm9jZnNfZW50cnktJmd0O2NvdW50ZXIuYnl0ZXMpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7c2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfY2FsbHMgJmFtcDsmYW1wOyB0YWdfZGF0YS0mZ3Q7Y291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktJmd0O2NvdW50ZXIuY2FsbHMpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Y2FsbCBjb3VudCByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfbGluZW5vICZhbXA7JmFtcDsgdGFnX2RhdGEtJmd0O3RhZy5saW5lbm8gIT0gcHJvY2ZzX2VudHJ5LSZndDt0YWcubGluZW5vKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O2xpbmVubyByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfZnVuY3Rpb24gJmFtcDsmYW1wOwomIzQzOwkgICAgc3RybmNtcCh0YWdfZGF0YS0mZ3Q7dGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktJmd0O3RhZy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobWF0Y2hfZmlsZW5hbWUgJmFtcDsmYW1wOwomIzQzOwkgICAgc3RybmNtcCh0YWdfZGF0YS0mZ3Q7dGFnLmZpbGVuYW1lLCBwcm9jZnNfZW50cnktJmd0O3RhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtmaWxlbmFtZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgbWF0Y2hfZW50cmllcyhjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMsCiYjNDM7CQkJICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncywKJiM0MzsJCQkgIGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLAomIzQzOwkJCSAgYm9vbCBtYXRjaF9mdW5jdGlvbiwgYm9vbCBtYXRjaF9maWxlbmFtZSkKJiM0Mzt7CiYjNDM7CV9fdTY0IGk7CiYjNDM7CiYjNDM7CWlmIChwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgIT0gdGFncy0mZ3Q7Y291bnQpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RW50cnkgY291bnQgbWlzbWF0Y2guIGlvY3RsIGVudHJpZXM6ICVsbHUsIHByb2MgZW50cmllczogJWxsdVxuJiMzNDssCiYjNDM7CQkJICAgICAgIHRhZ3MtJmd0O2NvdW50LCBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIW1hdGNoX2VudHJ5KCZhbXA7cHJvY2ZzX2VudHJpZXMtJmd0O3RhZ1tpXSwgJmFtcDt0YWdzLSZndDt0YWdbaV0sCiYjNDM7CQkJCSBtYXRjaF9ieXRlcywgbWF0Y2hfY2FsbHMsIG1hdGNoX2xpbmVubywKJiM0MzsJCQkJIG1hdGNoX2Z1bmN0aW9uLCBtYXRjaF9maWxlbmFtZSkpIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0OyVsbHV0aCBlbnRyeSBkb2VzIG5vdCBtYXRjaC5cbiYjMzQ7LCBpKTsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cikKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKJiM0MzsKJiM0MzsJaWYgKGxlbiAmZ3Q7PSBBTExPQ0lORk9fU1RSX1NJWkUpCiYjNDM7CQlzdHIgJiM0Mzs9IChsZW4gLSBBTExPQ0lORk9fU1RSX1NJWkUpICYjNDM7IDE7CiYjNDM7CXJldHVybiBzdHI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCiYjNDM7ewomIzQzOwlzdHJuY3B5KGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFIC0gMSk7CiYjNDM7CWRlc3RbQUxMT0NJTkZPX1NUUl9TSVpFIC0gMV0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcywKJiM0MzsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpCiYjNDM7ewomIzQzOwlGSUxFICpmcCA9IGZvcGVuKEFMTE9DSU5GT19QUk9DLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWNoYXIgbGluZVtNQVhfTElORV9MRU5dOwomIzQzOwlpbnQgbWF0Y2hlczsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBwcm9jZnNfZW50cnk7CiYjNDM7CiYjNDM7CWlmICghZnApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDsgZm9yIHJlYWRpbmdcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAxOwomIzQzOwl9CiYjNDM7CW1lbXNldChwcm9jZnNfZW50cmllcywgMCwgc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgJmFtcDsmYW1wOyBwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgJmx0OyBWRUNfTUFYX0VOVFJJRVMpIHsKJiM0MzsJCWNoYXIgZmlsZW5hbWVbTUFYX0xJTkVfTEVOXTsKJiM0MzsJCWNoYXIgZnVuY3Rpb25bTUFYX0xJTkVfTEVOXTsKJiM0MzsKJiM0MzsJCW1lbXNldCgmYW1wO3Byb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpOwomIzQzOwkJbWF0Y2hlcyA9IHNzY2FuZihsaW5lLCAmIzM0OyVsbHUgJWxsdSAlW146XTolbGx1IGZ1bmM6JXMmIzM0OywKJiM0MzsJCQkJICZhbXA7cHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMsCiYjNDM7CQkJCSAmYW1wO3Byb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLAomIzQzOwkJCQkgZmlsZW5hbWUsCiYjNDM7CQkJCSAmYW1wO3Byb2Nmc19lbnRyeS50YWcubGluZW5vLAomIzQzOwkJCQkgZnVuY3Rpb24pOwomIzQzOwomIzQzOwkJaWYgKG1hdGNoZXMgIT0gNSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCWFsbG9jaW5mb19jb3B5X3N0cihwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLCBmaWxlbmFtZSk7CiYjNDM7CQlhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbiwgZnVuY3Rpb24pOwomIzQzOwomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIHsKJiM0MzsJCQlpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLAomIzQzOwkJCQkgICAgZmlsdGVyLSZndDtmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHsKJiM0MzsJCQlpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZ1bmN0aW9uLAomIzQzOwkJCQkgICAgZmlsdGVyLSZndDtmaWVsZHMuZnVuY3Rpb24sIEFMTE9DSU5GT19TVFJfU0laRSkpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PKSB7CiYjNDM7CQkJaWYgKHByb2Nmc19lbnRyeS50YWcubGluZW5vICE9IGZpbHRlci0mZ3Q7ZmllbGRzLmxpbmVubykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQl9CiYjNDM7CQlpZiAoZmlsdGVyLSZndDttYXNrICZhbXA7IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgewomIzQzOwkJCWlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyAmbHQ7IGZpbHRlci0mZ3Q7bWluX3NpemUpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwkJaWYgKGZpbHRlci0mZ3Q7bWFzayAmYW1wOyBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIHsKJiM0MzsJCQlpZiAocHJvY2ZzX2VudHJ5LmNvdW50ZXIuYnl0ZXMgJmd0OyBmaWx0ZXItJmd0O21heF9zaXplKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCW1lbWNweSgmYW1wO3Byb2Nmc19lbnRyaWVzLSZndDt0YWdbcHJvY2ZzX2VudHJpZXMtJmd0O2NvdW50JiM0MzsmIzQzO10sICZhbXA7cHJvY2ZzX2VudHJ5LAomIzQzOwkJICAgICAgIHNpemVvZihwcm9jZnNfZW50cnkpKTsKJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGVudW0gaW9jdGxfcmV0IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLAomIzQzOwkJCQkJCSBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyLAomIzQzOwkJCQkJCSBfX3U2NCBzdGFydF9wb3MpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDsgZm9yIElPQ1RMXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gSU9DVExfRkFJTFVSRTsKJiM0MzsJfQomIzQzOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IGdldF9hdF9wYXJhbXM7CiYjNDM7CWNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwOwomIzQzOwlpbnQgcmV0cnlfY291bnQgPSAwOwomIzQzOwlpbnQgc3RhdHVzOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgaWYgYSBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWQKJiM0MzsJICogYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiBJZiB0aGF0IGhhcHBlbnMsIHRoZSBkYXRhIGdhdGhlcmVkIGNhbm5vdCBiZSBjb25zaWRlcmVkIGNvbnNpc3RlbnQKJiM0MzsJICogYW5kIGhlbmNlIG5lZWRzIHRvIGJlIGZldGNoZWQgYWdhaW4gdG8gYXZvaWQgZmxha2luZXNzLgomIzQzOwkgKi8KJiM0MzsJZG8gewomIzQzOwkJaWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCAmYW1wO3N0YXJ0X2NvbnRfaWQpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfRkFJTFVSRTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCW1lbXNldCh0YWdzLCAwLCBzaXplb2YoKnRhZ3MpKTsKJiM0MzsJCW1lbXNldCgmYW1wO2dldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7CiYjNDM7CQltZW1jcHkoJmFtcDtnZXRfYXRfcGFyYW1zLmZpbHRlciwgZmlsdGVyLCBzaXplb2YoKmZpbHRlcikpOwomIzQzOwkJZ2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7CiYjNDM7CQlpZiAoX19hbGxvY2luZm9fZ2V0X2F0KGZkLCAmYW1wO2dldF9hdF9wYXJhbXMpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQltZW1jcHkoJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnQmIzQzOyYjNDM7XSwgJmFtcDtnZXRfYXRfcGFyYW1zLmRhdGEsIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTsKJiM0MzsKJiM0MzsJCXdoaWxlICh0YWdzLSZndDtjb3VudCAmbHQ7IFZFQ19NQVhfRU5UUklFUyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgICAgX19hbGxvY2luZm9fZ2V0X25leHQoZmQsICZhbXA7dGFncy0mZ3Q7dGFnW3RhZ3MtJmd0O2NvdW50XSkgPT0gMCkKJiM0MzsJCQl0YWdzLSZndDtjb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQlpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsICZhbXA7ZW5kX2NvbnRfaWQpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfRkFJTFVSRTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkKSB7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfU1VDQ0VTUzsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDthbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWlzbWF0Y2gsIHJldHJ5aW5nLi4uXG4mIzM0Oyk7CiYjNDM7CQkJc3RhdHVzID0gSU9DVExfSU5WQUxJRF9EQVRBOwomIzQzOwkJfQomIzQzOwl9IHdoaWxlIChzdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBICZhbXA7JmFtcDsgcmV0cnlfY291bnQmIzQzOyYjNDM7ICZsdDsgbWF4X3JldHJpZXMpOwomIzQzOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBzdGF0dXM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTsKJiM0MzsJaW50IGlvY3RsX3N0YXR1czsKJiM0MzsJaW50IHJldCA9IEtTRlRfUEFTUzsKJiM0MzsKJiM0MzsJaWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgZmlsdGVyKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSAmIzM0OyBBTExPQ0lORk9fUFJPQyAmIzM0O1xuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcm9jZnNfZW50cmllcy0mZ3Q7Y291bnQgPT0gMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBlbnRyaWVzIGZvdW5kIGluICYjMzQ7IEFMTE9DSU5GT19QUk9DICYjMzQ7LCBza2lwcGluZyB0ZXN0XG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX1NLSVA7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgZmlsdGVyLCAwKTsKJiM0MzsJaWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFtYXRjaF9lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCB0YWdzLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUpKQomIzQzOwkJcmV0ID0gS1NGVF9GQUlMOwomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWZyZWUodGFncyk7CiYjNDM7CWZyZWUocHJvY2ZzX2VudHJpZXMpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRlc3RfZmlsZW5hbWVfZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9ICYjMzQ7bW0vbWVtb3J5LmMmIzM0OzsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7CiYjNDM7CWZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRTsKJiM0MzsJc3RybmNweShmaWx0ZXIuZmllbGRzLmZpbGVuYW1lLCB0YXJnZXRfZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSk7CiYjNDM7CiYjNDM7CXJldHVybiBydW5fZmlsdGVyX3Rlc3QoJmFtcDtmaWx0ZXIpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRlc3RfZnVuY3Rpb25fZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9ICYjMzQ7ZHVwX21tJiMzNDs7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2ZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwlmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047CiYjNDM7CXN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzOwomIzQzOwlyZXR1cm4gcnVuX2ZpbHRlcl90ZXN0KCZhbXA7ZmlsdGVyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0ZXN0X3NpemVfZmlsdGVyKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWludCByZXQgPSBLU0ZUX1BBU1M7CiYjNDM7CV9fdTY0IHRhcmdldF9zaXplLCBpLCBwb3M7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7CiYjNDM7CWNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9ICYjMzQ7ZG9faW5pdF9tb2R1bGUmIzM0OzsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkOwomIzQzOwlpbnQgcmV0cnkgPSAwOwomIzQzOwljb25zdCBpbnQgbWF4X3JldHJpZXMgPSAxMDsKJiM0MzsKJiM0MzsJaWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGZyZWVtZW07CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7CiYjNDM7CWlmIChmZCAmbHQ7IDApIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7RmFpbGVkIHRvIG9wZW4gJiMzNDsgQUxMT0NJTkZPX1BST0MgJiMzNDs6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCWdvdG8gZnJlZW1lbTsKJiM0MzsJfQomIzQzOwomIzQzOwlkbyB7CiYjNDM7CQlmb3VuZF90YWcgPSBOVUxMOwomIzQzOwkJcG9zID0gMDsKJiM0MzsKJiM0MzsJCWlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgJmFtcDtzdGFydF9jb250X2lkKSkgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQltZW1zZXQoJmFtcDtmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKJiM0MzsJCWZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjsKJiM0MzsJCXN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpOwomIzQzOwomIzQzOwkJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgJmFtcDtmaWx0ZXIpKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSAmIzM0OyBBTExPQ0lORk9fUFJPQyAmIzM0O1xuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocHJvY2ZzX2VudHJpZXMtJmd0O2NvdW50ID09IDApIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O0Z1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcbiYjMzQ7LCB0YXJnZXRfZnVuY3Rpb24pOwomIzQzOwkJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQl0YXJnZXRfc2l6ZSA9IHByb2Nmc19lbnRyaWVzLSZndDt0YWdbMF0uY291bnRlci5ieXRlczsKJiM0MzsKJiM0MzsJCW1lbXNldCgmYW1wO2ZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwkJZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFIHwgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFOwomIzQzOwkJZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7CiYjNDM7CQlmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTsKJiM0MzsKJiM0MzsJCXdoaWxlICgxKSB7CiYjNDM7CQkJc3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtczsKJiM0MzsKJiM0MzsJCQltZW1zZXQoJmFtcDtnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpOwomIzQzOwkJCW1lbWNweSgmYW1wO2dldF9hdF9wYXJhbXMuZmlsdGVyLCAmYW1wO2ZpbHRlciwgc2l6ZW9mKGZpbHRlcikpOwomIzQzOwkJCWdldF9hdF9wYXJhbXMucG9zID0gcG9zOwomIzQzOwomIzQzOwkJCWlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsICZhbXA7Z2V0X2F0X3BhcmFtcykpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwomIzQzOwkJCXRhZ3MtJmd0O2NvdW50ID0gMDsKJiM0MzsJCQltZW1jcHkoJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnQmIzQzOyYjNDM7XSwgJmFtcDtnZXRfYXRfcGFyYW1zLmRhdGEsCiYjNDM7CQkJICAgICAgIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTsKJiM0MzsKJiM0MzsJCQl3aGlsZSAodGFncy0mZ3Q7Y291bnQgJmx0OyBWRUNfTUFYX0VOVFJJRVMgJmFtcDsmYW1wOwomIzQzOwkJCSAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgJmFtcDt0YWdzLSZndDt0YWdbdGFncy0mZ3Q7Y291bnRdKSA9PSAwKQomIzQzOwkJCQl0YWdzLSZndDtjb3VudCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQkJZm9yIChpID0gMDsgaSAmbHQ7IHRhZ3MtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQlpZiAoc3RyY21wKHRhZ3MtJmd0O3RhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkgewomIzQzOwkJCQkJZm91bmRfdGFnID0gJmFtcDt0YWdzLSZndDt0YWdbaV07CiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQkJfQomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlpZiAoZm91bmRfdGFnIHx8IHRhZ3MtJmd0O2NvdW50ICZsdDsgVkVDX01BWF9FTlRSSUVTKQomIzQzOwkJCQlicmVhazsKJiM0MzsKJiM0MzsJCQlwb3MgJiM0Mzs9IHRhZ3MtJmd0O2NvdW50OwomIzQzOwkJfQomIzQzOwomIzQzOwkJaWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCAmYW1wO2VuZF9jb250X2lkKSkgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7YWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxuJiMzNDspOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZCkKJiM0MzsJCQlicmVhazsKJiM0MzsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7TW9kdWxlIGxvYWQgZGV0ZWN0ZWQgZHVyaW5nIHNpemUgdmVyaWZpY2F0aW9uLCByZXRyeWluZy4uLlxuJiMzNDspOwomIzQzOwl9IHdoaWxlIChyZXRyeSYjNDM7JiM0MzsgJmx0OyBtYXhfcmV0cmllcyk7CiYjNDM7CiYjNDM7CWlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkICZhbXA7JmFtcDsgIWZvdW5kX3RhZykgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXG4mIzM0OywKJiM0MzsJCQkgICAgICAgdGFyZ2V0X2Z1bmN0aW9uKTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfSBlbHNlIGlmIChzdGFydF9jb250X2lkLmlkICE9IGVuZF9jb250X2lkLmlkKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0ZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfU0tJUDsKJiM0MzsJfSBlbHNlIGlmIChmb3VuZF90YWcgJmFtcDsmYW1wOyBmb3VuZF90YWctJmd0O2NvdW50ZXIuYnl0ZXMgIT0gdGFyZ2V0X3NpemUpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7SU9DVEwgZW50cnkgc2l6ZSAlbGx1IGRvZXMgbm90IG1hdGNoIHRhcmdldCBzaXplICVsbHVcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBmb3VuZF90YWctJmd0O2NvdW50ZXIuYnl0ZXMsIHRhcmdldF9zaXplKTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfQomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztmcmVlbWVtOgomIzQzOwlmcmVlKHRhZ3MpOwomIzQzOwlmcmVlKHByb2Nmc19lbnRyaWVzKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0ZXN0X2xpbmVub19maWx0ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpOwomIzQzOwlzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7CiYjNDM7CWVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1czsKJiM0MzsJaW50IHJldCA9IEtTRlRfUEFTUzsKJiM0MzsJX191NjQgdGFyZ2V0X2xpbmVubywgaTsKJiM0MzsJc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZzsKJiM0MzsJYm9vbCBmb3VuZCA9IGZhbHNlOwomIzQzOwomIzQzOwlpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O01lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCWdvdG8gZXhpdDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1zZXQoJmFtcDtmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKJiM0MzsKJiM0MzsJaWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgJmFtcDtmaWx0ZXIpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0Vycm9yIHJldHJpZXZpbmcgZW50cmllcyBmcm9tICYjMzQ7IEFMTE9DSU5GT19QUk9DICYjMzQ7XG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX1NLSVA7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsJaWYgKHByb2Nmc19lbnRyaWVzLSZndDtjb3VudCA9PSAwKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0NvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGRlcGVuZCBvbiB0aGUgcHJvY2ZzIHJlc3VsdHMgdG8gZGV0ZXJtaW5lIHRoZSBsaW5lIG51bWJlciBmb3IgdGhlIGZpbHRlciBiZWZvcmUKJiM0MzsJICogbWFraW5nIHRoZSBpb2N0bCBxdWVyeS4gSGVuY2UsIHdlIGNhbm5vdCByZXVzZSBydW5fZmlsdGVyX3Rlc3QgaGVyZS4KJiM0MzsJICovCiYjNDM7CXRhcmdldF90YWcgPSAmYW1wO3Byb2Nmc19lbnRyaWVzLSZndDt0YWdbMF07CiYjNDM7CXRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLSZndDt0YWcubGluZW5vOwomIzQzOwomIzQzOwlmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5POwomIzQzOwlmaWx0ZXIuZmllbGRzLmxpbmVubyA9IHRhcmdldF9saW5lbm87CiYjNDM7CiYjNDM7CWlvY3RsX3N0YXR1cyA9IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHRhZ3MsICZhbXA7ZmlsdGVyLCAwKTsKJiM0MzsJaWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7VHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxuJiMzNDspOwomIzQzOwkJcmV0ID0gS1NGVF9TS0lQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CWlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSBLU0ZUX0ZBSUw7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHRhZ3MtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHRhZ3MtJmd0O3RhZ1tpXS50YWcubGluZW5vICE9IHRhcmdldF9saW5lbm8pIHsKJiM0MzsJCQlrc2Z0X3ByaW50X21zZygmIzM0O0lPQ1RMIGVudHJ5ICVsbHUgaGFzIGluY29ycmVjdCBsaW5lbm8gJWxsdS5cbiYjMzQ7LAomIzQzOwkJCQkgICAgICAgaSwgdGFncy0mZ3Q7dGFnW2ldLnRhZy5saW5lbm8pOwomIzQzOwkJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJCQlnb3RvIGV4aXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoc3RybmNtcCh0YWdzLSZndDt0YWdbaV0udGFnLmZ1bmN0aW9uLCB0YXJnZXRfdGFnLSZndDt0YWcuZnVuY3Rpb24sCiYjNDM7CQkJICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RybmNtcCh0YWdzLSZndDt0YWdbaV0udGFnLmZpbGVuYW1lLCB0YXJnZXRfdGFnLSZndDt0YWcuZmlsZW5hbWUsCiYjNDM7CQkJICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMCkKJiM0MzsJCQlmb3VuZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFmb3VuZCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtPcmlnaW5hbCBwcm9jZnMgZW50cnkgbm90IGZvdW5kIGluIElPQ1RMIGxpbmVubyBmaWx0ZXIgcmVzdWx0cy5cbiYjMzQ7KTsKJiM0MzsJCXJldCA9IEtTRlRfRkFJTDsKJiM0MzsJfQomIzQzOwomIzQzO2V4aXQ6CiYjNDM7CWZyZWUodGFncyk7CiYjNDM7CWZyZWUocHJvY2ZzX2VudHJpZXMpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbig0KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9maWxlbmFtZV9maWx0ZXIoKTsKJiM0MzsJaWYgKHJldCA9PSBLU0ZUX1NLSVApCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDtTa2lwcGluZyB0ZXN0X2ZpbGVuYW1lX2ZpbHRlclxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsICYjMzQ7dGVzdF9maWxlbmFtZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9mdW5jdGlvbl9maWx0ZXIoKTsKJiM0MzsJaWYgKHJldCA9PSBLU0ZUX1NLSVApCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDtTa2lwcGluZyB0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsICYjMzQ7dGVzdF9mdW5jdGlvbl9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9zaXplX2ZpbHRlcigpOwomIzQzOwlpZiAocmV0ID09IEtTRlRfU0tJUCkKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0O1NraXBwaW5nIHRlc3Rfc2l6ZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCAmIzM0O3Rlc3Rfc2l6ZV9maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gdGVzdF9saW5lbm9fZmlsdGVyKCk7CiYjNDM7CWlmIChyZXQgPT0gS1NGVF9TS0lQKQomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7U2tpcHBpbmcgdGVzdF9saW5lbm9fZmlsdGVyXG4mIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgJiMzNDt0ZXN0X2xpbmVub19maWx0ZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxMzUKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAyNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTmV3IEFsbG9jYXRpb24gUHJvZmlsaW5nIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgbmV3IGBpb2N0bGAgaW50ZXJmYWNlIGZvciBgL3Byb2MvYWxsb2NpbmZvYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgc2VlIGEgZ29vZCByYW5nZSBvZiBmaWxlcyB0b3VjaGVkLCB3aGljaCBpcyB3aGF0IEkmIzM5O2QgZXhwZWN0IGZvciB0aGlzIGtpbmQgb2YgZmVhdHVyZS4gV2UgaGF2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMsIHdoaWNoIGlzIGNydWNpYWwsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIHVzZXJzcGFjZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBuZXcgYGlvY3RsYCBpbiBib3RoIHRoZSBgbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0YCBhbmQgYHVzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdGAgZmlsZXMuIFRoZSBgTUFJTlRBSU5FUlNgIGNoYW5nZSBpcyBhbHNvIGV4cGVjdGVkIHRvIGVuc3VyZSB0aGUgcmlnaHQgcGVvcGxlIGFyZSBpbiB0aGUgbG9vcC4gVGhlIGhlYWRlciBmaWxlcyBsaWtlIGBpbmNsdWRlL2xpbnV4L2NvZGV0YWcuaGAgYW5kIGBpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhgIHRlbGwgbWUgdGhleSYjMzk7cmUgc2V0dGluZyB1cCB0aGUgbG93LWxldmVsIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcywgYW5kIHRoZSBjb3JlIGltcGxlbWVudGF0aW9uIGlzIGxpa2VseSBpbiBgbGliL2NvZGV0YWcuY2AgYW5kIGBtbS9hbGxvY190YWcuY2AuIFRoZSBpbmNsdXNpb24gb2YgYSBzZWxmdGVzdCBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2AgaXMgYSBodWdlIHBsdXM7IGFsd2F5cyBnb29kIHRvIGhhdmUgc29tZSBzb2xpZCB2YWxpZGF0aW9uLgoKTm93LCB0aGUgbWVhdCBvZiBpdCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB3ZSYjMzk7cmUgYWRkaW5nIHRoaXMgYGFsbG9jaW5mb19pb2N0bGAgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBoYW5kbGluZyB0aGUgYEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRGAsIGBBTExPQ0lORk9fSU9DX0dFVF9BVGAsIGFuZCBgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVGAgaW9jdGwgY29tbWFuZHMuIFNvIHRoaXMgaXMgaG93IHVzZXJzcGFjZSB3aWxsIGFjdHVhbGx5IGludGVyYWN0IHdpdGggdGhlIG5ldyBgL3Byb2MvYWxsb2NpbmZvYCBpbnRlcmZhY2UuCgpHaXZlbiB0aGlzLCBJIHNob3VsZCBjb25maXJtIHRoZSBDT05GSUcgb3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhpcy4gSSBzZWUgdGhhdCB0aGUgY29yZSBmaWxlLCBgbW0vYWxsb2NfdGFnLmNgLCBpcyBvbmx5IGNvbXBpbGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBrZWVwcyB0aGluZ3MgbW9kdWxhciBhbmQgYXZvaWRzIHVubmVjZXNzYXJ5IGNvZGUgYmxvYXQgaW4gYSBwcm9kdWN0aW9uIGtlcm5lbC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgdGhlIEtjb25maWcgZmlsZXMgYWN0dWFsbHkgc3RhdGUuIEkmIzM5O2xsIGFsc28gY2hlY2sgb3RoZXIgZGVwZW5kZW5jaWVzLCBidXQgdGhpcyBzZWVtcyBsaWtlIGEgc29saWQgaW5pdGlhbCBhcHByb2FjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY190YWcubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9NYWtlZmlsZT0xNDk9b2JqLSQoQ09ORklHX0xBWllfTU1VX01PREVfS1VOSVRfVEVTVCkgJiM0Mzs9IHRlc3RzL2xhenlfbW11X21vZGVfa3VuaXQub1xubW0vTWFrZWZpbGU6MTUwOm9iai0kKENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HKSAmIzQzOz0gYWxsb2NfdGFnLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkxNwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTt2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgIGlzIGRlZmluaXRlbHkgYSBrZXkgcmVxdWlyZW1lbnQgaGVyZS4gTm93LCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgYnJvYWRlciBsb29rIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgcmVsYXRlZCBjb25maWd1cmF0aW9ucyB0aGF0IG5lZWQgbXkgYXR0ZW50aW9uLiBMZXQmIzM5O3Mgc2VlLi4uIEkgc2VlIHRoZSBpb2N0bCBpcyBwbHVtYmVkIGludG8gYC9wcm9jL2FsbG9jaW5mb2AuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBpbnRyb3NwZWN0aW9uLiBCdXQsIHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIGBtbS9hbGxvY190YWcuY2AgcmlnaHQgYXdheS4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gd2hldGhlciB0aGVyZSBhcmUgYW55IG90aGVyIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgKGAjaWZkZWZgcykgaW4gdGhhdCBmaWxlIHRoYXQgcmVsYXRlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBvciB0YWdnaW5nLiBUaGF0IHdpbGwgcHJvYmFibHkgYmUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bGwgcGljdHVyZSBvZiB0aGUgZmVhdHVyZSYjMzk7cyBkZXBlbmRlbmNpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDkgMTE6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYWxsb2NfdGFnLmM9MjE0PXN0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuLS1cbm1tL2FsbG9jX3RhZy5jLTIzMy0gKi9cbm1tL2FsbG9jX3RhZy5jOjIzNDpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0yMzUte1xuLS1cbm1tL2FsbG9jX3RhZy5jPTI1MT1zdGF0aWMgYm9vbCBtYXRjaGVzX2ZpbHRlcihzdHJ1Y3QgY29kZXRhZyAqY3QsIHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXG4tLVxubW0vYWxsb2NfdGFnLmMtMzA3LSAqL1xubW0vYWxsb2NfdGFnLmM6MzA4OnN0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0zMDkte1xuLS1cbm1tL2FsbG9jX3RhZy5jLTM4Mi0gKi9cbm1tL2FsbG9jX3RhZy5jOjM4MzpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXG5tbS9hbGxvY190YWcuYy0zODQte1xuLS1cbm1tL2FsbG9jX3RhZy5jLTQzMy0gKi9cbm1tL2FsbG9jX3RhZy5jOjQzNDpzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9hbGxvY190YWcuYy00MzUtXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4tLVxubW0vYWxsb2NfdGFnLmMtNDQxLVx0Y2FzZSBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQ6XG5tbS9hbGxvY190YWcuYzo0NDI6XHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZChmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcbm1tL2FsbG9jX3RhZy5jLTQ0My1cdFx0YnJlYWs7XG5tbS9hbGxvY190YWcuYy00NDQtXHRjYXNlIEFMTE9DSU5GT19JT0NfR0VUX0FUOlxubW0vYWxsb2NfdGFnLmM6NDQ1Olx0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xubW0vYWxsb2NfdGFnLmMtNDQ2LVx0XHRicmVhaztcbm1tL2FsbG9jX3RhZy5jLTQ0Ny1cdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVDpcbm1tL2FsbG9jX3RhZy5jOjQ0ODpcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xubW0vYWxsb2NfdGFnLmMtNDQ5LVx0XHRicmVhaztcbi0tXG5tbS9hbGxvY190YWcuYz00NTk9c3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9hbGxvY190YWcuYy00NjEte1xubW0vYWxsb2NfdGFnLmM6NDYyOlx0cmV0dXJuIGFsbG9jaW5mb19pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7XG5tbS9hbGxvY190YWcuYy00NjMtfVxuLS1cbm1tL2FsbG9jX3RhZy5jPTQ2Nj1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcbi0tXG5tbS9hbGxvY190YWcuYy00NzAtXHQucHJvY19yZWxlYXNlXHRcdD0gYWxsb2NpbmZvX3JlbGVhc2UsXG5tbS9hbGxvY190YWcuYzo0NzE6XHQucHJvY19pb2N0bFx0XHQ9IGFsbG9jaW5mb19pb2N0bCxcbm1tL2FsbG9jX3RhZy5jLTQ3Mi0jaWZkZWYgQ09ORklHX0NPTVBBVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2OTUxCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQWxsb2NhdGlvbiBQcm9maWxpbmcgSW9jdGwgSW50ZXJmYWNlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGV5ZSBnb2VzIHRvIHRoZSBjb3JlOiB0aGVzZSBgaW9jdGxgIGZ1bmN0aW9ucywgYGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZGAsIGBhbGxvY2luZm9faW9jdGxfZ2V0X2F0YCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dGAsIGBhbGxvY2luZm9faW9jdGxgLCBhbmQgYGFsbG9jaW5mb19jb21wYXRfaW9jdGxgLiBUaGV5JiMzOTtyZSBjbGVhcmx5IHRoZSBlbnRyeSBwb2ludHMgZm9yIHRoZSBuZXcgYWxsb2NhdGlvbiBwcm9maWxpbmcgZnVuY3Rpb25hbGl0eSwgYW5kIHRoZSBgL3Byb2MvYWxsb2NpbmZvYCBub2RlIGNvbmZpcm1zIHRoaXMgaXMgYSBsaXZlIGFuZCBmdW5jdGlvbmluZyBpbnRlcmZhY2UuCgpUaGlzIGlzICpwZXJmZWN0KiBmdXp6aW5nIG1hdGVyaWFsLiBJdCYjMzk7cyBhbiBvYnZpb3VzIHRhcmdldC4gQnV0IGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byBmdXp6aW5nIHN0cmF0ZWd5LCBJIHNob3VsZCBtYWtlIHN1cmUgbXkgZW52aXJvbm1lbnQgaXMgcHJvcGVybHkgc2V0IHVwLiBSaWdodCwgSSBuZWVkIHRvIGNoZWNrIGlmIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gWWVzLCBpdCBpcy4gR29vZC4KCk5vdywgbGV0IG1lIHRoaW5rIGlmIHRoZXJlIGFyZSBvdGhlciwgbW9yZSBzdWJ0bGUgY29uZmlndXJhdGlvbnMgYXQgcGxheSBoZXJlLiBTaW5jZSBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIGAvcHJvY2AsIEkgc2hvdWxkIG1ha2Ugc3VyZSBgQ09ORklHX1BST0NfRlNgIGlzbiYjMzk7dCBzb21lIG9ic2N1cmUgcmVxdWlyZW1lbnQuIENoZWNraW5nIGBtbS9hbGxvY190YWcuY2AsIEkgc2VlIGBwcm9jX2NyZWF0ZWAsIHdoaWNoIHJlbGllcyBvbiBgQ09ORklHX1BST0NfRlNgLiBIb3dldmVyLCB0aGF0IGlzIGEgdmVyeSBjb21tb24gY29uZmlnLCBhbmQgbm90IHdvcnRoIHRoZSBsaXN0aW5nLiBOb3csIHdoZXJlIHdhcyBJPyBSaWdodCwgbGV0JiMzOTtzIGNoZWNrIGBsaWIvY29kZXRhZy5jYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2RldGFnLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9NYWtlZmlsZT0xOTY9b2JqLSQoQ09ORklHX0ZVTkNUSU9OX0VSUk9SX0lOSkVDVElPTikgJiM0Mzs9IGVycm9yLWluamVjdC5vXG5saWIvTWFrZWZpbGUtMTk3LVxubGliL01ha2VmaWxlOjE5ODpvYmotJChDT05GSUdfQ09ERV9UQUdHSU5HKSAmIzQzOz0gY29kZXRhZy5vXG5saWIvTWFrZWZpbGUtMTk5LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NTcxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqVmVyaWZ5aW5nIERlcGVuZGVuY2llcyBpbiBLZXJuZWwgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIHNlZSB0aGF0IGBDT05GSUdfQ09ERV9UQUdHSU5HYCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgSSBhbHdheXMgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGVzcGVjaWFsbHkgd2hlbiB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGNvcmUga2VybmVsIGNvbmZpZ3VyYXRpb24uIFRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBraW5kIG9mIGRlcGVuZGVuY3kgYXJlIHByZXR0eSBzaWduaWZpY2FudCwgYW5kIGEgbWlzdW5kZXJzdGFuZGluZyBoZXJlIGNvdWxkIGxlYWQgdG8gc29tZSBuYXN0eSBkZWJ1Z2dpbmcgaGVhZGFjaGVzIGxhdGVyIG9uLiBMZXQgbWUganVzdCBxdWlja2x5IGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBmaWxlIHRvIGNvbmZpcm0gdGhhdCB0aGUgZGVwZW5kZW5jeSBpcyBjb2RlZCBjb3JyZWN0bHkuIEkmIzM5O2xsIG1lbnRhbGx5IHN0ZXAgdGhyb3VnaCB0aGUgcmVsZXZhbnQgc2VjdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGUgbG9naWMgaXMgc291bmQgYW5kIHRoZXJlIGFyZSBubyB1bmV4cGVjdGVkIGludGVyYWN0aW9ucyBvciBjb25kaXRpb25hbHMgdGhhdCBtaWdodCBjaGFuZ2UgdGhlIGJlaGF2aW9yLiBJdCYjMzk7cyBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdHJhY2tpbmcgZG93biBhIGh5cG90aGV0aWNhbCBidWcgZG93biB0aGUgbGluZS4gSXQmIzM5O3Mgc2Vjb25kIG5hdHVyZSBmb3IgbWUgdG8gaW1tZWRpYXRlbHkgdmVyaWZ5IGEgZGVwZW5kZW5jeSBsaWtlIHRoaXMuIEdvb2QgdG8gZ28hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkcmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1ZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3ODQ1CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKkZpbmRpbmcgdGhlIERlZmluaXRpb24gb2YgYE1FTV9BTExPQ19QUk9GSUxJTkdgKioKCk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIGV4YWN0bHkgd2hlcmUgdGhpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZGVmaW5lZC4gVGhpcyBsaWtlbHkgbWVhbnMgaXQmIzM5O3MgYSBwcmVwcm9jZXNzb3IgbWFjcm8gb3IsIGxlc3MgbGlrZWx5LCBhIHZhcmlhYmxlLiBHaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIG15IGluaXRpYWwgYmV0IGlzIG9uIGEgbWFjcm8uIEkmIzM5O2xsIG5lZWQgdG8ga25vdyBpdHMgZGVmaW5pdGlvbiB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3Qgb24gdGhlIGNvZGViYXNlIGFuZCwgdWx0aW1hdGVseSwgd2hhdCB0aGUgY29tcGlsZXIgZG9lcyB3aXRoIGl0LiBUaGlzIGlzIGNydWNpYWwgZm9yIGRlYnVnZ2luZyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYmVoYXZpb3IsIGVzcGVjaWFsbHkgaWYgdGhlcmUmIzM5O3MgYW55IGFsbG9jYXRpb24gcHJvZmlsaW5nIGVuYWJsZWQuIE5vdywgbGV0JiMzOTtzIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgaW5jbHVkZXMsIGJ1aWxkIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBzZXR0aW5ncyB0byBuYWlsIGRvd24gdGhhdCBkZWZpbml0aW9uLiBLbm93aW5nIHRoZSBwcmVjaXNlIGxvY2F0aW9uIHdpbGwgdW5sb2NrIHRoZSBmdWxsIGNvbnRleHQgb2YgaXRzIHVzYWdlIGFuZCB3aGF0IGZsYWdzIGRldGVybWluZSBpdHMgcHJlc2VuY2UuIFRpbWUgdG8gcHV0IG9uIG15IGRldGVjdGl2ZSBoYXQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcbi0tXG5tbS9LY29uZmlnLmRlYnVnLTMyMy1cbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXG5tbS9LY29uZmlnLmRlYnVnLTMyNS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuLS1cbm1tL0tjb25maWcuZGVidWctMzM3LVxubW0vS2NvbmZpZy5kZWJ1ZzozMzg6Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG5tbS9LY29uZmlnLmRlYnVnLTMzOS1cdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBieSBkZWZhdWx0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zNDItXG5tbS9LY29uZmlnLmRlYnVnOjM0Mzpjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXHRib29sIFwmIzM0O01lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGVyIGRlYnVnZ2luZ1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODI3OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gRGVidWcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nLCB3aGVyZSYjMzk7cyB0aGUgYmVzdCBwbGFjZSB0byBkaWcgaW50byB0aGVzZSBkZWJ1ZyBvcHRpb25zPyBNeSBpbnN0aW5jdCBpcyB0byBjaGVjayBgbW0vS2NvbmZpZy5kZWJ1Z2AuIFRoYXQmIzM5O3MgdXN1YWxseSB0aGUgZ28tdG8gc3BvdCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQtcmVsYXRlZCBkZWJ1Z2dpbmcgY29uZmlndXJhdGlvbnMsIGVzcGVjaWFsbHkgYXJvdW5kIHRoZSBjb3JlIG1lbW9yeSBhcmVhcy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgYWltaW5nIGFyb3VuZCBsaW5lIDMyNDsgdGhhdCBmZWVscyBsaWtlIGEgbGlrZWx5IHBvaW50IHRvIHN0YXJ0IHVucmF2ZWxpbmcgd2hhdCYjMzk7cyBlbmFibGVkIGFuZCBkaXNhYmxlZC4gTXkgaG9wZSBpcyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2Ygd2hpY2ggZmVhdHVyZXMgYXJlIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBidWlsZCBhbmQgdW5kZXJzdGFuZCBob3cgdGhleSBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIsIHJpZ2h0IGluIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlLiBJIGFudGljaXBhdGUgdGhlcmUmIzM5O2xsIGJlIGNvbmRpdGlvbmFsIGJsb2NrcyBhbmQgc29tZSBpbnRlcmVzdGluZyBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhLiBJdCYjMzk7cyB0aW1lIHRvIGdldCBhIGJldHRlciBncmFzcCBvbiB3aGF0IGNhbiBiZSBhZGp1c3RlZCwgYW5kIGhvdyBpdCBpbXBhY3RzIHRoZSBydW50aW1lIGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wOSAxMTo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyMDpcdFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxuIDMyMTpcdFxuIDMyMjpcdFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4gMzIzOlx0XG4gMzI0Olx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcbiAzMjU6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1wmIzM0O1xuIDMyNjpcdFx0ZGVmYXVsdCBuXG4gMzI3Olx0XHRkZXBlbmRzIG9uIE1NVVxuIDMyODpcdFx0ZGVwZW5kcyBvbiBQUk9DX0ZTXG4gMzI5Olx0XHRkZXBlbmRzIG9uICFERUJVR19GT1JDRV9XRUFLX1BFUl9DUFVcbiAzMzA6XHRcdHNlbGVjdCBDT0RFX1RBR0dJTkdcbiAzMzE6XHRcdHNlbGVjdCBQQUdFX0VYVEVOU0lPTlxuIDMzMjpcdFx0c2VsZWN0IFNMQUJfT0JKX0VYVFxuIDMzMzpcdFx0aGVscFxuIDMzNDpcdFx0ICBUcmFjayBhbGxvY2F0aW9uIHNvdXJjZSBjb2RlIGFuZCByZWNvcmQgdG90YWwgYWxsb2NhdGlvbiBzaXplXG4gMzM1Olx0XHQgIGluaXRpYXRlZCBhdCB0aGF0IGNvZGUgbG9jYXRpb24uIFRoZSBtZWNoYW5pc20gY2FuIGJlIHVzZWQgdG8gdHJhY2tcbiAzMzY6XHRcdCAgbWVtb3J5IGxlYWtzIHdpdGggYSBsb3cgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBpbXBhY3QuXG4gMzM3Olx0XG4gMzM4Olx0Y29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXG4gMzM5Olx0XHRib29sIFwmIzM0O0VuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFwmIzM0O1xuIDM0MDpcdFx0ZGVmYXVsdCB5XG4gMzQxOlx0XHRkZXBlbmRzIG9uIE1FTV9BTExPQ19QUk9GSUxJTkdcbiAzNDI6XHRcbiAzNDM6XHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19ERUJVR1xuIDM0NDpcdFx0Ym9vbCBcJiMzNDtNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxlciBkZWJ1Z2dpbmdcJiMzNDtcbiAzNDU6XHRcdGRlZmF1bHQgblxuIDM0NjpcdFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXG4gMzQ3Olx0XHRzZWxlY3QgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcbiAzNDg6XHRcdGhlbHBcbiAzNDk6XHRcdCAgQWRkcyB3YXJuaW5ncyB3aXRoIGhlbHBmdWwgZXJyb3IgbWVzc2FnZXMgZm9yIG1lbW9yeSBhbGxvY2F0aW9uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4OTM0CgkJCQkJCQlvdXRwdXQ6IDE0NgoJCQkJCQkJdGhvdWdodHM6IDE5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmc6IFRoZSBDb25maWd1cmF0aW9uIFBhdGgqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0aGlua2luZyBhYm91dCB0aGlzIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyBjb25maWd1cmF0aW9uLCBhbmQgaXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBJdCBsb29rcyBsaWtlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyB0aGUga2V5LiBUaGF0JiMzOTtzIHRoZSBtYWluIGNvbmZpZyBmbGFnIHdlIG5lZWQgdG8gZmxpcCB0byBnZXQgdGhpcyB3aG9sZSB0aGluZyB3b3JraW5nLiBJIHdhcyBpbml0aWFsbHkgd29uZGVyaW5nIGlmIHdlJiMzOTtkIG5lZWQgYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBhcyB3ZWxsLCBvciBpZiB3ZSYjMzk7ZCBoYXZlIHRvIHVzZSBgc3lzY3RsYCBvciBhIGJvb3QgcGFyYW1ldGVyLiBCdXQsIGhvbGQgb24uLi4gYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBkZWZhdWx0cyB0byAmIzM5O3kmIzM5OyAqaWYqIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBFeGNlbGxlbnQuIFRoYXQgc2ltcGxpZmllcyB0aGluZ3MgcXVpdGUgYSBiaXQuIEp1c3Qgc2V0dGluZyBgTUVNX0FMTE9DX1BST0ZJTElOR2Agc2hvdWxkIGJlIHN1ZmZpY2llbnQuCgpOb3csIGxldCYjMzk7cyBzZWUgd2hhdCBuZXcgZnVuY3Rpb25hbGl0eSBpcyBiZWluZyBpbnRyb2R1Y2VkLiBUaW1lIHRvIGNoZWNrIHRoZSBmb2N1cyBzeW1ib2xzLiBMb29rcyBsaWtlIHdlIGhhdmUgYSBuZXcgc2V0IG9mIGZ1bmN0aW9uczogSSBzZWUgYGFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZGAsIGBhbGxvY2luZm9faW9jdGxfZ2V0X2F0YCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dGAsIGBhbGxvY2luZm9faW9jdGxgLCBgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bGAsIGBhbGxvY2luZm9fb3BlbmAgYW5kIGBhbGxvY2luZm9fcmVsZWFzZWAgZnVuY3Rpb25zLiBUaGVyZSYjMzk7cyBhbHNvIGBtYXRjaGVzX2ZpbHRlcmAuIEdvb2QgdG8gaGF2ZSB0aGlzIGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA5IDExOjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1fQUxMT0NfUFJPRklMSU5HJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bF9nZXRfYXQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0JiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19pb2N0bCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9fY29tcGF0X2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19vcGVuJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19yZWxlYXNlJiMzNDssCiAgICAmIzM0O21hdGNoZXNfZmlsdGVyJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgaW9jdGwgaW50ZXJmYWNlIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgdmlhIC9wcm9jL2FsbG9jaW5mby4gVGhpcyBpcyBhIG5ldyBmdW5jdGlvbmFsIEFQSSBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTV9BTExPQ19QUk9GSUxJTkcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsX2dldF9hdCYjMzQ7LAogICAgJiMzNDthbGxvY2luZm9faW9jdGxfZ2V0X25leHQmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX2lvY3RsJiMzNDssCiAgICAmIzM0O2FsbG9jaW5mb19jb21wYXRfaW9jdGwmIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX29wZW4mIzM0OywKICAgICYjMzQ7YWxsb2NpbmZvX3JlbGVhc2UmIzM0OywKICAgICYjMzQ7bWF0Y2hlc19maWx0ZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjA1LjE0Nzk3ODI0OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwNTEyNTMyMTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MDUuMTQ3OTgzNDI4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODcxMTgxOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgSnVsIDkgMTE6NTA6MDMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XFxuQEAgLTQ2LDYgKzQ2LDExIEBAIHN5c2N0bDpcXG4gUnVudGltZSBpbmZvOlxcbiAgIC9wcm9jL2FsbG9jaW5mb1xcbiBcXG4rICBQcm9maWxpbmcgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGVpdGhlciBieSByZWFkaW5nIGAvcHJvYy9hbGxvY2luZm9gIGRpcmVjdGx5IGFzXFxuKyAgdGV4dCBvciBwcm9ncmFtbWF0aWNhbGx5IHZpYSBgaW9jdGwoKWAgY2FsbHMgZGVmaW5lZCBpbiBgXFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXHUwMDNlYC5cXG4rICBUaGUgaW9jdGwgaW50ZXJmYWNlIHN1cHBvcnRzIHN0cnVjdHVyZWQgYmluYXJ5IGRhdGEgZXh0cmFjdGlvbiBhcyB3ZWxsIGFzIGZpbHRlcmluZ1xcbisgIGJ5IG1vZHVsZSBuYW1lLCBmdW5jdGlvbiwgZmlsZSwgbGluZSBudW1iZXIsIGFjY3VyYWN5LCBvciBhbGxvY2F0aW9uIHNpemUgbGltaXRzLlxcbitcXG4gRXhhbXBsZSBvdXRwdXQ6OlxcbiBcXG4gICByb290QG1vcmlhLWt2bTp+IyBzb3J0IC1nIC9wcm9jL2FsbG9jaW5mb3x0YWlsfG51bWZtdCAtLXRvPWllY1xcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdCBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcXG5AQCAtMzQ2LDYgKzM0Niw4IEBAIENvZGUgIFNlcSMgICAgSW5jbHVkZSBGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXFx1MDAzZVxcbiAweEE1ICAyMC0yRiAgbGludXgvc3VyZmFjZV9hZ2dyZWdhdG9yL2R0eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBTdXJmYWNlIERUWCBkcml2ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXFx1MDAzZVxcbisweEE2ICAwMC0wRiAgdWFwaS9saW51eC9hbGxvY190YWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwM2NtYWlsdG86c3VyZW5iQGdvb2dsZS5jb21cXHUwMDNlXFxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcXG4gMHhBQiAgMDAtMUYgIGxpbnV4L25iZC5oXFxuIDB4QUMgIDAwLTFGICBsaW51eC9yYXcuaFxcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXFxuaW5kZXggZDE5ODIyZDU3NGZkNDguLjNkNTRmZDhkNjljMWM2IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTY5MzYsNyArMTY5MzYsOSBAQCBTOlxcdE1haW50YWluZWRcXG4gRjpcXHREb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxcbiBGOlxcdGluY2x1ZGUvbGludXgvYWxsb2NfdGFnLmhcXG4gRjpcXHRpbmNsdWRlL2xpbnV4L3BnYWxsb2NfdGFnLmhcXG4rRjpcXHRpbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG4gRjpcXHRtbS9hbGxvY190YWcuY1xcbitGOlxcdHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9cXG4gXFxuIE1FTU9SWSBNQU5BR0VNRU5UIC0gQkFMTE9PTlxcbiBNOlxcdEFuZHJldyBNb3J0b24gXFx1MDAzY2FrcG1AbGludXgtZm91bmRhdGlvbi5vcmdcXHUwMDNlXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcXG5pbmRleCBkZGFlNzQ4NGNhNDU2Yy4uYTI1YTA4NWMyZGYxOTkgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxcbkBAIC03Nyw2ICs3Nyw4IEBAIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIHtcXG4gdm9pZCBjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gYm9vbCBjb2RldGFnX3RyeWxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gdm9pZCBjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xcbit1bnNpZ25lZCBsb25nIGNvZGV0YWdfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4rdW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XFxuIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcXG4gc3RydWN0IGNvZGV0YWcgKmNvZGV0YWdfbmV4dF9jdChzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciAqaXRlcik7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXG5AQCAtMCwwICsxLDk5IEBAXFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wIFdJVEggTGludXgtc3lzY2FsbC1ub3RlICovXFxuKy8qXFxuKyAqIGFsbG9jX3RhZyBJT0NUTCBBUEkgZGVmaW5pdGlvblxcbisgKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxcbisgKlxcbisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxcbisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhc1xcbisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi5cXG4rICovXFxuK1xcbisjaWZuZGVmIF9VQVBJX0FMTE9DX1RBR19IXFxuKyNkZWZpbmUgX1VBUElfQUxMT0NfVEFHX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbitcXG4rLypcXG4rICogRnVuY3Rpb24sIGZpbGUgYW5kIG1vZHVsZSBuYW1lcyBvZnRlbiBoYXZlIHRoZSBzYW1lIHByZWZpeGVzLCB0aGVyZWZvcmVcXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xcbisgKiBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBuYW1lIGNvbGxpc2lvbnNcXG4rICovXFxuKyNkZWZpbmUgQUxMT0NJTkZPX1NUUl9TSVpFXFx0NjRcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7XFxuK1xcdF9fdTY0IGlkO1xcbit9O1xcbitcXG4rc3RydWN0IGFsbG9jaW5mb190YWcge1xcbitcXHQvKiBMb25nZXIgbmFtZXMgYXJlIHRyaW1tZWQgKi9cXG4rXFx0Y2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XFxuK1xcdGNoYXIgZnVuY3Rpb25bQUxMT0NJTkZPX1NUUl9TSVpFXTtcXG4rXFx0Y2hhciBmaWxlbmFtZVtBTExPQ0lORk9fU1RSX1NJWkVdO1xcbitcXHRfX3U2NCBsaW5lbm87XFxuK1xcdC8qIGZpbHRlciBjcml0ZXJpYSBvbmx5OyBzZWUgYWxsb2NpbmZvX2NvdW50ZXIuYWNjdXJhdGUgZm9yIGFjdHVhbCBhY2N1cmFjeSAqL1xcbitcXHRfX3U2NCBpbmFjY3VyYXRlO1xcbit9O1xcbitcXG4rLyogVGhlIGFsaWdubWVudCBlbnN1cmVzIDMyLWJpdCBjb21wYXRpYmxlIGludGVyZmFjZXMgYXJlIG5vdCBicm9rZW4gKi9cXG4rc3RydWN0IGFsbG9jaW5mb19jb3VudGVyIHtcXG4rXFx0X191NjQgYnl0ZXM7XFxuK1xcdF9fdTY0IGNhbGxzO1xcbitcXHRfX3U4IGFjY3VyYXRlO1xcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEge1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyB0YWc7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xcbit9O1xcbitcXG4rZW51bSB7XFxuK1xcdEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTixcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8sXFxuK1xcdEFMTE9DSU5GT19GSUxURVJfSU5BQ0NVUkFURSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcXG4rXFx0QUxMT0NJTkZPX0ZJTFRFUl9NQVhfU0laRSxcXG4rXFx0X19BTExPQ0lORk9fRklMVEVSX0xBU1QgPSBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFXFxuK307XFxuK1xcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NT0ROQU1FKVxcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfRlVOQ1RJT04pXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSlcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9MSU5FTk8pXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcXHQoMSBcXHUwMDNjXFx1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFXFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSlcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkVcXHRcXHQoMSBcXHUwMDNjXFx1MDAzYyBBTExPQ0lORk9fRklMVEVSX01BWF9TSVpFKVxcbitcXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tTIFxcXFxcXG4rXFx0KCgxIFxcdTAwM2NcXHUwMDNjIChfX0FMTE9DSU5GT19GSUxURVJfTEFTVCArIDEpKSAtIDEpXFxuK1xcbitzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciB7XFxuK1xcdF9fdTY0IG1hc2s7IC8qIGJpdG1hc2sgb2YgdGhlIGZpbHRlciBmaWVsZHMgdXNlZCAqL1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7XFxuK1xcdF9fdTY0IG1pbl9zaXplO1xcbitcXHRfX3U2NCBtYXhfc2l6ZTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHtcXG4rXFx0LyogaW5wdXRzICovXFxuK1xcdF9fdTY0IHBvcztcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xcbitcXHQvKiBvdXRwdXQgKi9cXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSBkYXRhO1xcbit9O1xcbitcXG4rI2RlZmluZSBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEXFx0MFxcbisjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9BVFxcdFxcdDFcXG4rI2RlZmluZSBfQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19CQVNFXFx0XFx0MHhBNlxcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRFxcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELFxcdFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQpXFxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19HRVRfQVRcXHRcXHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcXHRcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0KVxcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfR0VUX05FWFRcXHRcXHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsXFx0XFxcXFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXFxuK1xcbisjZW5kaWYgLyogX1VBUElfQUxMT0NfVEFHX0ggKi9cXG5kaWZmIC0tZ2l0IGEvbGliL2NvZGV0YWcuYyBiL2xpYi9jb2RldGFnLmNcXG5pbmRleCA0MDAxYTdlYTY2NzU0Mi4uYTljZGE0Yzk2MmEzMDMgMTAwNjQ0XFxuLS0tIGEvbGliL2NvZGV0YWcuY1xcbisrKyBiL2xpYi9jb2RldGFnLmNcXG5AQCAtMTksNiArMTksOCBAQCBzdHJ1Y3QgY29kZXRhZ190eXBlIHtcXG4gXFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XFxuIFxcdC8qIGdlbmVyYXRlcyB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyIGZvciBtb2R1bGUgbG9hZCAqL1xcbiBcXHR1bnNpZ25lZCBsb25nIG5leHRfbW9kX3NlcTtcXG4rXFx0LyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyBjb250ZW50X2lkO1xcbiB9O1xcbiBcXG4gc3RydWN0IGNvZGV0YWdfcmFuZ2Uge1xcbkBAIC01MCw2ICs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcXG4gXFx0dXBfcmVhZChcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuIH1cXG4gXFxuK3Vuc2lnbmVkIGxvbmcgY29kZXRhZ19nZXRfY29udGVudF9pZChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXFxuK3tcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2Y3R0eXBlLVxcdTAwM2Vtb2RfbG9jayk7XFxuK1xcbitcXHRyZXR1cm4gY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbit9XFxuK1xcbit1bnNpZ25lZCBpbnQgY29kZXRhZ19nZXRfY291bnQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKVxcbit7XFxuK1xcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2xvY2spO1xcbitcXG4rXFx0cmV0dXJuIGN0dHlwZS1cXHUwMDNlY291bnQ7XFxuK31cXG4rXFxuIHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGNvZGV0YWdfZ2V0X2N0X2l0ZXIoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKVxcbiB7XFxuIFxcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXIgPSB7XFxuQEAgLTIwNCw2ICsyMjAsNyBAQCBzdGF0aWMgaW50IGNvZGV0YWdfbW9kdWxlX2luaXQoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlLCBzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIFxcbiBcXHRkb3duX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gXFx0Y21vZC1cXHUwMDNlbW9kX3NlcSA9ICsrY3R0eXBlLVxcdTAwM2VuZXh0X21vZF9zZXE7XFxuK1xcdCsrY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbiBcXHRtb2RfaWQgPSBpZHJfYWxsb2MoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7XFxuIFxcdGlmIChtb2RfaWQgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRpZiAoY3R0eXBlLVxcdTAwM2VkZXNjLm1vZHVsZV9sb2FkKSB7XFxuQEAgLTM2OCw2ICszODUsNyBAQCB2b2lkIGNvZGV0YWdfdW5sb2FkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpXFxuIFxcdFxcdFxcdGN0dHlwZS1cXHUwMDNlY291bnQgLT0gcmFuZ2Vfc2l6ZShjdHR5cGUsIFxcdTAwMjZjbW9kLVxcdTAwM2VyYW5nZSk7XFxuIFxcdFxcdFxcdGlkcl9yZW1vdmUoXFx1MDAyNmN0dHlwZS1cXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcXG4gXFx0XFx0XFx0a2ZyZWUoY21vZCk7XFxuK1xcdFxcdFxcdCsrY3R0eXBlLVxcdTAwM2Vjb250ZW50X2lkO1xcbiBcXHRcXHR9XFxuIFxcdFxcdHVwX3dyaXRlKFxcdTAwMjZjdHR5cGUtXFx1MDAzZW1vZF9sb2NrKTtcXG4gXFx0XFx0aWYgKGZvdW5kIFxcdTAwMjZcXHUwMDI2IGN0dHlwZS1cXHUwMDNlZGVzYy5mcmVlX3NlY3Rpb25fbWVtKVxcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXFxuaW5kZXggY2Y2NWU5OTkyZmRhMzMuLjJjODE5ZmE5ZWFmYWQwIDEwMDY0NFxcbi0tLSBhL21tL2FsbG9jX3RhZy5jXFxuKysrIGIvbW0vYWxsb2NfdGFnLmNcXG5AQCAtNSw2ICs1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2dmcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva2FsbHN5bXMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VfZXh0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wZ2FsbG9jX3RhZy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY19mcy5oXFx1MDAzZVxcbkBAIC0xNCw2ICsxNSw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfY2hvaWNlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdm1hbGxvYy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva21lbWxlYWsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInBhZ2VfYWxsb2MuaFxcXCJcXG5AQCAtNTAsNiArNTIsMTEgQEAgc3RydWN0IGFsbG9jaW5mb19wcml2YXRlIHtcXG4gXFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlcjtcXG4gXFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcXG4gXFx0Ym9vbCBwcmludF9oZWFkZXI7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0LyogaW9jdGwgdXNlcyBhIHNlcGFyYXRlIGl0ZXJhdG9yIG5vdCB0byBpbnRlcmZlcmUgd2l0aCByZWFkcyAqL1xcbitcXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpb2N0bF9pdGVyO1xcbitcXHRib29sIHBvc2l0aW9uZWQ7IC8qIHNlcV9vcGVuX3ByaXZhdGUoKSBzZXRzIHRvIDAgKi9cXG4rXFx0c3RydWN0IG11dGV4IGlvY3RsX2xvY2s7XFxuIH07XFxuIFxcbiBzdGF0aWMgdm9pZCAqYWxsb2NpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpXFxuQEAgLTEzMyw2ICsxNDAsMzQwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWxsb2NpbmZvX3NlcV9vcCA9IHtcXG4gXFx0LnNob3dcXHQ9IGFsbG9jaW5mb19zaG93LFxcbiB9O1xcbiBcXG4rLypcXG4rICogSW5pdGlhbGl6ZXMgc2VxX2ZpbGUgb3BlcmF0aW9ucyBhbmQgYWxsb2NhdGVzIHByaXZhdGUgc3RhdGUgd2hlbiBvcGVuaW5nXFxuKyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxcbisgKi9cXG4rc3RhdGljIGludCBhbGxvY2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gc2VxX29wZW5fcHJpdmF0ZShmaWxlLCBcXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcXG4rXFx0XFx0XFx0ICAgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUpKTtcXG4rXFx0aWYgKCFyZXQpIHtcXG4rXFx0XFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbitcXHRcXHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXYgPSBtLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0XFx0bXV0ZXhfaW5pdChcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfbG9jayk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogQ2xlYW5zIHVwIHRoZSBzZXFfZmlsZSBzdGF0ZSBhbmQgZnJlZXMgdXAgdGhlIHByaXZhdGUgc3RhdGUgYWxsb2NhdGVkIGluXFxuKyAqIGFsbG9jaW5mb19vcGVuKCkgd2hlbiBjbG9zaW5nIHRoZSAvcHJvYy9hbGxvY2luZm8gZmlsZSBkZXNjcmlwdG9yLlxcbisgKi9cXG4rc3RhdGljIGludCBhbGxvY2luZm9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4re1xcbitcXHRzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdiA9IG0tXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHRtdXRleF9kZXN0cm95KFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHNvIHRoYXQgaXRzIGxlbmd0aCBmaXRzIHdpdGhpblxcbisgKiBBTExPQ0lORk9fU1RSX1NJWkUsIHByZXNlcnZpbmcgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcnMuXFxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXFxuKyAqIHdoZW4gZmlsdGVyaW5nIGJ5IHRoZXNlIGNyaXRlcmlhLCB3ZSBjb21wYXJlIHRoZSBsYXN0IDY0IGNoYXJhY3RlcnMgdG9cXG4rICogbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgbmFtZSBjb2xsaXNpb25zXFxuKyAqL1xcbitzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpO1xcbitcXG4rXFx0LyogS2VlcCBhbiBleHRyYSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIE5VTEwuICovXFxuK1xcdGlmIChsZW4gXFx1MDAzZT0gQUxMT0NJTkZPX1NUUl9TSVpFKVxcbitcXHRcXHRzdHIgKz0gKGxlbiAtIEFMTE9DSU5GT19TVFJfU0laRSkgKyAxO1xcbitcXHRyZXR1cm4gc3RyO1xcbit9XFxuK1xcbisvKiBDb3B5IGEgc3RyaW5nIGFuZCB0cmltIGZyb20gdGhlIGJlZ2lubmluZyBpZiBpdCdzIHRvbyBsb25nICovXFxuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpXFxuK3tcXG4rXFx0c3Ryc2NweV9wYWQoZGVzdCwgYWxsb2NpbmZvX3N0cihzcmMpLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xcbit9XFxuK1xcbisvKiBDb21wYXJlIHR3byBzdHJpbmdzIGFuZCBvbmx5IGNvbnNpZGVyIHRoZSB0cmltbWVkIHN1ZmZpeCBpZiBzMSBpcyB0b28gbG9uZyAqL1xcbitzdGF0aWMgaW50IGFsbG9jaW5mb19jbXBfc3RyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqdGVtcGxhdGUpXFxuK3tcXG4rXFx0cmV0dXJuIHN0cm5jbXAoYWxsb2NpbmZvX3N0cihzdHIpLCB0ZW1wbGF0ZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rfVxcbitcXG4rLyogRmV0Y2ggdGhlIHBlci1DUFUgY291bnRlcnMgKi9cXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXFxuK3tcXG4rXFx0cmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBQb3B1bGF0ZXMgdGhlIFVBUEkgYWxsb2NpbmZvX3RhZ19kYXRhIHN0cnVjdHVyZSB3aXRoIGFjdGl2ZSBydW50aW1lXFxuKyAqIHByb2ZpbGluZyBjb3VudGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgZ2l2ZW4ga2VybmVsIGNvZGV0YWcuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBhbGxvY2luZm9fdG9fcGFyYW1zKHN0cnVjdCBjb2RldGFnICpjdCxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMpXFxuK3tcXG4rXFx0aWYgKGN0LVxcdTAwM2Vtb2RuYW1lKVxcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cXHUwMDNldGFnLm1vZG5hbWUsIGN0LVxcdTAwM2Vtb2RuYW1lKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRkYXRhLVxcdTAwM2V0YWcubW9kbmFtZVswXSA9ICdcXFxcMCc7XFxuK1xcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVxcdTAwM2V0YWcuZnVuY3Rpb24sIGN0LVxcdTAwM2VmdW5jdGlvbik7XFxuK1xcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVxcdTAwM2V0YWcuZmlsZW5hbWUsIGN0LVxcdTAwM2VmaWxlbmFtZSk7XFxuK1xcdGRhdGEtXFx1MDAzZXRhZy5saW5lbm8gPSBjdC1cXHUwMDNlbGluZW5vO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmJ5dGVzID0gY291bnRlcnMtXFx1MDAzZWJ5dGVzO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmNhbGxzID0gY291bnRlcnMtXFx1MDAzZWNhbGxzO1xcbitcXHRkYXRhLVxcdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBjb250ZW50IElEIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uIHRhZyBtb2R1bGVcXG4rICogbGF5b3V0LCBhbGxvd2luZyB1c2Vyc3BhY2UgdG8gZGV0ZWN0IGlmIG1vZHVsZXMgd2VyZSBsb2FkZWQgLyB1bmxvYWRlZC5cXG4rICovXFxuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG4re1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgcGFyYW1zO1xcbitcXG4rXFx0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcXG4rXFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLypcXG4rICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XFxuKyAqIG1hdGNoaW5nIGl0cyBjaGFyYWN0ZXJpc3RpY3MgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGZpbHRlci5cXG4rICovXFxuK3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyAqY291bnRlcnMsXFxuK1xcdFxcdFxcdCAgIGJvb2wgKmZldGNoZWRfY291bnRlcnMpXFxuK3tcXG4rXFx0Ym9vbCBpbmFjY3VyYXRlO1xcbitcXG4rXFx0aWYgKCFmaWx0ZXIgfHwgIWZpbHRlci1cXHUwMDNlbWFzaylcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcbitcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUUpIHtcXG4rXFx0XFx0LyogdXNlciB3YW50cyB0byBmaWx0ZXIgYnkgbW9kbmFtZSBidXQgY3QtXFx1MDAzZW1vZG5hbWUgaXMgTlVMTCAqL1xcbitcXHRcXHRpZiAoIWN0LVxcdTAwM2Vtb2RuYW1lKSB7XFxuK1xcdFxcdFxcdC8qIHZhbGlkYXRlIGlmIHVzZXIgd2FzIGF0dGVtcHRpbmcgdG8gZmlsdGVyIGZvciBidWlsdC1pbiBhbGxvY2F0aW9ucyAqL1xcbitcXHRcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VmaWVsZHMubW9kbmFtZVswXSAhPSAnXFxcXDAnKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH0gZWxzZSBpZiAoYWxsb2NpbmZvX2NtcF9zdHIoY3QtXFx1MDAzZW1vZG5hbWUsIGZpbHRlci1cXHUwMDNlZmllbGRzLm1vZG5hbWUpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3QtXFx1MDAzZWZ1bmN0aW9uIFxcdTAwMjZcXHUwMDI2IGFsbG9jaW5mb19jbXBfc3RyKGN0LVxcdTAwM2VmdW5jdGlvbiwgZmlsdGVyLVxcdTAwM2VmaWVsZHMuZnVuY3Rpb24pKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAoKGZpbHRlci1cXHUwMDNlbWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGN0LVxcdTAwM2VmaWxlbmFtZSBcXHUwMDI2XFx1MDAyNiBhbGxvY2luZm9fY21wX3N0cihjdC1cXHUwMDNlZmlsZW5hbWUsIGZpbHRlci1cXHUwMDNlZmllbGRzLmZpbGVuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgY3QtXFx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXFx1MDAzZWZpZWxkcy5saW5lbm8pXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xcbitcXHRcXHRpbmFjY3VyYXRlID0gISEoY3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQ09ERVRBR19GTEFHX0lOQUNDVVJBVEUpO1xcbitcXHRcXHRpZiAoaW5hY2N1cmF0ZSAhPSAhIShmaWx0ZXItXFx1MDAzZWZpZWxkcy5pbmFjY3VyYXRlKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgKEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSB8IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkpIHtcXG4rXFx0XFx0aWYgKCEqZmV0Y2hlZF9jb3VudGVycykge1xcbitcXHRcXHRcXHQqY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xcbitcXHRcXHRcXHQqZmV0Y2hlZF9jb3VudGVycyA9IHRydWU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBjb3VudGVycy1cXHUwMDNlYnl0ZXMgXFx1MDAzYyBmaWx0ZXItXFx1MDAzZW1pbl9zaXplKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdGlmICgoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY291bnRlcnMtXFx1MDAzZWJ5dGVzIFxcdTAwM2UgZmlsdGVyLVxcdTAwM2VtYXhfc2l6ZSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLypcXG4rICogU2Vla3MgdGhlIGlvY3RsIGl0ZXJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgMC1pbmRleGVkIHRhZyBwb3NpdGlvbiwgcmVhZHMgaXRzXFxuKyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9hdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xcbitcXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcXG4rXFx0X191NjQgc2tpcF9jb3VudDtcXG4rXFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcXG4rXFx0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xcbitcXG4rXFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZwYXJhbXMsIGFyZywgc2l6ZW9mKHBhcmFtcykpKVxcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFxuK1xcdGlmIChwYXJhbXMuZmlsdGVyLm1hc2sgXFx1MDAyNiB+QUxMT0NJTkZPX0ZJTFRFUl9NQVNLUylcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRpZiAoKHBhcmFtcy5maWx0ZXIubWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChwYXJhbXMuZmlsdGVyLm1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBwYXJhbXMuZmlsdGVyLm1pbl9zaXplIFxcdTAwM2UgcGFyYW1zLmZpbHRlci5tYXhfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHRwcml2ID0gbS1cXHUwMDNlcHJpdmF0ZTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2xvY2spO1xcbitcXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XFxuK1xcbitcXHRpZiAocGFyYW1zLnBvcyBcXHUwMDNlPSBjb2RldGFnX2dldF9jb3VudChhbGxvY190YWdfY3R0eXBlKSkge1xcbitcXHRcXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFxuK1xcdHNraXBfY291bnQgPSBwYXJhbXMucG9zO1xcbitcXG4rXFx0aWYgKHBhcmFtcy5maWx0ZXIubWFzaylcXG4rXFx0XFx0cHJpdi1cXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcXG4rXFx0ZWxzZVxcbitcXHRcXHRwcml2LVxcdTAwM2VmaWx0ZXIubWFzayA9IDA7XFxuK1xcbitcXHQvKiBGaW5kIHRoZSBjb2RldGFnICovXFxuK1xcdHByaXYtXFx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRjdCA9IGNvZGV0YWdfbmV4dF9jdChcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfaXRlcik7XFxuK1xcbitcXHR3aGlsZSAoY3QpIHtcXG4rXFx0XFx0ZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlO1xcbitcXHRcXHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFxcdTAwMjZwcml2LVxcdTAwM2VmaWx0ZXIsIFxcdTAwMjZjb3VudGVycywgXFx1MDAyNmZldGNoZWRfY291bnRlcnMpKSB7XFxuK1xcdFxcdFxcdGlmIChza2lwX2NvdW50ID09IDApXFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRza2lwX2NvdW50LS07XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoY3QpIHtcXG4rXFx0XFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxcbitcXHRcXHRcXHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XFxuK1xcdFxcdGFsbG9jaW5mb190b19wYXJhbXMoY3QsIFxcdTAwMjZwYXJhbXMuZGF0YSwgXFx1MDAyNmNvdW50ZXJzKTtcXG4rXFx0XFx0cHJpdi1cXHUwMDNlcG9zaXRpb25lZCA9IHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2xvY2spO1xcbitcXG4rXFx0aWYgKCFjdClcXG4rXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuK1xcbitcXHRpZiAoY29weV90b191c2VyKGFyZywgXFx1MDAyNnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpKVxcbitcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBBZHZhbmNlcyB0aGUgaW9jdGwgaXRlcmF0b3IgdG8gdGhlIG5leHQgYWxsb2NhdGlvbiB0YWcgaW4gdGhlIHNlcXVlbmNlIGFuZFxcbisgKiByZXR1cm5zIGl0cyBwcm9maWxpbmcgZGF0YSB0byB1c2Vyc3BhY2UuXFxuKyAqL1xcbitzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2O1xcbitcXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgcGFyYW1zO1xcbitcXHRpbnQgcmV0ID0gMDtcXG4rXFx0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcXG4rXFx0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcXG4rXFx0cHJpdiA9IG0tXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2Vpb2N0bF9sb2NrKTtcXG4rXFx0Y29kZXRhZ19sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXG4rXFx0aWYgKCFwcml2LVxcdTAwM2Vwb3NpdGlvbmVkKSB7XFxuK1xcdFxcdHByaXYtXFx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vwb3NpdGlvbmVkID0gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR3aGlsZSAoY3QpIHtcXG4rXFx0XFx0ZmV0Y2hlZF9jb3VudGVycyA9IGZhbHNlO1xcbitcXHRcXHRpZiAobWF0Y2hlc19maWx0ZXIoY3QsIFxcdTAwMjZwcml2LVxcdTAwM2VmaWx0ZXIsIFxcdTAwMjZjb3VudGVycywgXFx1MDAyNmZldGNoZWRfY291bnRlcnMpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXFx1MDAyNnByaXYtXFx1MDAzZWlvY3RsX2l0ZXIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoY3QpIHtcXG4rXFx0XFx0aWYgKCFmZXRjaGVkX2NvdW50ZXJzKVxcbitcXHRcXHRcXHRjb3VudGVycyA9IGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhjdCk7XFxuK1xcdFxcdGFsbG9jaW5mb190b19wYXJhbXMoY3QsIFxcdTAwMjZwYXJhbXMsIFxcdTAwMjZjb3VudGVycyk7XFxuK1xcdH1cXG4rXFx0aWYgKCFjdCkge1xcbitcXHRcXHRwcml2LVxcdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XFxuK1xcdFxcdHJldCA9IC1FTk9FTlQ7XFxuK1xcdH1cXG4rXFx0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlaW9jdGxfbG9jayk7XFxuK1xcbitcXHRpZiAocmV0ID09IDApIHtcXG4rXFx0XFx0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFxcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZVxcbisgKiBsYXlvdXQgY29udGVudCBJRCwgc2VlayB0byBhIHNwZWNpZmljIHRhZywgb3IgcmVhZCBzZXF1ZW50aWFsIHRhZ3MuXFxuKyAqL1xcbitzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nIF9fYXJnKVxcbit7XFxuK1xcdHZvaWQgX191c2VyICphcmcgPSAodm9pZCBfX3VzZXIgKilfX2FyZztcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHN3aXRjaCAoY21kKSB7XFxuK1xcdGNhc2UgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEOlxcbitcXHRcXHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9BVDpcXG4rXFx0XFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9hdChmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEFMTE9DSU5GT19JT0NfR0VUX05FWFQ6XFxuK1xcdFxcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXQgPSAtRU5PSU9DVExDTUQ7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisjaWZkZWYgQ09ORklHX0NPTVBBVFxcbitzdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbitcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIGFyZylcXG4re1xcbitcXHRyZXR1cm4gYWxsb2NpbmZvX2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTtcXG4rfVxcbisjZW5kaWZcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY19vcHMgYWxsb2NpbmZvX3Byb2Nfb3BzID0ge1xcbitcXHQucHJvY19vcGVuXFx0XFx0PSBhbGxvY2luZm9fb3BlbixcXG4rXFx0LnByb2NfcmVhZF9pdGVyXFx0XFx0PSBzZXFfcmVhZF9pdGVyLFxcbitcXHQucHJvY19sc2Vla1xcdFxcdD0gc2VxX2xzZWVrLFxcbitcXHQucHJvY19yZWxlYXNlXFx0XFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcXG4rXFx0LnByb2NfaW9jdGxcXHRcXHQ9IGFsbG9jaW5mb19pb2N0bCxcXG4rI2lmZGVmIENPTkZJR19DT01QQVRcXG4rXFx0LnByb2NfY29tcGF0X2lvY3RsXFx0PSBhbGxvY2luZm9fY29tcGF0X2lvY3RsLFxcbisjZW5kaWZcXG4rfTtcXG4rXFxuIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKVxcbiB7XFxuIFxcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7XFxuQEAgLTk4NCw4ICsxMzI1LDcgQEAgc3RhdGljIGludCBfX2luaXQgYWxsb2NfdGFnX2luaXQodm9pZClcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuLVxcdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXFx1MDAyNmFsbG9jaW5mb19zZXFfb3AsXFxuLVxcdFxcdFxcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XFxuK1xcdGlmICghcHJvY19jcmVhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXFx1MDAyNmFsbG9jaW5mb19wcm9jX29wcykpIHtcXG4gXFx0XFx0cHJfZXJyKFxcXCJGYWlsZWQgdG8gY3JlYXRlICVzIGZpbGVcXFxcblxcXCIsIEFMTE9DSU5GT19GSUxFX05BTUUpO1xcbiBcXHRcXHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcXG4gXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG5pbmRleCA4ZDRkYjIyNDFjYzJhMi4uMTI5NDFkNjhhN2Y4YWUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxcbkBAIC0xLDUgKzEsNiBAQFxcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuIFRBUkdFVFMgKz0gYWNjdFxcbitUQVJHRVRTICs9IGFsbG9jX3RhZ1xcbiBUQVJHRVRTICs9IGFsc2FcXG4gVEFSR0VUUyArPSBhbWQtcHN0YXRlXFxuIFRBUkdFVFMgKz0gYXJtNjRcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZjQxZDkyZDA2YjE4NDhcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXFxuQEAgLTAsMCArMSw5IEBAXFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuK1RFU1RfR0VOX1BST0dTIDo9IGFsbG9jaW5mb19pb2N0bF90ZXN0XFxuK1xcbitDRkxBR1MgKz0gLVdhbGxcXG4rQ0ZMQUdTICs9ICQoS0hEUl9JTkNMVURFUylcXG4rXFxuK2luY2x1ZGUgLi4vbGliLm1rXFxuK1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uN2Q5NGFiYjc4NWExNDhcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL2FsbG9jaW5mb19pb2N0bF90ZXN0LmNcXG5AQCAtMCwwICsxLDU0OCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuK1xcbisvKiBrc2VsZnRlc3QgZm9yIGFsbG9jaW5mbyBpb2N0bFxcbisgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgR29vZ2xlLCBJbmMuXFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2Vycm5vLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRib29sLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FsbG9jX3RhZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXFwiLi4va3NlbGZ0ZXN0LmhcXFwiXFxuK1xcbisjZGVmaW5lIE1BWF9MSU5FX0xFTlxcdFxcdDUxMlxcbisjZGVmaW5lIEFMTE9DSU5GT19QUk9DXFx0XFx0XFxcIi9wcm9jL2FsbG9jaW5mb1xcXCJcXG4rXFxuK2VudW0gaW9jdGxfcmV0IHtcXG4rXFx0SU9DVExfU1VDQ0VTUyA9IDAsXFxuK1xcdElPQ1RMX0ZBSUxVUkUgPSAxLFxcbitcXHRJT0NUTF9JTlZBTElEX0RBVEEgPSAyLFxcbit9O1xcbitcXG4rI2RlZmluZSBWRUNfTUFYX0VOVFJJRVMgMzJcXG4rXFxuK3N0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjIHtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSB0YWdbVkVDX01BWF9FTlRSSUVTXTtcXG4rXFx0X191NjQgY291bnQ7XFxuK307XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcXG4re1xcbitcXHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQsIHBhcmFtcyk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IF9fYWxsb2NpbmZvX2dldF9hdChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCAqcGFyYW1zKVxcbit7XFxuK1xcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfR0VUX0FULCBwYXJhbXMpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfbmV4dChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpwYXJhbXMpXFxuK3tcXG4rXFx0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxcbitcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YWdfZGF0YSxcXG4rXFx0XFx0XFx0Ym9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXFxuK1xcdFxcdFxcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXFxuK3tcXG4rXFx0aWYgKG1hdGNoX2J5dGVzIFxcdTAwMjZcXHUwMDI2IHRhZ19kYXRhLVxcdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHByb2Nmc19lbnRyeS1cXHUwMDNlY291bnRlci5ieXRlcykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwic2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtYXRjaF9jYWxscyBcXHUwMDI2XFx1MDAyNiB0YWdfZGF0YS1cXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXFx1MDAzZWNvdW50ZXIuY2FsbHMpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcImNhbGwgY291bnQgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWF0Y2hfbGluZW5vIFxcdTAwMjZcXHUwMDI2IHRhZ19kYXRhLVxcdTAwM2V0YWcubGluZW5vICE9IHByb2Nmc19lbnRyeS1cXHUwMDNldGFnLmxpbmVubykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1hdGNoX2Z1bmN0aW9uIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBzdHJuY21wKHRhZ19kYXRhLVxcdTAwM2V0YWcuZnVuY3Rpb24sIHByb2Nmc19lbnRyeS1cXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJmdW5jdGlvbiByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtYXRjaF9maWxlbmFtZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgc3RybmNtcCh0YWdfZGF0YS1cXHUwMDNldGFnLmZpbGVuYW1lLCBwcm9jZnNfZW50cnktXFx1MDAzZXRhZy5maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiZmlsZW5hbWUgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBtYXRjaF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcXG4rXFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyxcXG4rXFx0XFx0XFx0ICBib29sIG1hdGNoX2J5dGVzLCBib29sIG1hdGNoX2NhbGxzLCBib29sIG1hdGNoX2xpbmVubyxcXG4rXFx0XFx0XFx0ICBib29sIG1hdGNoX2Z1bmN0aW9uLCBib29sIG1hdGNoX2ZpbGVuYW1lKVxcbit7XFxuK1xcdF9fdTY0IGk7XFxuK1xcbitcXHRpZiAocHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50ICE9IHRhZ3MtXFx1MDAzZWNvdW50KSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFbnRyeSBjb3VudCBtaXNtYXRjaC4gaW9jdGwgZW50cmllczogJWxsdSwgcHJvYyBlbnRyaWVzOiAlbGx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgdGFncy1cXHUwMDNlY291bnQsIHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0aWYgKCFtYXRjaF9lbnRyeShcXHUwMDI2cHJvY2ZzX2VudHJpZXMtXFx1MDAzZXRhZ1tpXSwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1tpXSxcXG4rXFx0XFx0XFx0XFx0IG1hdGNoX2J5dGVzLCBtYXRjaF9jYWxscywgbWF0Y2hfbGluZW5vLFxcbitcXHRcXHRcXHRcXHQgbWF0Y2hfZnVuY3Rpb24sIG1hdGNoX2ZpbGVuYW1lKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiJWxsdXRoIGVudHJ5IGRvZXMgbm90IG1hdGNoLlxcXFxuXFxcIiwgaSk7XFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqYWxsb2NpbmZvX3N0cihjb25zdCBjaGFyICpzdHIpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpO1xcbitcXG4rXFx0aWYgKGxlbiBcXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXFxuK1xcdFxcdHN0ciArPSAobGVuIC0gQUxMT0NJTkZPX1NUUl9TSVpFKSArIDE7XFxuK1xcdHJldHVybiBzdHI7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb19jb3B5X3N0cihjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpXFxuK3tcXG4rXFx0c3RybmNweShkZXN0LCBhbGxvY2luZm9fc3RyKHNyYyksIEFMTE9DSU5GT19TVFJfU0laRSAtIDEpO1xcbitcXHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJ1xcXFwwJztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzLFxcbitcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcilcXG4re1xcbitcXHRGSUxFICpmcCA9IGZvcGVuKEFMTE9DSU5GT19QUk9DLCBcXFwiclxcXCIpO1xcbitcXHRjaGFyIGxpbmVbTUFYX0xJTkVfTEVOXTtcXG4rXFx0aW50IG1hdGNoZXM7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgcHJvY2ZzX2VudHJ5O1xcbitcXG4rXFx0aWYgKCFmcCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG9wZW4gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiIGZvciByZWFkaW5nXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcdH1cXG4rXFx0bWVtc2V0KHByb2Nmc19lbnRyaWVzLCAwLCBzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcXHUwMDI2XFx1MDAyNiBwcm9jZnNfZW50cmllcy1cXHUwMDNlY291bnQgXFx1MDAzYyBWRUNfTUFYX0VOVFJJRVMpIHtcXG4rXFx0XFx0Y2hhciBmaWxlbmFtZVtNQVhfTElORV9MRU5dO1xcbitcXHRcXHRjaGFyIGZ1bmN0aW9uW01BWF9MSU5FX0xFTl07XFxuK1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNnByb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xcbitcXHRcXHRtYXRjaGVzID0gc3NjYW5mKGxpbmUsIFxcXCIlbGx1ICVsbHUgJVteOl06JWxsdSBmdW5jOiVzXFxcIixcXG4rXFx0XFx0XFx0XFx0IFxcdTAwMjZwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyxcXG4rXFx0XFx0XFx0XFx0IFxcdTAwMjZwcm9jZnNfZW50cnkuY291bnRlci5jYWxscyxcXG4rXFx0XFx0XFx0XFx0IGZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHQgXFx1MDAyNnByb2Nmc19lbnRyeS50YWcubGluZW5vLFxcbitcXHRcXHRcXHRcXHQgZnVuY3Rpb24pO1xcbitcXG4rXFx0XFx0aWYgKG1hdGNoZXMgIT0gNSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5maWxlbmFtZSwgZmlsZW5hbWUpO1xcbitcXHRcXHRhbGxvY2luZm9fY29weV9zdHIocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbiwgZnVuY3Rpb24pO1xcbitcXG4rXFx0XFx0aWYgKGZpbHRlci1cXHUwMDNlbWFzayBcXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRSkge1xcbitcXHRcXHRcXHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHQgICAgZmlsdGVyLVxcdTAwM2VmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT04pIHtcXG4rXFx0XFx0XFx0aWYgKHN0cm5jbXAocHJvY2ZzX2VudHJ5LnRhZy5mdW5jdGlvbixcXG4rXFx0XFx0XFx0XFx0ICAgIGZpbHRlci1cXHUwMDNlZmllbGRzLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xcbitcXHRcXHRcXHRpZiAocHJvY2ZzX2VudHJ5LnRhZy5saW5lbm8gIT0gZmlsdGVyLVxcdTAwM2VmaWVsZHMubGluZW5vKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoZmlsdGVyLVxcdTAwM2VtYXNrIFxcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcXHUwMDNjIGZpbHRlci1cXHUwMDNlbWluX3NpemUpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChmaWx0ZXItXFx1MDAzZW1hc2sgXFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpIHtcXG4rXFx0XFx0XFx0aWYgKHByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzIFxcdTAwM2UgZmlsdGVyLVxcdTAwM2VtYXhfc2l6ZSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdG1lbWNweShcXHUwMDI2cHJvY2ZzX2VudHJpZXMtXFx1MDAzZXRhZ1twcm9jZnNfZW50cmllcy1cXHUwMDNlY291bnQrK10sIFxcdTAwMjZwcm9jZnNfZW50cnksXFxuK1xcdFxcdCAgICAgICBzaXplb2YocHJvY2ZzX2VudHJ5KSk7XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBlbnVtIGlvY3RsX3JldCBnZXRfZmlsdGVyZWRfaW9jdGxfZW50cmllcyhzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBfX3U2NCBzdGFydF9wb3MpXFxuK3tcXG4rXFx0aW50IGZkID0gb3BlbihBTExPQ0lORk9fUFJPQywgT19SRE9OTFkpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG9wZW4gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiIGZvciBJT0NUTFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBJT0NUTF9GQUlMVVJFO1xcbitcXHR9XFxuK1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IGdldF9hdF9wYXJhbXM7XFxuK1xcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xcbitcXHRpbnQgcmV0cnlfY291bnQgPSAwO1xcbitcXHRpbnQgc3RhdHVzO1xcbitcXG4rXFx0LypcXG4rXFx0ICogX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGlmIGEga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkXFxuK1xcdCAqIGJldHdlZW4gdGhlIHR3byBjYWxscy4gSWYgdGhhdCBoYXBwZW5zLCB0aGUgZGF0YSBnYXRoZXJlZCBjYW5ub3QgYmUgY29uc2lkZXJlZCBjb25zaXN0ZW50XFxuK1xcdCAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBmZXRjaGVkIGFnYWluIHRvIGF2b2lkIGZsYWtpbmVzcy5cXG4rXFx0ICovXFxuK1xcdGRvIHtcXG4rXFx0XFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0bWVtc2V0KHRhZ3MsIDAsIHNpemVvZigqdGFncykpO1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNmdldF9hdF9wYXJhbXMsIDAsIHNpemVvZihnZXRfYXRfcGFyYW1zKSk7XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2Z2V0X2F0X3BhcmFtcy5maWx0ZXIsIGZpbHRlciwgc2l6ZW9mKCpmaWx0ZXIpKTtcXG4rXFx0XFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XFxuK1xcdFxcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFxcdTAwMjZnZXRfYXRfcGFyYW1zKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiYWxsb2NpbmZvX2dldF9hdCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRtZW1jcHkoXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudCsrXSwgXFx1MDAyNmdldF9hdF9wYXJhbXMuZGF0YSwgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xcbitcXG4rXFx0XFx0d2hpbGUgKHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudF0pID09IDApXFxuK1xcdFxcdFxcdHRhZ3MtXFx1MDAzZWNvdW50Kys7XFxuK1xcbitcXHRcXHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFxcdTAwMjZlbmRfY29udF9pZCkpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQpIHtcXG4rXFx0XFx0XFx0c3RhdHVzID0gSU9DVExfU1VDQ0VTUztcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBtaXNtYXRjaCwgcmV0cnlpbmcuLi5cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzdGF0dXMgPSBJT0NUTF9JTlZBTElEX0RBVEE7XFxuK1xcdFxcdH1cXG4rXFx0fSB3aGlsZSAoc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSBcXHUwMDI2XFx1MDAyNiByZXRyeV9jb3VudCsrIFxcdTAwM2MgbWF4X3JldHJpZXMpO1xcbitcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gc3RhdHVzO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ1bl9maWx0ZXJfdGVzdChjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxcbit7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xcbitcXHRpbnQgaW9jdGxfc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xcbitcXG4rXFx0aWYgKCF0YWdzIHx8ICFwcm9jZnNfZW50cmllcykge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcXFwiIEFMTE9DSU5GT19QUk9DIFxcXCJcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX1NLSVA7XFxuK1xcdFxcdGdvdG8gZXhpdDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCA9PSAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBlbnRyaWVzIGZvdW5kIGluIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIiwgc2tpcHBpbmcgdGVzdFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpb2N0bF9zdGF0dXMgPSBnZXRfZmlsdGVyZWRfaW9jdGxfZW50cmllcyh0YWdzLCBmaWx0ZXIsIDApO1xcbitcXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiVHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfRkFJTFVSRSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXFxuK1xcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFxuK2V4aXQ6XFxuK1xcdGZyZWUodGFncyk7XFxuK1xcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHRlc3RfZmlsZW5hbWVfZmlsdGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xcbitcXHRjb25zdCBjaGFyICp0YXJnZXRfZmlsZW5hbWUgPSBcXFwibW0vbWVtb3J5LmNcXFwiO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZJTEVOQU1FO1xcbitcXHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZmlsZW5hbWUsIHRhcmdldF9maWxlbmFtZSwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXFx1MDAyNmZpbHRlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9mdW5jdGlvbl9maWx0ZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XFxuK1xcdGNvbnN0IGNoYXIgKnRhcmdldF9mdW5jdGlvbiA9IFxcXCJkdXBfbW1cXFwiO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OO1xcbitcXHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcXG4rXFxuK1xcdHJldHVybiBydW5fZmlsdGVyX3Rlc3QoXFx1MDAyNmZpbHRlcik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9zaXplX2ZpbHRlcih2b2lkKVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0aW50IHJldCA9IEtTRlRfUEFTUztcXG4rXFx0X191NjQgdGFyZ2V0X3NpemUsIGksIHBvcztcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZm91bmRfdGFnID0gTlVMTDtcXG4rXFx0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXFxcImRvX2luaXRfbW9kdWxlXFxcIjtcXG4rXFx0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xcbitcXHRpbnQgcmV0cnkgPSAwO1xcbitcXHRjb25zdCBpbnQgbWF4X3JldHJpZXMgPSAxMDtcXG4rXFxuK1xcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdFxcdGdvdG8gZnJlZW1lbTtcXG4rXFx0fVxcbitcXG4rXFx0ZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkZhaWxlZCB0byBvcGVuIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIjogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0Z290byBmcmVlbWVtO1xcbitcXHR9XFxuK1xcbitcXHRkbyB7XFxuK1xcdFxcdGZvdW5kX3RhZyA9IE5VTEw7XFxuK1xcdFxcdHBvcyA9IDA7XFxuK1xcbitcXHRcXHRpZiAoX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQoZmQsIFxcdTAwMjZzdGFydF9jb250X2lkKSkge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfRkFJTDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xcbitcXHRcXHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfRlVOQ1RJT047XFxuK1xcdFxcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xcbitcXG4rXFx0XFx0aWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgXFx1MDAyNmZpbHRlcikpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkVycm9yIHJldHJpZXZpbmcgZW50cmllcyBmcm9tIFxcXCIgQUxMT0NJTkZPX1BST0MgXFxcIlxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAocHJvY2ZzX2VudHJpZXMtXFx1MDAzZWNvdW50ID09IDApIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBwcm9jZnNcXFxcblxcXCIsIHRhcmdldF9mdW5jdGlvbik7XFxuK1xcdFxcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0XFx0XFx0Z290byBleGl0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHR0YXJnZXRfc2l6ZSA9IHByb2Nmc19lbnRyaWVzLVxcdTAwM2V0YWdbMF0uY291bnRlci5ieXRlcztcXG4rXFxuK1xcdFxcdG1lbXNldChcXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XFxuK1xcdFxcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSB8IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRTtcXG4rXFx0XFx0ZmlsdGVyLm1pbl9zaXplID0gdGFyZ2V0X3NpemU7XFxuK1xcdFxcdGZpbHRlci5tYXhfc2l6ZSA9IHRhcmdldF9zaXplO1xcbitcXG4rXFx0XFx0d2hpbGUgKDEpIHtcXG4rXFx0XFx0XFx0c3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtcztcXG4rXFxuK1xcdFxcdFxcdG1lbXNldChcXHUwMDI2Z2V0X2F0X3BhcmFtcywgMCwgc2l6ZW9mKGdldF9hdF9wYXJhbXMpKTtcXG4rXFx0XFx0XFx0bWVtY3B5KFxcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXFx1MDAyNmZpbHRlciwgc2l6ZW9mKGZpbHRlcikpO1xcbitcXHRcXHRcXHRnZXRfYXRfcGFyYW1zLnBvcyA9IHBvcztcXG4rXFxuK1xcdFxcdFxcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFxcdTAwMjZnZXRfYXRfcGFyYW1zKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcbitcXHRcXHRcXHR0YWdzLVxcdTAwM2Vjb3VudCA9IDA7XFxuK1xcdFxcdFxcdG1lbWNweShcXHUwMDI2dGFncy1cXHUwMDNldGFnW3RhZ3MtXFx1MDAzZWNvdW50KytdLCBcXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxcbitcXHRcXHRcXHQgICAgICAgc2l6ZW9mKGdldF9hdF9wYXJhbXMuZGF0YSkpO1xcbitcXG4rXFx0XFx0XFx0d2hpbGUgKHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAgICBfX2FsbG9jaW5mb19nZXRfbmV4dChmZCwgXFx1MDAyNnRhZ3MtXFx1MDAzZXRhZ1t0YWdzLVxcdTAwM2Vjb3VudF0pID09IDApXFxuK1xcdFxcdFxcdFxcdHRhZ3MtXFx1MDAzZWNvdW50Kys7XFxuK1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgdGFncy1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAoc3RyY21wKHRhZ3MtXFx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xcbitcXHRcXHRcXHRcXHRcXHRmb3VuZF90YWcgPSBcXHUwMDI2dGFncy1cXHUwMDNldGFnW2ldO1xcbitcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRpZiAoZm91bmRfdGFnIHx8IHRhZ3MtXFx1MDAzZWNvdW50IFxcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdFxcdHBvcyArPSB0YWdzLVxcdTAwM2Vjb3VudDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJhbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJNb2R1bGUgbG9hZCBkZXRlY3RlZCBkdXJpbmcgc2l6ZSB2ZXJpZmljYXRpb24sIHJldHJ5aW5nLi4uXFxcXG5cXFwiKTtcXG4rXFx0fSB3aGlsZSAocmV0cnkrKyBcXHUwMDNjIG1heF9yZXRyaWVzKTtcXG4rXFxuK1xcdGlmIChzdGFydF9jb250X2lkLmlkID09IGVuZF9jb250X2lkLmlkIFxcdTAwMjZcXHUwMDI2ICFmb3VuZF90YWcpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkVudHJ5IHdpdGggZnVuY3Rpb24gJXMgbm90IGZvdW5kIGluIElPQ1RMIHJlc3VsdHNcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICB0YXJnZXRfZnVuY3Rpb24pO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH0gZWxzZSBpZiAoc3RhcnRfY29udF9pZC5pZCAhPSBlbmRfY29udF9pZC5pZCkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRmFpbGVkIHRvIG1hdGNoIGNvbnRlbnRfaWRzIGZvciBwcm9jZnMgYW5kIElPQ1RMLCBza2lwcGluZy4uLlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IEtTRlRfU0tJUDtcXG4rXFx0fSBlbHNlIGlmIChmb3VuZF90YWcgXFx1MDAyNlxcdTAwMjYgZm91bmRfdGFnLVxcdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHRhcmdldF9zaXplKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJJT0NUTCBlbnRyeSBzaXplICVsbHUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IHNpemUgJWxsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIGZvdW5kX3RhZy1cXHUwMDNlY291bnRlci5ieXRlcywgdGFyZ2V0X3NpemUpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH1cXG4rXFxuK2V4aXQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rZnJlZW1lbTpcXG4rXFx0ZnJlZSh0YWdzKTtcXG4rXFx0ZnJlZShwcm9jZnNfZW50cmllcyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgdGVzdF9saW5lbm9fZmlsdGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XFxuK1xcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcXG4rXFx0ZW51bSBpb2N0bF9yZXQgaW9jdGxfc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xcbitcXHRfX3U2NCB0YXJnZXRfbGluZW5vLCBpO1xcbitcXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICp0YXJnZXRfdGFnO1xcbitcXHRib29sIGZvdW5kID0gZmFsc2U7XFxuK1xcbitcXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2ZmlsdGVyLCAwLCBzaXplb2YoZmlsdGVyKSk7XFxuK1xcbitcXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBcXHUwMDI2ZmlsdGVyKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXFxcIiBBTExPQ0lORk9fUFJPQyBcXFwiXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9TS0lQO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFx0aWYgKHByb2Nmc19lbnRyaWVzLVxcdTAwM2Vjb3VudCA9PSAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb3VsZCBub3QgcmV0cmlldmUgcHJvY2ZzIGVudHJpZXNcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX1NLSVA7XFxuK1xcdFxcdGdvdG8gZXhpdDtcXG4rXFx0fVxcbitcXHQvKlxcbitcXHQgKiBXZSBkZXBlbmQgb24gdGhlIHByb2NmcyByZXN1bHRzIHRvIGRldGVybWluZSB0aGUgbGluZSBudW1iZXIgZm9yIHRoZSBmaWx0ZXIgYmVmb3JlXFxuK1xcdCAqIG1ha2luZyB0aGUgaW9jdGwgcXVlcnkuIEhlbmNlLCB3ZSBjYW5ub3QgcmV1c2UgcnVuX2ZpbHRlcl90ZXN0IGhlcmUuXFxuK1xcdCAqL1xcbitcXHR0YXJnZXRfdGFnID0gXFx1MDAyNnByb2Nmc19lbnRyaWVzLVxcdTAwM2V0YWdbMF07XFxuK1xcdHRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLVxcdTAwM2V0YWcubGluZW5vO1xcbitcXG4rXFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTztcXG4rXFx0ZmlsdGVyLmZpZWxkcy5saW5lbm8gPSB0YXJnZXRfbGluZW5vO1xcbitcXG4rXFx0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXFx1MDAyNmZpbHRlciwgMCk7XFxuK1xcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJUcm91YmxlIHJldHJpZXZpbmcgdmFsaWQgSU9DVEwgZW50cmllcywgc2tpcHBpbmcuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9TS0lQO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFx0aWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9GQUlMVVJFKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gS1NGVF9GQUlMO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0YWdzLVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdGlmICh0YWdzLVxcdTAwM2V0YWdbaV0udGFnLmxpbmVubyAhPSB0YXJnZXRfbGluZW5vKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgaSwgdGFncy1cXHUwMDNldGFnW2ldLnRhZy5saW5lbm8pO1xcbitcXHRcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHN0cm5jbXAodGFncy1cXHUwMDNldGFnW2ldLnRhZy5mdW5jdGlvbiwgdGFyZ2V0X3RhZy1cXHUwMDNldGFnLmZ1bmN0aW9uLFxcbitcXHRcXHRcXHQgICAgQUxMT0NJTkZPX1NUUl9TSVpFKSA9PSAwIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBzdHJuY21wKHRhZ3MtXFx1MDAzZXRhZ1tpXS50YWcuZmlsZW5hbWUsIHRhcmdldF90YWctXFx1MDAzZXRhZy5maWxlbmFtZSxcXG4rXFx0XFx0XFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMClcXG4rXFx0XFx0XFx0Zm91bmQgPSB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIWZvdW5kKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJPcmlnaW5hbCBwcm9jZnMgZW50cnkgbm90IGZvdW5kIGluIElPQ1RMIGxpbmVubyBmaWx0ZXIgcmVzdWx0cy5cXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSBLU0ZUX0ZBSUw7XFxuK1xcdH1cXG4rXFxuK2V4aXQ6XFxuK1xcdGZyZWUodGFncyk7XFxuK1xcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKDQpO1xcbitcXG4rXFx0cmV0ID0gdGVzdF9maWxlbmFtZV9maWx0ZXIoKTtcXG4rXFx0aWYgKHJldCA9PSBLU0ZUX1NLSVApXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiU2tpcHBpbmcgdGVzdF9maWxlbmFtZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXFxcInRlc3RfZmlsZW5hbWVfZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHJldCA9IHRlc3RfZnVuY3Rpb25fZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3RfZnVuY3Rpb25fZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFxcXCJ0ZXN0X2Z1bmN0aW9uX2ZpbHRlclxcXFxuXFxcIik7XFxuK1xcbitcXHRyZXQgPSB0ZXN0X3NpemVfZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3Rfc2l6ZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXFxcInRlc3Rfc2l6ZV9maWx0ZXJcXFxcblxcXCIpO1xcbitcXG4rXFx0cmV0ID0gdGVzdF9saW5lbm9fZmlsdGVyKCk7XFxuK1xcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIlNraXBwaW5nIHRlc3RfbGluZW5vX2ZpbHRlclxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcXFwidGVzdF9saW5lbm9fZmlsdGVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDowNS42MzU4OTU0NzFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwMDI0NjA3MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwYjkwZmY2YTBiNTNkOTRhN2NkZDg0NTA3MzIwYzUxZWZhN2IxMWE3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdWwgOSAxMTo1MDowMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RcbmluZGV4IDUzODlkMjQxMTc2YThhLi5jM2EyODQ2Nzk1NWYzZSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL2FsbG9jYXRpb24tcHJvZmlsaW5nLnJzdFxuQEAgLTQ2LDYgKzQ2LDExIEBAIHN5c2N0bDpcbiBSdW50aW1lIGluZm86XG4gICAvcHJvYy9hbGxvY2luZm9cbiBcbisgIFByb2ZpbGluZyBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZWl0aGVyIGJ5IHJlYWRpbmcgYC9wcm9jL2FsbG9jaW5mb2AgZGlyZWN0bHkgYXNcbisgIHRleHQgb3IgcHJvZ3JhbW1hdGljYWxseSB2aWEgYGlvY3RsKClgIGNhbGxzIGRlZmluZWQgaW4gYFx1MDAzY3VhcGkvbGludXgvYWxsb2NfdGFnLmhcdTAwM2VgLlxuKyAgVGhlIGlvY3RsIGludGVyZmFjZSBzdXBwb3J0cyBzdHJ1Y3R1cmVkIGJpbmFyeSBkYXRhIGV4dHJhY3Rpb24gYXMgd2VsbCBhcyBmaWx0ZXJpbmdcbisgIGJ5IG1vZHVsZSBuYW1lLCBmdW5jdGlvbiwgZmlsZSwgbGluZSBudW1iZXIsIGFjY3VyYWN5LCBvciBhbGxvY2F0aW9uIHNpemUgbGltaXRzLlxuK1xuIEV4YW1wbGUgb3V0cHV0OjpcbiBcbiAgIHJvb3RAbW9yaWEta3ZtOn4jIHNvcnQgLWcgL3Byb2MvYWxsb2NpbmZvfHRhaWx8bnVtZm10IC0tdG89aWVjXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3QgYi9Eb2N1bWVudGF0aW9uL3VzZXJzcGFjZS1hcGkvaW9jdGwvaW9jdGwtbnVtYmVyLnJzdFxuaW5kZXggM2YwZWYxZTI3ZWIwN2QuLjJmYzUzMDkzNzUyZDEzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Vyc3BhY2UtYXBpL2lvY3RsL2lvY3RsLW51bWJlci5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0XG5AQCAtMzQ2LDYgKzM0Niw4IEBAIENvZGUgIFNlcSMgICAgSW5jbHVkZSBGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpsdXptYXhpbWlsaWFuQGdtYWlsLmNvbVx1MDAzZVxuIDB4QTUgIDIwLTJGICBsaW51eC9zdXJmYWNlX2FnZ3JlZ2F0b3IvZHR4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFN1cmZhY2UgRFRYIGRyaXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjbWFpbHRvOmx1em1heGltaWxpYW5AZ21haWwuY29tXHUwMDNlXG4rMHhBNiAgMDAtMEYgIHVhcGkvbGludXgvYWxsb2NfdGFnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmdcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzY21haWx0bzpzdXJlbmJAZ29vZ2xlLmNvbVx1MDAzZVxuIDB4QUEgIDAwLTNGICBsaW51eC91YXBpL2xpbnV4L3VzZXJmYXVsdGZkLmhcbiAweEFCICAwMC0xRiAgbGludXgvbmJkLmhcbiAweEFDICAwMC0xRiAgbGludXgvcmF3LmhcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCBkMTk4MjJkNTc0ZmQ0OC4uM2Q1NGZkOGQ2OWMxYzYgMTAwNjQ0XG4tLS0gYS9NQUlOVEFJTkVSU1xuKysrIGIvTUFJTlRBSU5FUlNcbkBAIC0xNjkzNiw3ICsxNjkzNiw5IEBAIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vbW0vYWxsb2NhdGlvbi1wcm9maWxpbmcucnN0XG4gRjpcdGluY2x1ZGUvbGludXgvYWxsb2NfdGFnLmhcbiBGOlx0aW5jbHVkZS9saW51eC9wZ2FsbG9jX3RhZy5oXG4rRjpcdGluY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxuIEY6XHRtbS9hbGxvY190YWcuY1xuK0Y6XHR0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvXG4gXG4gTUVNT1JZIE1BTkFHRU1FTlQgLSBCQUxMT09OXG4gTTpcdEFuZHJldyBNb3J0b24gXHUwMDNjYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZ1x1MDAzZVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oIGIvaW5jbHVkZS9saW51eC9jb2RldGFnLmhcbmluZGV4IGRkYWU3NDg0Y2E0NTZjLi5hMjVhMDg1YzJkZjE5OSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29kZXRhZy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2NvZGV0YWcuaFxuQEAgLTc3LDYgKzc3LDggQEAgc3RydWN0IGNvZGV0YWdfaXRlcmF0b3Ige1xuIHZvaWQgY29kZXRhZ19sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gYm9vbCBjb2RldGFnX3RyeWxvY2tfbW9kdWxlX2xpc3Qoc3RydWN0IGNvZGV0YWdfdHlwZSAqY3R0eXBlKTtcbiB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4rdW5zaWduZWQgbG9uZyBjb2RldGFnX2dldF9jb250ZW50X2lkKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4rdW5zaWduZWQgaW50IGNvZGV0YWdfZ2V0X2NvdW50KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSk7XG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpO1xuIHN0cnVjdCBjb2RldGFnICpjb2RldGFnX25leHRfY3Qoc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgKml0ZXIpO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yNzBmNjkzYjE4MjIwNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2FsbG9jX3RhZy5oXG5AQCAtMCwwICsxLDk5IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi9cbisvKlxuKyAqIGFsbG9jX3RhZyBJT0NUTCBBUEkgZGVmaW5pdGlvblxuKyAqXG4rICogQ29weXJpZ2h0IChDKSAyMDI2IEdvb2dsZSwgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbisgKlxuKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4rICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXNcbisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi5cbisgKi9cbitcbisjaWZuZGVmIF9VQVBJX0FMTE9DX1RBR19IXG4rI2RlZmluZSBfVUFQSV9BTExPQ19UQUdfSFxuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbitcbisvKlxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xuKyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuKyAqL1xuKyNkZWZpbmUgQUxMT0NJTkZPX1NUUl9TSVpFXHQ2NFxuK1xuK3N0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCB7XG4rXHRfX3U2NCBpZDtcbit9O1xuK1xuK3N0cnVjdCBhbGxvY2luZm9fdGFnIHtcbitcdC8qIExvbmdlciBuYW1lcyBhcmUgdHJpbW1lZCAqL1xuK1x0Y2hhciBtb2RuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRjaGFyIGZ1bmN0aW9uW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRjaGFyIGZpbGVuYW1lW0FMTE9DSU5GT19TVFJfU0laRV07XG4rXHRfX3U2NCBsaW5lbm87XG4rXHQvKiBmaWx0ZXIgY3JpdGVyaWEgb25seTsgc2VlIGFsbG9jaW5mb19jb3VudGVyLmFjY3VyYXRlIGZvciBhY3R1YWwgYWNjdXJhY3kgKi9cbitcdF9fdTY0IGluYWNjdXJhdGU7XG4rfTtcbitcbisvKiBUaGUgYWxpZ25tZW50IGVuc3VyZXMgMzItYml0IGNvbXBhdGlibGUgaW50ZXJmYWNlcyBhcmUgbm90IGJyb2tlbiAqL1xuK3N0cnVjdCBhbGxvY2luZm9fY291bnRlciB7XG4rXHRfX3U2NCBieXRlcztcbitcdF9fdTY0IGNhbGxzO1xuK1x0X191OCBhY2N1cmF0ZTtcbit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcbitzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHtcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnIHRhZztcbitcdHN0cnVjdCBhbGxvY2luZm9fY291bnRlciBjb3VudGVyO1xuK307XG4rXG4rZW51bSB7XG4rXHRBTExPQ0lORk9fRklMVEVSX01PRE5BTUUsXG4rXHRBTExPQ0lORk9fRklMVEVSX0ZVTkNUSU9OLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSxcbitcdEFMTE9DSU5GT19GSUxURVJfTElORU5PLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9JTkFDQ1VSQVRFLFxuK1x0QUxMT0NJTkZPX0ZJTFRFUl9NSU5fU0laRSxcbitcdEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUsXG4rXHRfX0FMTE9DSU5GT19GSUxURVJfTEFTVCA9IEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkVcbit9O1xuK1xuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01PRE5BTUVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTU9ETkFNRSlcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTlx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GVU5DVElPTilcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRVx0XHQoMSBcdTAwM2NcdTAwM2MgQUxMT0NJTkZPX0ZJTFRFUl9GSUxFTkFNRSlcbisjZGVmaW5lIEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk9cdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTElORU5PKVxuKyNkZWZpbmUgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0lOQUNDVVJBVEVcdCgxIFx1MDAzY1x1MDAzYyBBTExPQ0lORk9fRklMVEVSX0lOQUNDVVJBVEUpXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTUlOX1NJWkUpXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkVcdFx0KDEgXHUwMDNjXHUwMDNjIEFMTE9DSU5GT19GSUxURVJfTUFYX1NJWkUpXG4rXG4rI2RlZmluZSBBTExPQ0lORk9fRklMVEVSX01BU0tTIFxcXG4rXHQoKDEgXHUwMDNjXHUwMDNjIChfX0FMTE9DSU5GT19GSUxURVJfTEFTVCArIDEpKSAtIDEpXG4rXG4rc3RydWN0IGFsbG9jaW5mb19maWx0ZXIge1xuK1x0X191NjQgbWFzazsgLyogYml0bWFzayBvZiB0aGUgZmlsdGVyIGZpZWxkcyB1c2VkICovXG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZyBmaWVsZHM7XG4rXHRfX3U2NCBtaW5fc2l6ZTtcbitcdF9fdTY0IG1heF9zaXplO1xuK307XG4rXG4rc3RydWN0IGFsbG9jaW5mb19nZXRfYXQge1xuK1x0LyogaW5wdXRzICovXG4rXHRfX3U2NCBwb3M7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4rXHQvKiBvdXRwdXQgKi9cbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgZGF0YTtcbit9O1xuK1xuKyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfQ09OVEVOVF9JRFx0MFxuKyNkZWZpbmUgX0FMTE9DSU5GT19JT0NfR0VUX0FUXHRcdDFcbisjZGVmaW5lIF9BTExPQ0lORk9fSU9DX0dFVF9ORVhUXHRcdDJcbitcbisjZGVmaW5lIEFMTE9DSU5GT19JT0NfQkFTRVx0XHQweEE2XG4rI2RlZmluZSBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSURcdF9JT1IoQUxMT0NJTkZPX0lPQ19CQVNFLCBfQUxMT0NJTkZPX0lPQ19DT05URU5UX0lELFx0XFxcbitcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQpXG4rI2RlZmluZSBBTExPQ0lORk9fSU9DX0dFVF9BVFx0XHRfSU9XUihBTExPQ0lORk9fSU9DX0JBU0UsIF9BTExPQ0lORk9fSU9DX0dFVF9BVCxcdFxcXG4rXHRcdFx0XHRcdCAgICAgIHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0KVxuKyNkZWZpbmUgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVFx0XHRfSU9SKEFMTE9DSU5GT19JT0NfQkFTRSwgX0FMTE9DSU5GT19JT0NfR0VUX05FWFQsXHRcXFxuK1x0XHRcdFx0XHQgICAgIHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEpXG4rXG4rI2VuZGlmIC8qIF9VQVBJX0FMTE9DX1RBR19IICovXG5kaWZmIC0tZ2l0IGEvbGliL2NvZGV0YWcuYyBiL2xpYi9jb2RldGFnLmNcbmluZGV4IDQwMDFhN2VhNjY3NTQyLi5hOWNkYTRjOTYyYTMwMyAxMDA2NDRcbi0tLSBhL2xpYi9jb2RldGFnLmNcbisrKyBiL2xpYi9jb2RldGFnLmNcbkBAIC0xOSw2ICsxOSw4IEBAIHN0cnVjdCBjb2RldGFnX3R5cGUge1xuIFx0c3RydWN0IGNvZGV0YWdfdHlwZV9kZXNjIGRlc2M7XG4gXHQvKiBnZW5lcmF0ZXMgdW5pcXVlIHNlcXVlbmNlIG51bWJlciBmb3IgbW9kdWxlIGxvYWQgKi9cbiBcdHVuc2lnbmVkIGxvbmcgbmV4dF9tb2Rfc2VxO1xuK1x0LyogYnVtcGVkIG9uIGV2ZXJ5IG1vZHVsZSBsb2FkIGFuZCB1bmxvYWQgKi9cbitcdHVuc2lnbmVkIGxvbmcgY29udGVudF9pZDtcbiB9O1xuIFxuIHN0cnVjdCBjb2RldGFnX3JhbmdlIHtcbkBAIC01MCw2ICs1MiwyMCBAQCB2b2lkIGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbiBcdHVwX3JlYWQoXHUwMDI2Y3R0eXBlLVx1MDAzZW1vZF9sb2NrKTtcbiB9XG4gXG4rdW5zaWduZWQgbG9uZyBjb2RldGFnX2dldF9jb250ZW50X2lkKHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSlcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4rXG4rXHRyZXR1cm4gY3R0eXBlLVx1MDAzZWNvbnRlbnRfaWQ7XG4rfVxuK1xuK3Vuc2lnbmVkIGludCBjb2RldGFnX2dldF9jb3VudChzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4re1xuK1x0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuK1xuK1x0cmV0dXJuIGN0dHlwZS1cdTAwM2Vjb3VudDtcbit9XG4rXG4gc3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgY29kZXRhZ19nZXRfY3RfaXRlcihzdHJ1Y3QgY29kZXRhZ190eXBlICpjdHR5cGUpXG4ge1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaXRlciA9IHtcbkBAIC0yMDQsNiArMjIwLDcgQEAgc3RhdGljIGludCBjb2RldGFnX21vZHVsZV9pbml0KHN0cnVjdCBjb2RldGFnX3R5cGUgKmN0dHlwZSwgc3RydWN0IG1vZHVsZSAqbW9kKVxuIFxuIFx0ZG93bl93cml0ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2xvY2spO1xuIFx0Y21vZC1cdTAwM2Vtb2Rfc2VxID0gKytjdHR5cGUtXHUwMDNlbmV4dF9tb2Rfc2VxO1xuK1x0KytjdHR5cGUtXHUwMDNlY29udGVudF9pZDtcbiBcdG1vZF9pZCA9IGlkcl9hbGxvYyhcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgY21vZCwgMCwgMCwgR0ZQX0tFUk5FTCk7XG4gXHRpZiAobW9kX2lkIFx1MDAzZT0gMCkge1xuIFx0XHRpZiAoY3R0eXBlLVx1MDAzZWRlc2MubW9kdWxlX2xvYWQpIHtcbkBAIC0zNjgsNiArMzg1LDcgQEAgdm9pZCBjb2RldGFnX3VubG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKVxuIFx0XHRcdGN0dHlwZS1cdTAwM2Vjb3VudCAtPSByYW5nZV9zaXplKGN0dHlwZSwgXHUwMDI2Y21vZC1cdTAwM2VyYW5nZSk7XG4gXHRcdFx0aWRyX3JlbW92ZShcdTAwMjZjdHR5cGUtXHUwMDNlbW9kX2lkciwgbW9kX2lkKTtcbiBcdFx0XHRrZnJlZShjbW9kKTtcbitcdFx0XHQrK2N0dHlwZS1cdTAwM2Vjb250ZW50X2lkO1xuIFx0XHR9XG4gXHRcdHVwX3dyaXRlKFx1MDAyNmN0dHlwZS1cdTAwM2Vtb2RfbG9jayk7XG4gXHRcdGlmIChmb3VuZCBcdTAwMjZcdTAwMjYgY3R0eXBlLVx1MDAzZWRlc2MuZnJlZV9zZWN0aW9uX21lbSlcbmRpZmYgLS1naXQgYS9tbS9hbGxvY190YWcuYyBiL21tL2FsbG9jX3RhZy5jXG5pbmRleCBjZjY1ZTk5OTJmZGEzMy4uMmM4MTlmYTllYWZhZDAgMTAwNjQ0XG4tLS0gYS9tbS9hbGxvY190YWcuY1xuKysrIGIvbW0vYWxsb2NfdGFnLmNcbkBAIC01LDYgKzUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgva2FsbHN5bXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbXV0ZXguaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BhZ2VfZXh0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wZ2FsbG9jX3RhZy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHJvY19mcy5oXHUwMDNlXG5AQCAtMTQsNiArMTUsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19jaG9pY2VzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC92bWFsbG9jLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rbWVtbGVhay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdWFwaS9saW51eC9hbGxvY190YWcuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gI2luY2x1ZGUgXCJwYWdlX2FsbG9jLmhcIlxuQEAgLTUwLDYgKzUyLDExIEBAIHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSB7XG4gXHRzdHJ1Y3QgY29kZXRhZ19pdGVyYXRvciBpdGVyO1xuIFx0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgcmVwb3J0ZWRfaXRlcjtcbiBcdGJvb2wgcHJpbnRfaGVhZGVyO1xuK1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuK1x0LyogaW9jdGwgdXNlcyBhIHNlcGFyYXRlIGl0ZXJhdG9yIG5vdCB0byBpbnRlcmZlcmUgd2l0aCByZWFkcyAqL1xuK1x0c3RydWN0IGNvZGV0YWdfaXRlcmF0b3IgaW9jdGxfaXRlcjtcbitcdGJvb2wgcG9zaXRpb25lZDsgLyogc2VxX29wZW5fcHJpdmF0ZSgpIHNldHMgdG8gMCAqL1xuK1x0c3RydWN0IG11dGV4IGlvY3RsX2xvY2s7XG4gfTtcbiBcbiBzdGF0aWMgdm9pZCAqYWxsb2NpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpXG5AQCAtMTMzLDYgKzE0MCwzNDAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhbGxvY2luZm9fc2VxX29wID0ge1xuIFx0LnNob3dcdD0gYWxsb2NpbmZvX3Nob3csXG4gfTtcbiBcbisvKlxuKyAqIEluaXRpYWxpemVzIHNlcV9maWxlIG9wZXJhdGlvbnMgYW5kIGFsbG9jYXRlcyBwcml2YXRlIHN0YXRlIHdoZW4gb3BlbmluZ1xuKyAqIHRoZSAvcHJvYy9hbGxvY2luZm8gcHJvY2ZzIGVudHJ5LlxuKyAqL1xuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbitcdFx0XHQgICAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSkpO1xuK1x0aWYgKCFyZXQpIHtcbitcdFx0c3RydWN0IHNlcV9maWxlICptID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdiA9IG0tXHUwMDNlcHJpdmF0ZTtcbitcbitcdFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLypcbisgKiBDbGVhbnMgdXAgdGhlIHNlcV9maWxlIHN0YXRlIGFuZCBmcmVlcyB1cCB0aGUgcHJpdmF0ZSBzdGF0ZSBhbGxvY2F0ZWQgaW5cbisgKiBhbGxvY2luZm9fb3BlbigpIHdoZW4gY2xvc2luZyB0aGUgL3Byb2MvYWxsb2NpbmZvIGZpbGUgZGVzY3JpcHRvci5cbisgKi9cbitzdGF0aWMgaW50IGFsbG9jaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuK3tcbitcdHN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuK1x0c3RydWN0IGFsbG9jaW5mb19wcml2YXRlICpwcml2ID0gbS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0bXV0ZXhfZGVzdHJveShcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1x0cmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpO1xuK31cbitcbisvKlxuKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc28gdGhhdCBpdHMgbGVuZ3RoIGZpdHMgd2l0aGluXG4rICogQUxMT0NJTkZPX1NUUl9TSVpFLCBwcmVzZXJ2aW5nIHRoZSB0cmFpbGluZyBjaGFyYWN0ZXJzLlxuKyAqIEZ1bmN0aW9uLCBmaWxlIGFuZCBtb2R1bGUgbmFtZXMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBwcmVmaXhlcywgdGhlcmVmb3JlXG4rICogd2hlbiBmaWx0ZXJpbmcgYnkgdGhlc2UgY3JpdGVyaWEsIHdlIGNvbXBhcmUgdGhlIGxhc3QgNjQgY2hhcmFjdGVycyB0b1xuKyAqIG1pbmltaXplIHRoZSBjaGFuY2VzIG9mIG5hbWUgY29sbGlzaW9uc1xuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cilcbit7XG4rXHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4rXG4rXHQvKiBLZWVwIGFuIGV4dHJhIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgTlVMTC4gKi9cbitcdGlmIChsZW4gXHUwMDNlPSBBTExPQ0lORk9fU1RSX1NJWkUpXG4rXHRcdHN0ciArPSAobGVuIC0gQUxMT0NJTkZPX1NUUl9TSVpFKSArIDE7XG4rXHRyZXR1cm4gc3RyO1xuK31cbitcbisvKiBDb3B5IGEgc3RyaW5nIGFuZCB0cmltIGZyb20gdGhlIGJlZ2lubmluZyBpZiBpdCdzIHRvbyBsb25nICovXG4rc3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbit7XG4rXHRzdHJzY3B5X3BhZChkZXN0LCBhbGxvY2luZm9fc3RyKHNyYyksIEFMTE9DSU5GT19TVFJfU0laRSk7XG4rfVxuK1xuKy8qIENvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIG9ubHkgY29uc2lkZXIgdGhlIHRyaW1tZWQgc3VmZml4IGlmIHMxIGlzIHRvbyBsb25nICovXG4rc3RhdGljIGludCBhbGxvY2luZm9fY21wX3N0cihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRlbXBsYXRlKVxuK3tcbitcdHJldHVybiBzdHJuY21wKGFsbG9jaW5mb19zdHIoc3RyKSwgdGVtcGxhdGUsIEFMTE9DSU5GT19TVFJfU0laRSk7XG4rfVxuK1xuKy8qIEZldGNoIHRoZSBwZXItQ1BVIGNvdW50ZXJzICovXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGFsbG9jaW5mb19wcmVmZXRjaF9jb3VudGVycyhzdHJ1Y3QgY29kZXRhZyAqY3QpXG4re1xuK1x0cmV0dXJuIGFsbG9jX3RhZ19yZWFkKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuK31cbitcbisvKlxuKyAqIFBvcHVsYXRlcyB0aGUgVUFQSSBhbGxvY2luZm9fdGFnX2RhdGEgc3RydWN0dXJlIHdpdGggYWN0aXZlIHJ1bnRpbWVcbisgKiBwcm9maWxpbmcgY291bnRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIGtlcm5lbCBjb2RldGFnLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGFsbG9jaW5mb190b19wYXJhbXMoc3RydWN0IGNvZGV0YWcgKmN0LFxuK1x0XHRcdFx0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqZGF0YSxcbitcdFx0XHRcdHN0cnVjdCBhbGxvY190YWdfY291bnRlcnMgKmNvdW50ZXJzKVxuK3tcbitcdGlmIChjdC1cdTAwM2Vtb2RuYW1lKVxuK1x0XHRhbGxvY2luZm9fY29weV9zdHIoZGF0YS1cdTAwM2V0YWcubW9kbmFtZSwgY3QtXHUwMDNlbW9kbmFtZSk7XG4rXHRlbHNlXG4rXHRcdGRhdGEtXHUwMDNldGFnLm1vZG5hbWVbMF0gPSAnXFwwJztcbitcdGFsbG9jaW5mb19jb3B5X3N0cihkYXRhLVx1MDAzZXRhZy5mdW5jdGlvbiwgY3QtXHUwMDNlZnVuY3Rpb24pO1xuK1x0YWxsb2NpbmZvX2NvcHlfc3RyKGRhdGEtXHUwMDNldGFnLmZpbGVuYW1lLCBjdC1cdTAwM2VmaWxlbmFtZSk7XG4rXHRkYXRhLVx1MDAzZXRhZy5saW5lbm8gPSBjdC1cdTAwM2VsaW5lbm87XG4rXHRkYXRhLVx1MDAzZWNvdW50ZXIuYnl0ZXMgPSBjb3VudGVycy1cdTAwM2VieXRlcztcbitcdGRhdGEtXHUwMDNlY291bnRlci5jYWxscyA9IGNvdW50ZXJzLVx1MDAzZWNhbGxzO1xuK1x0ZGF0YS1cdTAwM2Vjb3VudGVyLmFjY3VyYXRlID0gIWFsbG9jX3RhZ19pc19pbmFjY3VyYXRlKGN0X3RvX2FsbG9jX3RhZyhjdCkpO1xuK31cbitcbisvKlxuKyAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGNvbnRlbnQgSUQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gdGFnIG1vZHVsZVxuKyAqIGxheW91dCwgYWxsb3dpbmcgdXNlcnNwYWNlIHRvIGRldGVjdCBpZiBtb2R1bGVzIHdlcmUgbG9hZGVkIC8gdW5sb2FkZWQuXG4rICovXG4rc3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fY29udGVudF9pZCBwYXJhbXM7XG4rXG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRwYXJhbXMuaWQgPSBjb2RldGFnX2dldF9jb250ZW50X2lkKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRpZiAoY29weV90b191c2VyKGFyZywgXHUwMDI2cGFyYW1zLCBzaXplb2YocGFyYW1zKSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogVmVyaWZpZXMgd2hldGhlciBhIGdpdmVuIGNvZGV0YWcgc2F0aXNmaWVzIHRoZSBhY3RpdmUgZmlsdGVyaW5nIGNyaXRlcmlhIGJ5XG4rICogbWF0Y2hpbmcgaXRzIGNoYXJhY3RlcmlzdGljcyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgZmlsdGVyLlxuKyAqL1xuK3N0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcbitcdFx0XHQgICBzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzICpjb3VudGVycyxcbitcdFx0XHQgICBib29sICpmZXRjaGVkX2NvdW50ZXJzKVxuK3tcbitcdGJvb2wgaW5hY2N1cmF0ZTtcbitcbitcdGlmICghZmlsdGVyIHx8ICFmaWx0ZXItXHUwMDNlbWFzaylcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NT0ROQU1FKSB7XG4rXHRcdC8qIHVzZXIgd2FudHMgdG8gZmlsdGVyIGJ5IG1vZG5hbWUgYnV0IGN0LVx1MDAzZW1vZG5hbWUgaXMgTlVMTCAqL1xuK1x0XHRpZiAoIWN0LVx1MDAzZW1vZG5hbWUpIHtcbitcdFx0XHQvKiB2YWxpZGF0ZSBpZiB1c2VyIHdhcyBhdHRlbXB0aW5nIHRvIGZpbHRlciBmb3IgYnVpbHQtaW4gYWxsb2NhdGlvbnMgKi9cbitcdFx0XHRpZiAoZmlsdGVyLVx1MDAzZWZpZWxkcy5tb2RuYW1lWzBdICE9ICdcXDAnKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9IGVsc2UgaWYgKGFsbG9jaW5mb19jbXBfc3RyKGN0LVx1MDAzZW1vZG5hbWUsIGZpbHRlci1cdTAwM2VmaWVsZHMubW9kbmFtZSkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OKSBcdTAwMjZcdTAwMjZcbitcdCAgICBjdC1cdTAwM2VmdW5jdGlvbiBcdTAwMjZcdTAwMjYgYWxsb2NpbmZvX2NtcF9zdHIoY3QtXHUwMDNlZnVuY3Rpb24sIGZpbHRlci1cdTAwM2VmaWVsZHMuZnVuY3Rpb24pKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAoKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGN0LVx1MDAzZWZpbGVuYW1lIFx1MDAyNlx1MDAyNiBhbGxvY2luZm9fY21wX3N0cihjdC1cdTAwM2VmaWxlbmFtZSwgZmlsdGVyLVx1MDAzZWZpZWxkcy5maWxlbmFtZSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19MSU5FTk8pIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGN0LVx1MDAzZWxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfSU5BQ0NVUkFURSkge1xuK1x0XHRpbmFjY3VyYXRlID0gISEoY3QtXHUwMDNlZmxhZ3MgXHUwMDI2IENPREVUQUdfRkxBR19JTkFDQ1VSQVRFKTtcbitcdFx0aWYgKGluYWNjdXJhdGUgIT0gISEoZmlsdGVyLVx1MDAzZWZpZWxkcy5pbmFjY3VyYXRlKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IChBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkUpKSB7XG4rXHRcdGlmICghKmZldGNoZWRfY291bnRlcnMpIHtcbitcdFx0XHQqY291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRcdCpmZXRjaGVkX2NvdW50ZXJzID0gdHJ1ZTtcbitcdFx0fVxuK1x0XHRpZiAoKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgY291bnRlcnMtXHUwMDNlYnl0ZXMgXHUwMDNjIGZpbHRlci1cdTAwM2VtaW5fc2l6ZSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmICgoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBjb3VudGVycy1cdTAwM2VieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdHJldHVybiB0cnVlO1xuK31cbitcbisvKlxuKyAqIFNlZWtzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgc3BlY2lmaWVkIDAtaW5kZXhlZCB0YWcgcG9zaXRpb24sIHJlYWRzIGl0c1xuKyAqIHByb2ZpbGluZyBkYXRhIGFuZCByZXR1cm5zIGl0IHRvIHVzZXJzcGFjZS5cbisgKi9cbitzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkIF9fdXNlciAqYXJnKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSAqcHJpdjtcbitcdHN0cnVjdCBjb2RldGFnICpjdDtcbitcdHN0cnVjdCBhbGxvY2luZm9fZ2V0X2F0IHBhcmFtcyA9IHswfTtcbitcdF9fdTY0IHNraXBfY291bnQ7XG4rXHRzdHJ1Y3QgYWxsb2NfdGFnX2NvdW50ZXJzIGNvdW50ZXJzO1xuK1x0Ym9vbCBmZXRjaGVkX2NvdW50ZXJzO1xuK1xuK1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnBhcmFtcywgYXJnLCBzaXplb2YocGFyYW1zKSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0aWYgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgfkFMTE9DSU5GT19GSUxURVJfTUFTS1MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKChwYXJhbXMuZmlsdGVyLm1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NSU5fU0laRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgKHBhcmFtcy5maWx0ZXIubWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01BWF9TSVpFKSBcdTAwMjZcdTAwMjZcbitcdCAgICBwYXJhbXMuZmlsdGVyLm1pbl9zaXplIFx1MDAzZSBwYXJhbXMuZmlsdGVyLm1heF9zaXplKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXG4rXHRpZiAocGFyYW1zLnBvcyBcdTAwM2U9IGNvZGV0YWdfZ2V0X2NvdW50KGFsbG9jX3RhZ19jdHR5cGUpKSB7XG4rXHRcdGNvZGV0YWdfdW5sb2NrX21vZHVsZV9saXN0KGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRza2lwX2NvdW50ID0gcGFyYW1zLnBvcztcbitcbitcdGlmIChwYXJhbXMuZmlsdGVyLm1hc2spXG4rXHRcdHByaXYtXHUwMDNlZmlsdGVyID0gcGFyYW1zLmZpbHRlcjtcbitcdGVsc2VcbitcdFx0cHJpdi1cdTAwM2VmaWx0ZXIubWFzayA9IDA7XG4rXG4rXHQvKiBGaW5kIHRoZSBjb2RldGFnICovXG4rXHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcbitcdHdoaWxlIChjdCkge1xuK1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4rXHRcdGlmIChtYXRjaGVzX2ZpbHRlcihjdCwgXHUwMDI2cHJpdi1cdTAwM2VmaWx0ZXIsIFx1MDAyNmNvdW50ZXJzLCBcdTAwMjZmZXRjaGVkX2NvdW50ZXJzKSkge1xuK1x0XHRcdGlmIChza2lwX2NvdW50ID09IDApXG4rXHRcdFx0XHRicmVhaztcbitcdFx0XHRza2lwX2NvdW50LS07XG4rXHRcdH1cbitcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdH1cbitcbitcdGlmIChjdCkge1xuK1x0XHRpZiAoIWZldGNoZWRfY291bnRlcnMpXG4rXHRcdFx0Y291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMuZGF0YSwgXHUwMDI2Y291bnRlcnMpO1xuK1x0XHRwcml2LVx1MDAzZXBvc2l0aW9uZWQgPSB0cnVlO1xuK1x0fVxuK1xuK1x0Y29kZXRhZ191bmxvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9sb2NrKTtcbitcbitcdGlmICghY3QpXG4rXHRcdHJldHVybiAtRU5PRU5UO1xuK1xuK1x0aWYgKGNvcHlfdG9fdXNlcihhcmcsIFx1MDAyNnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIEFkdmFuY2VzIHRoZSBpb2N0bCBpdGVyYXRvciB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIHRhZyBpbiB0aGUgc2VxdWVuY2UgYW5kXG4rICogcmV0dXJucyBpdHMgcHJvZmlsaW5nIGRhdGEgdG8gdXNlcnNwYWNlLlxuKyAqL1xuK3N0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcbit7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3ByaXZhdGUgKnByaXY7XG4rXHRzdHJ1Y3QgY29kZXRhZyAqY3Q7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHBhcmFtcztcbitcdGludCByZXQgPSAwO1xuK1x0c3RydWN0IGFsbG9jX3RhZ19jb3VudGVycyBjb3VudGVycztcbitcdGJvb2wgZmV0Y2hlZF9jb3VudGVycztcbitcbitcdG1lbXNldChcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcbitcdHByaXYgPSBtLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNnByaXYtXHUwMDNlaW9jdGxfbG9jayk7XG4rXHRjb2RldGFnX2xvY2tfbW9kdWxlX2xpc3QoYWxsb2NfdGFnX2N0dHlwZSk7XG4rXG4rXHRpZiAoIXByaXYtXHUwMDNlcG9zaXRpb25lZCkge1xuK1x0XHRwcml2LVx1MDAzZWlvY3RsX2l0ZXIgPSBjb2RldGFnX2dldF9jdF9pdGVyKGFsbG9jX3RhZ19jdHR5cGUpO1xuK1x0XHRwcml2LVx1MDAzZXBvc2l0aW9uZWQgPSB0cnVlO1xuK1x0fVxuK1xuK1x0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdHdoaWxlIChjdCkge1xuK1x0XHRmZXRjaGVkX2NvdW50ZXJzID0gZmFsc2U7XG4rXHRcdGlmIChtYXRjaGVzX2ZpbHRlcihjdCwgXHUwMDI2cHJpdi1cdTAwM2VmaWx0ZXIsIFx1MDAyNmNvdW50ZXJzLCBcdTAwMjZmZXRjaGVkX2NvdW50ZXJzKSlcbitcdFx0XHRicmVhaztcbitcdFx0Y3QgPSBjb2RldGFnX25leHRfY3QoXHUwMDI2cHJpdi1cdTAwM2Vpb2N0bF9pdGVyKTtcbitcdH1cbitcbitcdGlmIChjdCkge1xuK1x0XHRpZiAoIWZldGNoZWRfY291bnRlcnMpXG4rXHRcdFx0Y291bnRlcnMgPSBhbGxvY2luZm9fcHJlZmV0Y2hfY291bnRlcnMoY3QpO1xuK1x0XHRhbGxvY2luZm9fdG9fcGFyYW1zKGN0LCBcdTAwMjZwYXJhbXMsIFx1MDAyNmNvdW50ZXJzKTtcbitcdH1cbitcdGlmICghY3QpIHtcbitcdFx0cHJpdi1cdTAwM2Vwb3NpdGlvbmVkID0gZmFsc2U7XG4rXHRcdHJldCA9IC1FTk9FTlQ7XG4rXHR9XG4rXHRjb2RldGFnX3VubG9ja19tb2R1bGVfbGlzdChhbGxvY190YWdfY3R0eXBlKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZWlvY3RsX2xvY2spO1xuK1xuK1x0aWYgKHJldCA9PSAwKSB7XG4rXHRcdGlmIChjb3B5X3RvX3VzZXIoYXJnLCBcdTAwMjZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSlcbitcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbitcdH1cbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogRW50cnkgcG9pbnQgaW9jdGwgZnVuY3Rpb24gZm9yIC9wcm9jL2FsbG9jaW5mbyByb3V0aW5nIHJlcXVlc3RzIHRvIGZldGNoIHRoZVxuKyAqIGxheW91dCBjb250ZW50IElELCBzZWVrIHRvIGEgc3BlY2lmaWMgdGFnLCBvciByZWFkIHNlcXVlbnRpYWwgdGFncy5cbisgKi9cbitzdGF0aWMgbG9uZyBhbGxvY2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsXG4rXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgX19hcmcpXG4re1xuK1x0dm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKV9fYXJnO1xuK1x0aW50IHJldDtcbitcbitcdHN3aXRjaCAoY21kKSB7XG4rXHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcbitcdFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XG4rXHRcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxuK1x0XHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEsIGFyZyk7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0ID0gLUVOT0lPQ1RMQ01EO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKyNpZmRlZiBDT05GSUdfQ09NUEFUXG4rc3RhdGljIGxvbmcgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCxcbitcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuK3tcbitcdHJldHVybiBhbGxvY2luZm9faW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpO1xuK31cbisjZW5kaWZcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcbitcdC5wcm9jX29wZW5cdFx0PSBhbGxvY2luZm9fb3BlbixcbitcdC5wcm9jX3JlYWRfaXRlclx0XHQ9IHNlcV9yZWFkX2l0ZXIsXG4rXHQucHJvY19sc2Vla1x0XHQ9IHNlcV9sc2VlayxcbitcdC5wcm9jX3JlbGVhc2VcdFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcbitcdC5wcm9jX2lvY3RsXHRcdD0gYWxsb2NpbmZvX2lvY3RsLFxuKyNpZmRlZiBDT05GSUdfQ09NUEFUXG4rXHQucHJvY19jb21wYXRfaW9jdGxcdD0gYWxsb2NpbmZvX2NvbXBhdF9pb2N0bCxcbisjZW5kaWZcbit9O1xuK1xuIHNpemVfdCBhbGxvY190YWdfdG9wX3VzZXJzKHN0cnVjdCBjb2RldGFnX2J5dGVzICp0YWdzLCBzaXplX3QgY291bnQsIGJvb2wgY2FuX3NsZWVwKVxuIHtcbiBcdHN0cnVjdCBjb2RldGFnX2l0ZXJhdG9yIGl0ZXI7XG5AQCAtOTg0LDggKzEzMjUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBhbGxvY190YWdfaW5pdCh2b2lkKVxuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbi1cdGlmICghcHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoQUxMT0NJTkZPX0ZJTEVfTkFNRSwgMDQwMCwgTlVMTCwgXHUwMDI2YWxsb2NpbmZvX3NlcV9vcCxcbi1cdFx0XHRcdCAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY2luZm9fcHJpdmF0ZSksIE5VTEwpKSB7XG4rXHRpZiAoIXByb2NfY3JlYXRlKEFMTE9DSU5GT19GSUxFX05BTUUsIDA0MDAsIE5VTEwsIFx1MDAyNmFsbG9jaW5mb19wcm9jX29wcykpIHtcbiBcdFx0cHJfZXJyKFwiRmFpbGVkIHRvIGNyZWF0ZSAlcyBmaWxlXFxuXCIsIEFMTE9DSU5GT19GSUxFX05BTUUpO1xuIFx0XHRzaHV0ZG93bl9tZW1fcHJvZmlsaW5nKGZhbHNlKTtcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZVxuaW5kZXggOGQ0ZGIyMjQxY2MyYTIuLjEyOTQxZDY4YTdmOGFlIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlXG5AQCAtMSw1ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gVEFSR0VUUyArPSBhY2N0XG4rVEFSR0VUUyArPSBhbGxvY190YWdcbiBUQVJHRVRTICs9IGFsc2FcbiBUQVJHRVRTICs9IGFtZC1wc3RhdGVcbiBUQVJHRVRTICs9IGFybTY0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYWxsb2NfdGFnL01ha2VmaWxlXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY0MWQ5MmQwNmIxODQ4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvTWFrZWZpbGVcbkBAIC0wLDAgKzEsOSBAQFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbitURVNUX0dFTl9QUk9HUyA6PSBhbGxvY2luZm9faW9jdGxfdGVzdFxuK1xuK0NGTEFHUyArPSAtV2FsbFxuK0NGTEFHUyArPSAkKEtIRFJfSU5DTFVERVMpXG4rXG4raW5jbHVkZSAuLi9saWIubWtcbitcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9hbGxvY2luZm9faW9jdGxfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjdkOTRhYmI3ODVhMTQ4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbGxvY190YWcvYWxsb2NpbmZvX2lvY3RsX3Rlc3QuY1xuQEAgLTAsMCArMSw1NDggQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rXG4rLyoga3NlbGZ0ZXN0IGZvciBhbGxvY2luZm8gaW9jdGxcbisgKiBhbGxvY2luZm8gaW9jdGwgcmV0cml2ZXMgYWxsb2NpbmZvIGRhdGEgdGhyb3VnaCBpb2N0bFxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBHb29nbGUsIEluYy5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkYm9vbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hbGxvY190YWcuaFx1MDAzZVxuKyNpbmNsdWRlIFwiLi4va3NlbGZ0ZXN0LmhcIlxuK1xuKyNkZWZpbmUgTUFYX0xJTkVfTEVOXHRcdDUxMlxuKyNkZWZpbmUgQUxMT0NJTkZPX1BST0NcdFx0XCIvcHJvYy9hbGxvY2luZm9cIlxuK1xuK2VudW0gaW9jdGxfcmV0IHtcbitcdElPQ1RMX1NVQ0NFU1MgPSAwLFxuK1x0SU9DVExfRkFJTFVSRSA9IDEsXG4rXHRJT0NUTF9JTlZBTElEX0RBVEEgPSAyLFxuK307XG4rXG4rI2RlZmluZSBWRUNfTUFYX0VOVFJJRVMgMzJcbitcbitzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyB7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHRhZ1tWRUNfTUFYX0VOVFJJRVNdO1xuK1x0X191NjQgY291bnQ7XG4rfTtcbitcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgKnBhcmFtcylcbit7XG4rXHRyZXR1cm4gaW9jdGwoZGV2X2ZkLCBBTExPQ0lORk9fSU9DX0NPTlRFTlRfSUQsIHBhcmFtcyk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IF9fYWxsb2NpbmZvX2dldF9hdChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCAqcGFyYW1zKVxuK3tcbitcdHJldHVybiBpb2N0bChkZXZfZmQsIEFMTE9DSU5GT19JT0NfR0VUX0FULCBwYXJhbXMpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBfX2FsbG9jaW5mb19nZXRfbmV4dChpbnQgZGV2X2ZkLCBzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhICpwYXJhbXMpXG4re1xuK1x0cmV0dXJuIGlvY3RsKGRldl9mZCwgQUxMT0NJTkZPX0lPQ19HRVRfTkVYVCwgcGFyYW1zKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgbWF0Y2hfZW50cnkoY29uc3Qgc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqcHJvY2ZzX2VudHJ5LFxuK1x0XHRcdGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKnRhZ19kYXRhLFxuK1x0XHRcdGJvb2wgbWF0Y2hfYnl0ZXMsIGJvb2wgbWF0Y2hfY2FsbHMsIGJvb2wgbWF0Y2hfbGluZW5vLFxuK1x0XHRcdGJvb2wgbWF0Y2hfZnVuY3Rpb24sIGJvb2wgbWF0Y2hfZmlsZW5hbWUpXG4re1xuK1x0aWYgKG1hdGNoX2J5dGVzIFx1MDAyNlx1MDAyNiB0YWdfZGF0YS1cdTAwM2Vjb3VudGVyLmJ5dGVzICE9IHByb2Nmc19lbnRyeS1cdTAwM2Vjb3VudGVyLmJ5dGVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwic2l6ZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cIik7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdGlmIChtYXRjaF9jYWxscyBcdTAwMjZcdTAwMjYgdGFnX2RhdGEtXHUwMDNlY291bnRlci5jYWxscyAhPSBwcm9jZnNfZW50cnktXHUwMDNlY291bnRlci5jYWxscykge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcImNhbGwgY291bnQgcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCIpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAobWF0Y2hfbGluZW5vIFx1MDAyNlx1MDAyNiB0YWdfZGF0YS1cdTAwM2V0YWcubGluZW5vICE9IHByb2Nmc19lbnRyeS1cdTAwM2V0YWcubGluZW5vKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwibGluZW5vIHJldHJpZXZlZCB0aHJvdWdoIGlvY3RsIGRvZXMgbm90IG1hdGNoIHByb2Nmc1xcblwiKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKG1hdGNoX2Z1bmN0aW9uIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHN0cm5jbXAodGFnX2RhdGEtXHUwMDNldGFnLmZ1bmN0aW9uLCBwcm9jZnNfZW50cnktXHUwMDNldGFnLmZ1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiZnVuY3Rpb24gcmV0cmlldmVkIHRocm91Z2ggaW9jdGwgZG9lcyBub3QgbWF0Y2ggcHJvY2ZzXFxuXCIpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAobWF0Y2hfZmlsZW5hbWUgXHUwMDI2XHUwMDI2XG4rXHQgICAgc3RybmNtcCh0YWdfZGF0YS1cdTAwM2V0YWcuZmlsZW5hbWUsIHByb2Nmc19lbnRyeS1cdTAwM2V0YWcuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJmaWxlbmFtZSByZXRyaWV2ZWQgdGhyb3VnaCBpb2N0bCBkb2VzIG5vdCBtYXRjaCBwcm9jZnNcXG5cIik7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgYm9vbCBtYXRjaF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcbitcdFx0XHQgIGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzLFxuK1x0XHRcdCAgYm9vbCBtYXRjaF9ieXRlcywgYm9vbCBtYXRjaF9jYWxscywgYm9vbCBtYXRjaF9saW5lbm8sXG4rXHRcdFx0ICBib29sIG1hdGNoX2Z1bmN0aW9uLCBib29sIG1hdGNoX2ZpbGVuYW1lKVxuK3tcbitcdF9fdTY0IGk7XG4rXG4rXHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgIT0gdGFncy1cdTAwM2Vjb3VudCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkVudHJ5IGNvdW50IG1pc21hdGNoLiBpb2N0bCBlbnRyaWVzOiAlbGx1LCBwcm9jIGVudHJpZXM6ICVsbHVcXG5cIixcbitcdFx0XHQgICAgICAgdGFncy1cdTAwM2Vjb3VudCwgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBwcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudDsgaSsrKSB7XG4rXHRcdGlmICghbWF0Y2hfZW50cnkoXHUwMDI2cHJvY2ZzX2VudHJpZXMtXHUwMDNldGFnW2ldLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1tpXSxcbitcdFx0XHRcdCBtYXRjaF9ieXRlcywgbWF0Y2hfY2FsbHMsIG1hdGNoX2xpbmVubyxcbitcdFx0XHRcdCBtYXRjaF9mdW5jdGlvbiwgbWF0Y2hfZmlsZW5hbWUpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCIlbGx1dGggZW50cnkgZG9lcyBub3QgbWF0Y2guXFxuXCIsIGkpO1xuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0fVxuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBjaGFyICphbGxvY2luZm9fc3RyKGNvbnN0IGNoYXIgKnN0cilcbit7XG4rXHRzaXplX3QgbGVuID0gc3RybGVuKHN0cik7XG4rXG4rXHRpZiAobGVuIFx1MDAzZT0gQUxMT0NJTkZPX1NUUl9TSVpFKVxuK1x0XHRzdHIgKz0gKGxlbiAtIEFMTE9DSU5GT19TVFJfU0laRSkgKyAxO1xuK1x0cmV0dXJuIHN0cjtcbit9XG4rXG4rc3RhdGljIHZvaWQgYWxsb2NpbmZvX2NvcHlfc3RyKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYylcbit7XG4rXHRzdHJuY3B5KGRlc3QsIGFsbG9jaW5mb19zdHIoc3JjKSwgQUxMT0NJTkZPX1NUUl9TSVpFIC0gMSk7XG4rXHRkZXN0W0FMTE9DSU5GT19TVFJfU0laRSAtIDFdID0gJ1xcMCc7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyxcbitcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciAqZmlsdGVyKVxuK3tcbitcdEZJTEUgKmZwID0gZm9wZW4oQUxMT0NJTkZPX1BST0MsIFwiclwiKTtcbitcdGNoYXIgbGluZVtNQVhfTElORV9MRU5dO1xuK1x0aW50IG1hdGNoZXM7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhIHByb2Nmc19lbnRyeTtcbitcbitcdGlmICghZnApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJGYWlsZWQgdG8gb3BlbiBcIiBBTExPQ0lORk9fUFJPQyBcIiBmb3IgcmVhZGluZ1xcblwiKTtcbitcdFx0cmV0dXJuIDE7XG4rXHR9XG4rXHRtZW1zZXQocHJvY2ZzX2VudHJpZXMsIDAsIHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSBcdTAwMjZcdTAwMjYgcHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUykge1xuK1x0XHRjaGFyIGZpbGVuYW1lW01BWF9MSU5FX0xFTl07XG4rXHRcdGNoYXIgZnVuY3Rpb25bTUFYX0xJTkVfTEVOXTtcbitcbitcdFx0bWVtc2V0KFx1MDAyNnByb2Nmc19lbnRyeSwgMCwgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xuK1x0XHRtYXRjaGVzID0gc3NjYW5mKGxpbmUsIFwiJWxsdSAlbGx1ICVbXjpdOiVsbHUgZnVuYzolc1wiLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS5jb3VudGVyLmNhbGxzLFxuK1x0XHRcdFx0IGZpbGVuYW1lLFxuK1x0XHRcdFx0IFx1MDAyNnByb2Nmc19lbnRyeS50YWcubGluZW5vLFxuK1x0XHRcdFx0IGZ1bmN0aW9uKTtcbitcbitcdFx0aWYgKG1hdGNoZXMgIT0gNSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZmlsZW5hbWUsIGZpbGVuYW1lKTtcbitcdFx0YWxsb2NpbmZvX2NvcHlfc3RyKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sIGZ1bmN0aW9uKTtcbitcbitcdFx0aWYgKGZpbHRlci1cdTAwM2VtYXNrIFx1MDAyNiBBTExPQ0lORk9fRklMVEVSX01BU0tfRklMRU5BTUUpIHtcbitcdFx0XHRpZiAoc3RybmNtcChwcm9jZnNfZW50cnkudGFnLmZpbGVuYW1lLFxuK1x0XHRcdFx0ICAgIGZpbHRlci1cdTAwM2VmaWVsZHMuZmlsZW5hbWUsIEFMTE9DSU5GT19TVFJfU0laRSkpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTikge1xuK1x0XHRcdGlmIChzdHJuY21wKHByb2Nmc19lbnRyeS50YWcuZnVuY3Rpb24sXG4rXHRcdFx0XHQgICAgZmlsdGVyLVx1MDAzZWZpZWxkcy5mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0xJTkVOTykge1xuK1x0XHRcdGlmIChwcm9jZnNfZW50cnkudGFnLmxpbmVubyAhPSBmaWx0ZXItXHUwMDNlZmllbGRzLmxpbmVubylcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXHRcdGlmIChmaWx0ZXItXHUwMDNlbWFzayBcdTAwMjYgQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX01JTl9TSVpFKSB7XG4rXHRcdFx0aWYgKHByb2Nmc19lbnRyeS5jb3VudGVyLmJ5dGVzIFx1MDAzYyBmaWx0ZXItXHUwMDNlbWluX3NpemUpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0fVxuK1x0XHRpZiAoZmlsdGVyLVx1MDAzZW1hc2sgXHUwMDI2IEFMTE9DSU5GT19GSUxURVJfTUFTS19NQVhfU0laRSkge1xuK1x0XHRcdGlmIChwcm9jZnNfZW50cnkuY291bnRlci5ieXRlcyBcdTAwM2UgZmlsdGVyLVx1MDAzZW1heF9zaXplKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcbitcdFx0bWVtY3B5KFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1twcm9jZnNfZW50cmllcy1cdTAwM2Vjb3VudCsrXSwgXHUwMDI2cHJvY2ZzX2VudHJ5LFxuK1x0XHQgICAgICAgc2l6ZW9mKHByb2Nmc19lbnRyeSkpO1xuK1x0fVxuK1x0ZmNsb3NlKGZwKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgZW51bSBpb2N0bF9yZXQgZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXMoc3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MsXG4rXHRcdFx0XHRcdFx0IGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIsXG4rXHRcdFx0XHRcdFx0IF9fdTY0IHN0YXJ0X3Bvcylcbit7XG4rXHRpbnQgZmQgPSBvcGVuKEFMTE9DSU5GT19QUk9DLCBPX1JET05MWSk7XG4rXG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJGYWlsZWQgdG8gb3BlbiBcIiBBTExPQ0lORk9fUFJPQyBcIiBmb3IgSU9DVExcXG5cIik7XG4rXHRcdHJldHVybiBJT0NUTF9GQUlMVVJFO1xuK1x0fVxuK1xuK1x0c3RydWN0IGFsbG9jaW5mb19jb250ZW50X2lkIHN0YXJ0X2NvbnRfaWQsIGVuZF9jb250X2lkO1xuK1x0c3RydWN0IGFsbG9jaW5mb19nZXRfYXQgZ2V0X2F0X3BhcmFtcztcbitcdGNvbnN0IGludCBtYXhfcmV0cmllcyA9IDEwO1xuK1x0aW50IHJldHJ5X2NvdW50ID0gMDtcbitcdGludCBzdGF0dXM7XG4rXG4rXHQvKlxuK1x0ICogX19hbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGlmIGEga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkXG4rXHQgKiBiZXR3ZWVuIHRoZSB0d28gY2FsbHMuIElmIHRoYXQgaGFwcGVucywgdGhlIGRhdGEgZ2F0aGVyZWQgY2Fubm90IGJlIGNvbnNpZGVyZWQgY29uc2lzdGVudFxuK1x0ICogYW5kIGhlbmNlIG5lZWRzIHRvIGJlIGZldGNoZWQgYWdhaW4gdG8gYXZvaWQgZmxha2luZXNzLlxuK1x0ICovXG4rXHRkbyB7XG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2c3RhcnRfY29udF9pZCkpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0c3RhdHVzID0gSU9DVExfRkFJTFVSRTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRtZW1zZXQodGFncywgMCwgc2l6ZW9mKCp0YWdzKSk7XG4rXHRcdG1lbXNldChcdTAwMjZnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpO1xuK1x0XHRtZW1jcHkoXHUwMDI2Z2V0X2F0X3BhcmFtcy5maWx0ZXIsIGZpbHRlciwgc2l6ZW9mKCpmaWx0ZXIpKTtcbitcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBzdGFydF9wb3M7XG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfYXQoZmQsIFx1MDAyNmdldF9hdF9wYXJhbXMpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJhbGxvY2luZm9fZ2V0X2F0IGZhaWxlZFxcblwiKTtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9GQUlMVVJFO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdG1lbWNweShcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50KytdLCBcdTAwMjZnZXRfYXRfcGFyYW1zLmRhdGEsIHNpemVvZihnZXRfYXRfcGFyYW1zLmRhdGEpKTtcbitcbitcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICAgIF9fYWxsb2NpbmZvX2dldF9uZXh0KGZkLCBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1t0YWdzLVx1MDAzZWNvdW50XSkgPT0gMClcbitcdFx0XHR0YWdzLVx1MDAzZWNvdW50Kys7XG4rXG4rXHRcdGlmIChfX2FsbG9jaW5mb19nZXRfY29udGVudF9pZChmZCwgXHUwMDI2ZW5kX2NvbnRfaWQpKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJhbGxvY2luZm9fZ2V0X2NvbnRlbnRfaWQgZmFpbGVkXFxuXCIpO1xuK1x0XHRcdHN0YXR1cyA9IElPQ1RMX0ZBSUxVUkU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcbitcdFx0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQpIHtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9TVUNDRVNTO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIG1pc21hdGNoLCByZXRyeWluZy4uLlxcblwiKTtcbitcdFx0XHRzdGF0dXMgPSBJT0NUTF9JTlZBTElEX0RBVEE7XG4rXHRcdH1cbitcdH0gd2hpbGUgKHN0YXR1cyA9PSBJT0NUTF9JTlZBTElEX0RBVEEgXHUwMDI2XHUwMDI2IHJldHJ5X2NvdW50KysgXHUwMDNjIG1heF9yZXRyaWVzKTtcbitcbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBzdGF0dXM7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnVuX2ZpbHRlcl90ZXN0KGNvbnN0IHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyICpmaWx0ZXIpXG4re1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnRhZ3MgPSBtYWxsb2Moc2l6ZW9mKCp0YWdzKSk7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqcHJvY2ZzX2VudHJpZXMgPSBtYWxsb2Moc2l6ZW9mKCpwcm9jZnNfZW50cmllcykpO1xuK1x0aW50IGlvY3RsX3N0YXR1cztcbitcdGludCByZXQgPSBLU0ZUX1BBU1M7XG4rXG4rXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXG4rXHRpZiAoZ2V0X2ZpbHRlcmVkX3Byb2Nmc19lbnRyaWVzKHByb2Nmc19lbnRyaWVzLCBmaWx0ZXIpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCIgQUxMT0NJTkZPX1BST0MgXCJcXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1xuK1x0aWYgKHByb2Nmc19lbnRyaWVzLVx1MDAzZWNvdW50ID09IDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBlbnRyaWVzIGZvdW5kIGluIFwiIEFMTE9DSU5GT19QUk9DIFwiLCBza2lwcGluZyB0ZXN0XFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdGlvY3RsX3N0YXR1cyA9IGdldF9maWx0ZXJlZF9pb2N0bF9lbnRyaWVzKHRhZ3MsIGZpbHRlciwgMCk7XG4rXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0lOVkFMSURfREFUQSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIlRyb3VibGUgcmV0cmlldmluZyB2YWxpZCBJT0NUTCBlbnRyaWVzLCBza2lwcGluZy5cXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1x0aWYgKGlvY3RsX3N0YXR1cyA9PSBJT0NUTF9GQUlMVVJFKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBJT0NUTCBlbnRyaWVzLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXG4rXHRpZiAoIW1hdGNoX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIHRhZ3MsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpXG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcbitleGl0OlxuK1x0ZnJlZSh0YWdzKTtcbitcdGZyZWUocHJvY2ZzX2VudHJpZXMpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbitcdGNvbnN0IGNoYXIgKnRhcmdldF9maWxlbmFtZSA9IFwibW0vbWVtb3J5LmNcIjtcbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GSUxFTkFNRTtcbitcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5maWxlbmFtZSwgdGFyZ2V0X2ZpbGVuYW1lLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuK1xuK1x0cmV0dXJuIHJ1bl9maWx0ZXJfdGVzdChcdTAwMjZmaWx0ZXIpO1xuK31cbitcbitzdGF0aWMgaW50IHRlc3RfZnVuY3Rpb25fZmlsdGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IGFsbG9jaW5mb19maWx0ZXIgZmlsdGVyO1xuK1x0Y29uc3QgY2hhciAqdGFyZ2V0X2Z1bmN0aW9uID0gXCJkdXBfbW1cIjtcbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdGZpbHRlci5tYXNrIHw9IEFMTE9DSU5GT19GSUxURVJfTUFTS19GVU5DVElPTjtcbitcdHN0cm5jcHkoZmlsdGVyLmZpZWxkcy5mdW5jdGlvbiwgdGFyZ2V0X2Z1bmN0aW9uLCBBTExPQ0lORk9fU1RSX1NJWkUpO1xuK1xuK1x0cmV0dXJuIHJ1bl9maWx0ZXJfdGVzdChcdTAwMjZmaWx0ZXIpO1xuK31cbitcbitzdGF0aWMgaW50IHRlc3Rfc2l6ZV9maWx0ZXIodm9pZClcbit7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX3RhZ19kYXRhX3ZlYyAqdGFncyA9IG1hbGxvYyhzaXplb2YoKnRhZ3MpKTtcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICpwcm9jZnNfZW50cmllcyA9IG1hbGxvYyhzaXplb2YoKnByb2Nmc19lbnRyaWVzKSk7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2ZpbHRlciBmaWx0ZXI7XG4rXHRpbnQgcmV0ID0gS1NGVF9QQVNTO1xuK1x0X191NjQgdGFyZ2V0X3NpemUsIGksIHBvcztcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGEgKmZvdW5kX3RhZyA9IE5VTEw7XG4rXHRjb25zdCBjaGFyICp0YXJnZXRfZnVuY3Rpb24gPSBcImRvX2luaXRfbW9kdWxlXCI7XG4rXHRzdHJ1Y3QgYWxsb2NpbmZvX2NvbnRlbnRfaWQgc3RhcnRfY29udF9pZCwgZW5kX2NvbnRfaWQ7XG4rXHRpbnQgcmV0cnkgPSAwO1xuK1x0Y29uc3QgaW50IG1heF9yZXRyaWVzID0gMTA7XG4rXG4rXHRpZiAoIXRhZ3MgfHwgIXByb2Nmc19lbnRyaWVzKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRnb3RvIGZyZWVtZW07XG4rXHR9XG4rXG4rXHRmZCA9IG9wZW4oQUxMT0NJTkZPX1BST0MsIE9fUkRPTkxZKTtcbitcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkZhaWxlZCB0byBvcGVuIFwiIEFMTE9DSU5GT19QUk9DIFwiOiAlc1xcblwiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0XHRyZXQgPSBLU0ZUX1NLSVA7XG4rXHRcdGdvdG8gZnJlZW1lbTtcbitcdH1cbitcbitcdGRvIHtcbitcdFx0Zm91bmRfdGFnID0gTlVMTDtcbitcdFx0cG9zID0gMDtcbitcbitcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcdTAwMjZzdGFydF9jb250X2lkKSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiYWxsb2NpbmZvX2dldF9jb250ZW50X2lkIGZhaWxlZFxcblwiKTtcbitcdFx0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdFx0Z290byBleGl0O1xuK1x0XHR9XG4rXG4rXHRcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcdFx0ZmlsdGVyLm1hc2sgfD0gQUxMT0NJTkZPX0ZJTFRFUl9NQVNLX0ZVTkNUSU9OO1xuK1x0XHRzdHJuY3B5KGZpbHRlci5maWVsZHMuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbiwgQUxMT0NJTkZPX1NUUl9TSVpFKTtcbitcbitcdFx0aWYgKGdldF9maWx0ZXJlZF9wcm9jZnNfZW50cmllcyhwcm9jZnNfZW50cmllcywgXHUwMDI2ZmlsdGVyKSkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiRXJyb3IgcmV0cmlldmluZyBlbnRyaWVzIGZyb20gXCIgQUxMT0NJTkZPX1BST0MgXCJcXG5cIik7XG4rXHRcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgPT0gMCkge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiRnVuY3Rpb24gJXMgbm90IGZvdW5kIGluIHByb2Nmc1xcblwiLCB0YXJnZXRfZnVuY3Rpb24pO1xuK1x0XHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdFx0XHRnb3RvIGV4aXQ7XG4rXHRcdH1cbitcbitcdFx0dGFyZ2V0X3NpemUgPSBwcm9jZnNfZW50cmllcy1cdTAwM2V0YWdbMF0uY291bnRlci5ieXRlcztcbitcbitcdFx0bWVtc2V0KFx1MDAyNmZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpO1xuK1x0XHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTUlOX1NJWkUgfCBBTExPQ0lORk9fRklMVEVSX01BU0tfTUFYX1NJWkU7XG4rXHRcdGZpbHRlci5taW5fc2l6ZSA9IHRhcmdldF9zaXplO1xuK1x0XHRmaWx0ZXIubWF4X3NpemUgPSB0YXJnZXRfc2l6ZTtcbitcbitcdFx0d2hpbGUgKDEpIHtcbitcdFx0XHRzdHJ1Y3QgYWxsb2NpbmZvX2dldF9hdCBnZXRfYXRfcGFyYW1zO1xuK1xuK1x0XHRcdG1lbXNldChcdTAwMjZnZXRfYXRfcGFyYW1zLCAwLCBzaXplb2YoZ2V0X2F0X3BhcmFtcykpO1xuK1x0XHRcdG1lbWNweShcdTAwMjZnZXRfYXRfcGFyYW1zLmZpbHRlciwgXHUwMDI2ZmlsdGVyLCBzaXplb2YoZmlsdGVyKSk7XG4rXHRcdFx0Z2V0X2F0X3BhcmFtcy5wb3MgPSBwb3M7XG4rXG4rXHRcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9hdChmZCwgXHUwMDI2Z2V0X2F0X3BhcmFtcykpXG4rXHRcdFx0XHRicmVhaztcbitcbitcdFx0XHR0YWdzLVx1MDAzZWNvdW50ID0gMDtcbitcdFx0XHRtZW1jcHkoXHUwMDI2dGFncy1cdTAwM2V0YWdbdGFncy1cdTAwM2Vjb3VudCsrXSwgXHUwMDI2Z2V0X2F0X3BhcmFtcy5kYXRhLFxuK1x0XHRcdCAgICAgICBzaXplb2YoZ2V0X2F0X3BhcmFtcy5kYXRhKSk7XG4rXG4rXHRcdFx0d2hpbGUgKHRhZ3MtXHUwMDNlY291bnQgXHUwMDNjIFZFQ19NQVhfRU5UUklFUyBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAgICAgX19hbGxvY2luZm9fZ2V0X25leHQoZmQsIFx1MDAyNnRhZ3MtXHUwMDNldGFnW3RhZ3MtXHUwMDNlY291bnRdKSA9PSAwKVxuK1x0XHRcdFx0dGFncy1cdTAwM2Vjb3VudCsrO1xuK1xuK1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdFx0aWYgKHN0cmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF9mdW5jdGlvbikgPT0gMCkge1xuK1x0XHRcdFx0XHRmb3VuZF90YWcgPSBcdTAwMjZ0YWdzLVx1MDAzZXRhZ1tpXTtcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1xuK1x0XHRcdGlmIChmb3VuZF90YWcgfHwgdGFncy1cdTAwM2Vjb3VudCBcdTAwM2MgVkVDX01BWF9FTlRSSUVTKVxuK1x0XHRcdFx0YnJlYWs7XG4rXG4rXHRcdFx0cG9zICs9IHRhZ3MtXHUwMDNlY291bnQ7XG4rXHRcdH1cbitcbitcdFx0aWYgKF9fYWxsb2NpbmZvX2dldF9jb250ZW50X2lkKGZkLCBcdTAwMjZlbmRfY29udF9pZCkpIHtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcImFsbG9jaW5mb19nZXRfY29udGVudF9pZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoc3RhcnRfY29udF9pZC5pZCA9PSBlbmRfY29udF9pZC5pZClcbitcdFx0XHRicmVhaztcbitcbitcdFx0a3NmdF9wcmludF9tc2coXCJNb2R1bGUgbG9hZCBkZXRlY3RlZCBkdXJpbmcgc2l6ZSB2ZXJpZmljYXRpb24sIHJldHJ5aW5nLi4uXFxuXCIpO1xuK1x0fSB3aGlsZSAocmV0cnkrKyBcdTAwM2MgbWF4X3JldHJpZXMpO1xuK1xuK1x0aWYgKHN0YXJ0X2NvbnRfaWQuaWQgPT0gZW5kX2NvbnRfaWQuaWQgXHUwMDI2XHUwMDI2ICFmb3VuZF90YWcpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFbnRyeSB3aXRoIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBJT0NUTCByZXN1bHRzXFxuXCIsXG4rXHRcdFx0ICAgICAgIHRhcmdldF9mdW5jdGlvbik7XG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcdH0gZWxzZSBpZiAoc3RhcnRfY29udF9pZC5pZCAhPSBlbmRfY29udF9pZC5pZCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkZhaWxlZCB0byBtYXRjaCBjb250ZW50X2lkcyBmb3IgcHJvY2ZzIGFuZCBJT0NUTCwgc2tpcHBpbmcuLi5cXG5cIik7XG4rXHRcdHJldCA9IEtTRlRfU0tJUDtcbitcdH0gZWxzZSBpZiAoZm91bmRfdGFnIFx1MDAyNlx1MDAyNiBmb3VuZF90YWctXHUwMDNlY291bnRlci5ieXRlcyAhPSB0YXJnZXRfc2l6ZSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIklPQ1RMIGVudHJ5IHNpemUgJWxsdSBkb2VzIG5vdCBtYXRjaCB0YXJnZXQgc2l6ZSAlbGx1XFxuXCIsXG4rXHRcdFx0ICAgICAgIGZvdW5kX3RhZy1cdTAwM2Vjb3VudGVyLmJ5dGVzLCB0YXJnZXRfc2l6ZSk7XG4rXHRcdHJldCA9IEtTRlRfRkFJTDtcbitcdH1cbitcbitleGl0OlxuK1x0Y2xvc2UoZmQpO1xuK2ZyZWVtZW06XG4rXHRmcmVlKHRhZ3MpO1xuK1x0ZnJlZShwcm9jZnNfZW50cmllcyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHRlc3RfbGluZW5vX2ZpbHRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCBhbGxvY2luZm9fdGFnX2RhdGFfdmVjICp0YWdzID0gbWFsbG9jKHNpemVvZigqdGFncykpO1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YV92ZWMgKnByb2Nmc19lbnRyaWVzID0gbWFsbG9jKHNpemVvZigqcHJvY2ZzX2VudHJpZXMpKTtcbitcdHN0cnVjdCBhbGxvY2luZm9fZmlsdGVyIGZpbHRlcjtcbitcdGVudW0gaW9jdGxfcmV0IGlvY3RsX3N0YXR1cztcbitcdGludCByZXQgPSBLU0ZUX1BBU1M7XG4rXHRfX3U2NCB0YXJnZXRfbGluZW5vLCBpO1xuK1x0c3RydWN0IGFsbG9jaW5mb190YWdfZGF0YSAqdGFyZ2V0X3RhZztcbitcdGJvb2wgZm91bmQgPSBmYWxzZTtcbitcbitcdGlmICghdGFncyB8fCAhcHJvY2ZzX2VudHJpZXMpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTtcbitcbitcdGlmIChnZXRfZmlsdGVyZWRfcHJvY2ZzX2VudHJpZXMocHJvY2ZzX2VudHJpZXMsIFx1MDAyNmZpbHRlcikpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFcnJvciByZXRyaWV2aW5nIGVudHJpZXMgZnJvbSBcIiBBTExPQ0lORk9fUFJPQyBcIlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHRpZiAocHJvY2ZzX2VudHJpZXMtXHUwMDNlY291bnQgPT0gMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvdWxkIG5vdCByZXRyaWV2ZSBwcm9jZnMgZW50cmllc1xcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHQvKlxuK1x0ICogV2UgZGVwZW5kIG9uIHRoZSBwcm9jZnMgcmVzdWx0cyB0byBkZXRlcm1pbmUgdGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgZmlsdGVyIGJlZm9yZVxuK1x0ICogbWFraW5nIHRoZSBpb2N0bCBxdWVyeS4gSGVuY2UsIHdlIGNhbm5vdCByZXVzZSBydW5fZmlsdGVyX3Rlc3QgaGVyZS5cbitcdCAqL1xuK1x0dGFyZ2V0X3RhZyA9IFx1MDAyNnByb2Nmc19lbnRyaWVzLVx1MDAzZXRhZ1swXTtcbitcdHRhcmdldF9saW5lbm8gPSB0YXJnZXRfdGFnLVx1MDAzZXRhZy5saW5lbm87XG4rXG4rXHRmaWx0ZXIubWFzayB8PSBBTExPQ0lORk9fRklMVEVSX01BU0tfTElORU5PO1xuK1x0ZmlsdGVyLmZpZWxkcy5saW5lbm8gPSB0YXJnZXRfbGluZW5vO1xuK1xuK1x0aW9jdGxfc3RhdHVzID0gZ2V0X2ZpbHRlcmVkX2lvY3RsX2VudHJpZXModGFncywgXHUwMDI2ZmlsdGVyLCAwKTtcbitcdGlmIChpb2N0bF9zdGF0dXMgPT0gSU9DVExfSU5WQUxJRF9EQVRBKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiVHJvdWJsZSByZXRyaWV2aW5nIHZhbGlkIElPQ1RMIGVudHJpZXMsIHNraXBwaW5nLlxcblwiKTtcbitcdFx0cmV0ID0gS1NGVF9TS0lQO1xuK1x0XHRnb3RvIGV4aXQ7XG4rXHR9XG4rXHRpZiAoaW9jdGxfc3RhdHVzID09IElPQ1RMX0ZBSUxVUkUpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJFcnJvciByZXRyaWV2aW5nIElPQ1RMIGVudHJpZXMuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhZ3MtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRpZiAodGFncy1cdTAwM2V0YWdbaV0udGFnLmxpbmVubyAhPSB0YXJnZXRfbGluZW5vKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJJT0NUTCBlbnRyeSAlbGx1IGhhcyBpbmNvcnJlY3QgbGluZW5vICVsbHUuXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgaSwgdGFncy1cdTAwM2V0YWdbaV0udGFnLmxpbmVubyk7XG4rXHRcdFx0cmV0ID0gS1NGVF9GQUlMO1xuK1x0XHRcdGdvdG8gZXhpdDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoc3RybmNtcCh0YWdzLVx1MDAzZXRhZ1tpXS50YWcuZnVuY3Rpb24sIHRhcmdldF90YWctXHUwMDNldGFnLmZ1bmN0aW9uLFxuK1x0XHRcdCAgICBBTExPQ0lORk9fU1RSX1NJWkUpID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBzdHJuY21wKHRhZ3MtXHUwMDNldGFnW2ldLnRhZy5maWxlbmFtZSwgdGFyZ2V0X3RhZy1cdTAwM2V0YWcuZmlsZW5hbWUsXG4rXHRcdFx0ICAgIEFMTE9DSU5GT19TVFJfU0laRSkgPT0gMClcbitcdFx0XHRmb3VuZCA9IHRydWU7XG4rXHR9XG4rXG4rXHRpZiAoIWZvdW5kKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiT3JpZ2luYWwgcHJvY2ZzIGVudHJ5IG5vdCBmb3VuZCBpbiBJT0NUTCBsaW5lbm8gZmlsdGVyIHJlc3VsdHMuXFxuXCIpO1xuK1x0XHRyZXQgPSBLU0ZUX0ZBSUw7XG4rXHR9XG4rXG4rZXhpdDpcbitcdGZyZWUodGFncyk7XG4rXHRmcmVlKHByb2Nmc19lbnRyaWVzKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pXG4re1xuK1x0aW50IHJldDtcbitcbitcdGtzZnRfc2V0X3BsYW4oNCk7XG4rXG4rXHRyZXQgPSB0ZXN0X2ZpbGVuYW1lX2ZpbHRlcigpO1xuK1x0aWYgKHJldCA9PSBLU0ZUX1NLSVApXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIlNraXBwaW5nIHRlc3RfZmlsZW5hbWVfZmlsdGVyXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwidGVzdF9maWxlbmFtZV9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X2Z1bmN0aW9uX2ZpbHRlcigpO1xuK1x0aWYgKHJldCA9PSBLU0ZUX1NLSVApXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIlNraXBwaW5nIHRlc3RfZnVuY3Rpb25fZmlsdGVyXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KHJldCA9PSBLU0ZUX1BBU1MsIFwidGVzdF9mdW5jdGlvbl9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X3NpemVfZmlsdGVyKCk7XG4rXHRpZiAocmV0ID09IEtTRlRfU0tJUClcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiU2tpcHBpbmcgdGVzdF9zaXplX2ZpbHRlclxcblwiKTtcbitcdGVsc2VcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdChyZXQgPT0gS1NGVF9QQVNTLCBcInRlc3Rfc2l6ZV9maWx0ZXJcXG5cIik7XG4rXG4rXHRyZXQgPSB0ZXN0X2xpbmVub19maWx0ZXIoKTtcbitcdGlmIChyZXQgPT0gS1NGVF9TS0lQKVxuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCJTa2lwcGluZyB0ZXN0X2xpbmVub19maWx0ZXJcXG5cIik7XG4rXHRlbHNlXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHQocmV0ID09IEtTRlRfUEFTUywgXCJ0ZXN0X2xpbmVub19maWx0ZXJcXG5cIik7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MDUuNjM1ODk2NzExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTgxMDEwNzYwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBOZXcgQWxsb2NhdGlvbiBQcm9maWxpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIGEgbmV3IGBpb2N0bGAgaW50ZXJmYWNlIGZvciBgL3Byb2MvYWxsb2NpbmZvYC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgc2VlIGEgZ29vZCByYW5nZSBvZiBmaWxlcyB0b3VjaGVkLCB3aGljaCBpcyB3aGF0IEknZCBleHBlY3QgZm9yIHRoaXMga2luZCBvZiBmZWF0dXJlLiBXZSBoYXZlIGRvY3VtZW50YXRpb24gdXBkYXRlcywgd2hpY2ggaXMgY3J1Y2lhbCwgZXNwZWNpYWxseSByZWdhcmRpbmcgdXNlcnNwYWNlIGludGVyYWN0aW9uIHdpdGggdGhlIG5ldyBgaW9jdGxgIGluIGJvdGggdGhlIGBtbS9hbGxvY2F0aW9uLXByb2ZpbGluZy5yc3RgIGFuZCBgdXNlcnNwYWNlLWFwaS9pb2N0bC9pb2N0bC1udW1iZXIucnN0YCBmaWxlcy4gVGhlIGBNQUlOVEFJTkVSU2AgY2hhbmdlIGlzIGFsc28gZXhwZWN0ZWQgdG8gZW5zdXJlIHRoZSByaWdodCBwZW9wbGUgYXJlIGluIHRoZSBsb29wLiBUaGUgaGVhZGVyIGZpbGVzIGxpa2UgYGluY2x1ZGUvbGludXgvY29kZXRhZy5oYCBhbmQgYGluY2x1ZGUvdWFwaS9saW51eC9hbGxvY190YWcuaGAgdGVsbCBtZSB0aGV5J3JlIHNldHRpbmcgdXAgdGhlIGxvdy1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMsIGFuZCB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlbHkgaW4gYGxpYi9jb2RldGFnLmNgIGFuZCBgbW0vYWxsb2NfdGFnLmNgLiBUaGUgaW5jbHVzaW9uIG9mIGEgc2VsZnRlc3QgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FsbG9jX3RhZy9gIGlzIGEgaHVnZSBwbHVzOyBhbHdheXMgZ29vZCB0byBoYXZlIHNvbWUgc29saWQgdmFsaWRhdGlvbi5cblxuTm93LCB0aGUgbWVhdCBvZiBpdCBpcyBpbiBgbW0vYWxsb2NfdGFnLmNgLCB3aGVyZSB3ZSdyZSBhZGRpbmcgdGhpcyBgYWxsb2NpbmZvX2lvY3RsYCBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGhhbmRsaW5nIHRoZSBgQUxMT0NJTkZPX0lPQ19DT05URU5UX0lEYCwgYEFMTE9DSU5GT19JT0NfR0VUX0FUYCwgYW5kIGBBTExPQ0lORk9fSU9DX0dFVF9ORVhUYCBpb2N0bCBjb21tYW5kcy4gU28gdGhpcyBpcyBob3cgdXNlcnNwYWNlIHdpbGwgYWN0dWFsbHkgaW50ZXJhY3Qgd2l0aCB0aGUgbmV3IGAvcHJvYy9hbGxvY2luZm9gIGludGVyZmFjZS5cblxuR2l2ZW4gdGhpcywgSSBzaG91bGQgY29uZmlybSB0aGUgQ09ORklHIG9wdGlvbnMgdGhhdCBjb250cm9sIHRoaXMuIEkgc2VlIHRoYXQgdGhlIGNvcmUgZmlsZSwgYG1tL2FsbG9jX3RhZy5jYCwgaXMgb25seSBjb21waWxlZCB3aGVuIGBDT05GSUdfTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gVGhhdCBtYWtlcyBzZW5zZSwga2VlcHMgdGhpbmdzIG1vZHVsYXIgYW5kIGF2b2lkcyB1bm5lY2Vzc2FyeSBjb2RlIGJsb2F0IGluIGEgcHJvZHVjdGlvbiBrZXJuZWwuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgdGhlIEtjb25maWcgZmlsZXMgYWN0dWFsbHkgc3RhdGUuIEknbGwgYWxzbyBjaGVjayBvdGhlciBkZXBlbmRlbmNpZXMsIGJ1dCB0aGlzIHNlZW1zIGxpa2UgYSBzb2xpZCBpbml0aWFsIGFwcHJvYWNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTEzNSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0MSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjExLjQ0NjAwNTc3NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI4MjcyMTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWxsb2NfdGFnLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTE0OT1vYmotJChDT05GSUdfTEFaWV9NTVVfTU9ERV9LVU5JVF9URVNUKSArPSB0ZXN0cy9sYXp5X21tdV9tb2RlX2t1bml0Lm9cXG5tbS9NYWtlZmlsZToxNTA6b2JqLSQoQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkcpICs9IGFsbG9jX3RhZy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjExLjU4ODg0Mzg5MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwNzI2NDY2OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBBbGxvY2F0aW9uIFByb2ZpbGluZyBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSd2ZSBjb25maXJtZWQgdGhhdCBgQ09ORklHX01FTV9BTExPQ19QUk9GSUxJTkdgIGlzIGRlZmluaXRlbHkgYSBrZXkgcmVxdWlyZW1lbnQgaGVyZS4gTm93LCBJIHNob3VsZCBwcm9iYWJseSB0YWtlIGEgYnJvYWRlciBsb29rIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHRoYXQgbmVlZCBteSBhdHRlbnRpb24uIExldCdzIHNlZS4uLiBJIHNlZSB0aGUgaW9jdGwgaXMgcGx1bWJlZCBpbnRvIGAvcHJvYy9hbGxvY2luZm9gLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBpbnRyb3NwZWN0aW9uLiBCdXQsIHRvIGJlIHRydWx5IHRob3JvdWdoLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJJ2xsIG5lZWQgdG8gZGlnIGludG8gYG1tL2FsbG9jX3RhZy5jYCByaWdodCBhd2F5LiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdGhlciBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzIChgI2lmZGVmYHMpIGluIHRoYXQgZmlsZSB0aGF0IHJlbGF0ZSB0byBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgb3IgdGFnZ2luZy4gVGhhdCB3aWxsIHByb2JhYmx5IGJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdWxsIHBpY3R1cmUgb2YgdGhlIGZlYXR1cmUncyBkZXBlbmRlbmNpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1OTE3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MTUuNjYxNDkyNTY3WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3NTAyMjc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImFsbG9jaW5mb19pb2N0bFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9hbGxvY190YWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9hbGxvY190YWcuYz0yMTQ9c3RhdGljIHZvaWQgYWxsb2NpbmZvX3RvX3BhcmFtcyhzdHJ1Y3QgY29kZXRhZyAqY3QsXFxuLS1cXG5tbS9hbGxvY190YWcuYy0yMzMtICovXFxubW0vYWxsb2NfdGFnLmM6MjM0OnN0YXRpYyBpbnQgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG5tbS9hbGxvY190YWcuYy0yMzUte1xcbi0tXFxubW0vYWxsb2NfdGFnLmM9MjUxPXN0YXRpYyBib29sIG1hdGNoZXNfZmlsdGVyKHN0cnVjdCBjb2RldGFnICpjdCwgc3RydWN0IGFsbG9jaW5mb19maWx0ZXIgKmZpbHRlcixcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTMwNy0gKi9cXG5tbS9hbGxvY190YWcuYzozMDg6c3RhdGljIGludCBhbGxvY2luZm9faW9jdGxfZ2V0X2F0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCBfX3VzZXIgKmFyZylcXG5tbS9hbGxvY190YWcuYy0zMDkte1xcbi0tXFxubW0vYWxsb2NfdGFnLmMtMzgyLSAqL1xcbm1tL2FsbG9jX3RhZy5jOjM4MzpzdGF0aWMgaW50IGFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgX191c2VyICphcmcpXFxubW0vYWxsb2NfdGFnLmMtMzg0LXtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQzMy0gKi9cXG5tbS9hbGxvY190YWcuYzo0MzQ6c3RhdGljIGxvbmcgYWxsb2NpbmZvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbm1tL2FsbG9jX3RhZy5jLTQzNS1cXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBfX2FyZylcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQ0MS1cXHRjYXNlIEFMTE9DSU5GT19JT0NfQ09OVEVOVF9JRDpcXG5tbS9hbGxvY190YWcuYzo0NDI6XFx0XFx0cmV0ID0gYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkKGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YSwgYXJnKTtcXG5tbS9hbGxvY190YWcuYy00NDMtXFx0XFx0YnJlYWs7XFxubW0vYWxsb2NfdGFnLmMtNDQ0LVxcdGNhc2UgQUxMT0NJTkZPX0lPQ19HRVRfQVQ6XFxubW0vYWxsb2NfdGFnLmM6NDQ1OlxcdFxcdHJldCA9IGFsbG9jaW5mb19pb2N0bF9nZXRfYXQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbm1tL2FsbG9jX3RhZy5jLTQ0Ni1cXHRcXHRicmVhaztcXG5tbS9hbGxvY190YWcuYy00NDctXFx0Y2FzZSBBTExPQ0lORk9fSU9DX0dFVF9ORVhUOlxcbm1tL2FsbG9jX3RhZy5jOjQ0ODpcXHRcXHRyZXQgPSBhbGxvY2luZm9faW9jdGxfZ2V0X25leHQoZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhLCBhcmcpO1xcbm1tL2FsbG9jX3RhZy5jLTQ0OS1cXHRcXHRicmVhaztcXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTQ1OT1zdGF0aWMgbG9uZyBhbGxvY2luZm9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLFxcbi0tXFxubW0vYWxsb2NfdGFnLmMtNDYxLXtcXG5tbS9hbGxvY190YWcuYzo0NjI6XFx0cmV0dXJuIGFsbG9jaW5mb19pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7XFxubW0vYWxsb2NfdGFnLmMtNDYzLX1cXG4tLVxcbm1tL2FsbG9jX3RhZy5jPTQ2Nj1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGFsbG9jaW5mb19wcm9jX29wcyA9IHtcXG4tLVxcbm1tL2FsbG9jX3RhZy5jLTQ3MC1cXHQucHJvY19yZWxlYXNlXFx0XFx0PSBhbGxvY2luZm9fcmVsZWFzZSxcXG5tbS9hbGxvY190YWcuYzo0NzE6XFx0LnByb2NfaW9jdGxcXHRcXHQ9IGFsbG9jaW5mb19pb2N0bCxcXG5tbS9hbGxvY190YWcuYy00NzItI2lmZGVmIENPTkZJR19DT01QQVRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MTUuNzE4OTk4NjQ3WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTI1MzgxNjgxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gUHJvZmlsaW5nIElvY3RsIEludGVyZmFjZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5LCBteSBleHBlcnQgZXllIGdvZXMgdG8gdGhlIGNvcmU6IHRoZXNlIGBpb2N0bGAgZnVuY3Rpb25zLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkYCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfYXRgLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0YCwgYGFsbG9jaW5mb19pb2N0bGAsIGFuZCBgYWxsb2NpbmZvX2NvbXBhdF9pb2N0bGAuIFRoZXkncmUgY2xlYXJseSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgbmV3IGFsbG9jYXRpb24gcHJvZmlsaW5nIGZ1bmN0aW9uYWxpdHksIGFuZCB0aGUgYC9wcm9jL2FsbG9jaW5mb2Agbm9kZSBjb25maXJtcyB0aGlzIGlzIGEgbGl2ZSBhbmQgZnVuY3Rpb25pbmcgaW50ZXJmYWNlLlxuXG5UaGlzIGlzICpwZXJmZWN0KiBmdXp6aW5nIG1hdGVyaWFsLiBJdCdzIGFuIG9idmlvdXMgdGFyZ2V0LiBCdXQgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCBpbnRvIGZ1enppbmcgc3RyYXRlZ3ksIEkgc2hvdWxkIG1ha2Ugc3VyZSBteSBlbnZpcm9ubWVudCBpcyBwcm9wZXJseSBzZXQgdXAuIFJpZ2h0LCBJIG5lZWQgdG8gY2hlY2sgaWYgYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBZZXMsIGl0IGlzLiBHb29kLlxuXG5Ob3csIGxldCBtZSB0aGluayBpZiB0aGVyZSBhcmUgb3RoZXIsIG1vcmUgc3VidGxlIGNvbmZpZ3VyYXRpb25zIGF0IHBsYXkgaGVyZS4gU2luY2UgaXQncyBpbnRlcmFjdGluZyB3aXRoIGAvcHJvY2AsIEkgc2hvdWxkIG1ha2Ugc3VyZSBgQ09ORklHX1BST0NfRlNgIGlzbid0IHNvbWUgb2JzY3VyZSByZXF1aXJlbWVudC4gQ2hlY2tpbmcgYG1tL2FsbG9jX3RhZy5jYCwgSSBzZWUgYHByb2NfY3JlYXRlYCwgd2hpY2ggcmVsaWVzIG9uIGBDT05GSUdfUFJPQ19GU2AuIEhvd2V2ZXIsIHRoYXQgaXMgYSB2ZXJ5IGNvbW1vbiBjb25maWcsIGFuZCBub3Qgd29ydGggdGhlIGxpc3RpbmcuIE5vdywgd2hlcmUgd2FzIEk/IFJpZ2h0LCBsZXQncyBjaGVjayBgbGliL2NvZGV0YWcuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2OTUxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjIwLjk3MjgxNzA3NloiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDc0MjY2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2RldGFnLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvTWFrZWZpbGU9MTk2PW9iai0kKENPTkZJR19GVU5DVElPTl9FUlJPUl9JTkpFQ1RJT04pICs9IGVycm9yLWluamVjdC5vXFxubGliL01ha2VmaWxlLTE5Ny1cXG5saWIvTWFrZWZpbGU6MTk4Om9iai0kKENPTkZJR19DT0RFX1RBR0dJTkcpICs9IGNvZGV0YWcub1xcbmxpYi9NYWtlZmlsZS0xOTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjIxLjA1NzU2NDc0NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc3MzExNTQ4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKlZlcmlmeWluZyBEZXBlbmRlbmNpZXMgaW4gS2VybmVsIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIHNlZSB0aGF0IGBDT05GSUdfQ09ERV9UQUdHSU5HYCBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIHdoZW4gYENPTkZJR19NRU1fQUxMT0NfUFJPRklMSU5HYCBpcyBlbmFibGVkLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgSSBhbHdheXMgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGVzcGVjaWFsbHkgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggY29yZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gVGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGtpbmQgb2YgZGVwZW5kZW5jeSBhcmUgcHJldHR5IHNpZ25pZmljYW50LCBhbmQgYSBtaXN1bmRlcnN0YW5kaW5nIGhlcmUgY291bGQgbGVhZCB0byBzb21lIG5hc3R5IGRlYnVnZ2luZyBoZWFkYWNoZXMgbGF0ZXIgb24uIExldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSB0aGF0IHRoZSBkZXBlbmRlbmN5IGlzIGNvZGVkIGNvcnJlY3RseS4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIHJlbGV2YW50IHNlY3Rpb25zIGFuZCBtYWtlIHN1cmUgdGhlIGxvZ2ljIGlzIHNvdW5kIGFuZCB0aGVyZSBhcmUgbm8gdW5leHBlY3RlZCBpbnRlcmFjdGlvbnMgb3IgY29uZGl0aW9uYWxzIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSBiZWhhdmlvci4gSXQncyBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBhdm9pZCB3YXN0aW5nIHRpbWUgdHJhY2tpbmcgZG93biBhIGh5cG90aGV0aWNhbCBidWcgZG93biB0aGUgbGluZS4gSXQncyBzZWNvbmQgbmF0dXJlIGZvciBtZSB0byBpbW1lZGlhdGVseSB2ZXJpZnkgYSBkZXBlbmRlbmN5IGxpa2UgdGhpcy4gR29vZCB0byBnbyFcblxuXG4iLCJJbnB1dFRva2VucyI6MTc1NzEsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDoyOC43ODg3MjIxNTJaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1NDkzNTAwLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDlUMTE6NTA6MjguODQ0MjIwNzUxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU3NDUxMTM0MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipGaW5kaW5nIHRoZSBEZWZpbml0aW9uIG9mIGBNRU1fQUxMT0NfUFJPRklMSU5HYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIGV4YWN0bHkgd2hlcmUgdGhpcyBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZGVmaW5lZC4gVGhpcyBsaWtlbHkgbWVhbnMgaXQncyBhIHByZXByb2Nlc3NvciBtYWNybyBvciwgbGVzcyBsaWtlbHksIGEgdmFyaWFibGUuIEdpdmVuIHRoZSBuYW1pbmcgY29udmVudGlvbiwgbXkgaW5pdGlhbCBiZXQgaXMgb24gYSBtYWNyby4gSSdsbCBuZWVkIHRvIGtub3cgaXRzIGRlZmluaXRpb24gdG8gdW5kZXJzdGFuZCBpdHMgaW1wYWN0IG9uIHRoZSBjb2RlYmFzZSBhbmQsIHVsdGltYXRlbHksIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgd2l0aCBpdC4gVGhpcyBpcyBjcnVjaWFsIGZvciBkZWJ1Z2dpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGJlaGF2aW9yLCBlc3BlY2lhbGx5IGlmIHRoZXJlJ3MgYW55IGFsbG9jYXRpb24gcHJvZmlsaW5nIGVuYWJsZWQuIE5vdywgbGV0J3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBpbmNsdWRlcywgYnVpbGQgY29uZmlndXJhdGlvbnMsIGFuZCBwcm9qZWN0IHNldHRpbmdzIHRvIG5haWwgZG93biB0aGF0IGRlZmluaXRpb24uIEtub3dpbmcgdGhlIHByZWNpc2UgbG9jYXRpb24gd2lsbCB1bmxvY2sgdGhlIGZ1bGwgY29udGV4dCBvZiBpdHMgdXNhZ2UgYW5kIHdoYXQgZmxhZ3MgZGV0ZXJtaW5lIGl0cyBwcmVzZW5jZS4gVGltZSB0byBwdXQgb24gbXkgZGV0ZWN0aXZlIGhhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTc4NDUsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozNC41ODkzMzc2MDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MTQxODM3MjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE1FTV9BTExPQ19QUk9GSUxJTkdcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzExPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzIzLVxcbm1tL0tjb25maWcuZGVidWc6MzI0OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMjUtXFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzM3LVxcbm1tL0tjb25maWcuZGVidWc6MzM4OmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVFxcbm1tL0tjb25maWcuZGVidWctMzM5LVxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzQyLVxcbm1tL0tjb25maWcuZGVidWc6MzQzOmNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxubW0vS2NvbmZpZy5kZWJ1Zy0zNDQtXFx0Ym9vbCBcXFwiTWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsZXIgZGVidWdnaW5nXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozNi41MDM1MjYxNzhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzE3NTk2NjcwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBEZWJ1ZyBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCB3aGVyZSdzIHRoZSBiZXN0IHBsYWNlIHRvIGRpZyBpbnRvIHRoZXNlIGRlYnVnIG9wdGlvbnM/IE15IGluc3RpbmN0IGlzIHRvIGNoZWNrIGBtbS9LY29uZmlnLmRlYnVnYC4gVGhhdCdzIHVzdWFsbHkgdGhlIGdvLXRvIHNwb3QgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LXJlbGF0ZWQgZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IGFyb3VuZCB0aGUgY29yZSBtZW1vcnkgYXJlYXMuIEknbSBzcGVjaWZpY2FsbHkgYWltaW5nIGFyb3VuZCBsaW5lIDMyNDsgdGhhdCBmZWVscyBsaWtlIGEgbGlrZWx5IHBvaW50IHRvIHN0YXJ0IHVucmF2ZWxpbmcgd2hhdCdzIGVuYWJsZWQgYW5kIGRpc2FibGVkLiBNeSBob3BlIGlzIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB3aGljaCBmZWF0dXJlcyBhcmUgYWN0aXZlIGluIHRoZSBjdXJyZW50IGJ1aWxkIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggZWFjaCBvdGhlciwgcmlnaHQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UuIEkgYW50aWNpcGF0ZSB0aGVyZSdsbCBiZSBjb25kaXRpb25hbCBibG9ja3MgYW5kIHNvbWUgaW50ZXJlc3RpbmcgZGVwZW5kZW5jaWVzIGluIHRoYXQgYXJlYS4gSXQncyB0aW1lIHRvIGdldCBhIGJldHRlciBncmFzcCBvbiB3aGF0IGNhbiBiZSBhZGp1c3RlZCwgYW5kIGhvdyBpdCBpbXBhY3RzIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODI3OCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA5VDExOjUwOjM5LjY3OTQ5NDYxNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDA3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnLmRlYnVnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMyMCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDMyMDpcXHRcXHQgIG92ZXJoZWFkIGluIHRoZSBwYWdlIGZhdWx0IHBhdGguXFxuIDMyMTpcXHRcXG4gMzIyOlxcdFxcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxcbiAzMjM6XFx0XFxuIDMyNDpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzMjU6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZ1xcXCJcXG4gMzI2OlxcdFxcdGRlZmF1bHQgblxcbiAzMjc6XFx0XFx0ZGVwZW5kcyBvbiBNTVVcXG4gMzI4OlxcdFxcdGRlcGVuZHMgb24gUFJPQ19GU1xcbiAzMjk6XFx0XFx0ZGVwZW5kcyBvbiAhREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVXFxuIDMzMDpcXHRcXHRzZWxlY3QgQ09ERV9UQUdHSU5HXFxuIDMzMTpcXHRcXHRzZWxlY3QgUEFHRV9FWFRFTlNJT05cXG4gMzMyOlxcdFxcdHNlbGVjdCBTTEFCX09CSl9FWFRcXG4gMzMzOlxcdFxcdGhlbHBcXG4gMzM0OlxcdFxcdCAgVHJhY2sgYWxsb2NhdGlvbiBzb3VyY2UgY29kZSBhbmQgcmVjb3JkIHRvdGFsIGFsbG9jYXRpb24gc2l6ZVxcbiAzMzU6XFx0XFx0ICBpbml0aWF0ZWQgYXQgdGhhdCBjb2RlIGxvY2F0aW9uLiBUaGUgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIHRvIHRyYWNrXFxuIDMzNjpcXHRcXHQgIG1lbW9yeSBsZWFrcyB3aXRoIGEgbG93IHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgaW1wYWN0LlxcbiAzMzc6XFx0XFxuIDMzODpcXHRjb25maWcgTUVNX0FMTE9DX1BST0ZJTElOR19FTkFCTEVEX0JZX0RFRkFVTFRcXG4gMzM5OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgYnkgZGVmYXVsdFxcXCJcXG4gMzQwOlxcdFxcdGRlZmF1bHQgeVxcbiAzNDE6XFx0XFx0ZGVwZW5kcyBvbiBNRU1fQUxMT0NfUFJPRklMSU5HXFxuIDM0MjpcXHRcXG4gMzQzOlxcdGNvbmZpZyBNRU1fQUxMT0NfUFJPRklMSU5HX0RFQlVHXFxuIDM0NDpcXHRcXHRib29sIFxcXCJNZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxlciBkZWJ1Z2dpbmdcXFwiXFxuIDM0NTpcXHRcXHRkZWZhdWx0IG5cXG4gMzQ2OlxcdFxcdGRlcGVuZHMgb24gTUVNX0FMTE9DX1BST0ZJTElOR1xcbiAzNDc6XFx0XFx0c2VsZWN0IE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUXFxuIDM0ODpcXHRcXHRoZWxwXFxuIDM0OTpcXHRcXHQgIEFkZHMgd2FybmluZ3Mgd2l0aCBoZWxwZnVsIGVycm9yIG1lc3NhZ2VzIGZvciBtZW1vcnkgYWxsb2NhdGlvblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDozOS42Nzk1ODAyNTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkwNjI1NjY5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNZW1vcnkgQWxsb2NhdGlvbiBQcm9maWxpbmc6IFRoZSBDb25maWd1cmF0aW9uIFBhdGgqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgdGhpcyBtZW1vcnkgYWxsb2NhdGlvbiBwcm9maWxpbmcgY29uZmlndXJhdGlvbiwgYW5kIGl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBJdCBsb29rcyBsaWtlIGBNRU1fQUxMT0NfUFJPRklMSU5HYCBpcyB0aGUga2V5LiBUaGF0J3MgdGhlIG1haW4gY29uZmlnIGZsYWcgd2UgbmVlZCB0byBmbGlwIHRvIGdldCB0aGlzIHdob2xlIHRoaW5nIHdvcmtpbmcuIEkgd2FzIGluaXRpYWxseSB3b25kZXJpbmcgaWYgd2UnZCBuZWVkIGBNRU1fQUxMT0NfUFJPRklMSU5HX0VOQUJMRURfQllfREVGQVVMVGAgYXMgd2VsbCwgb3IgaWYgd2UnZCBoYXZlIHRvIHVzZSBgc3lzY3RsYCBvciBhIGJvb3QgcGFyYW1ldGVyLiBCdXQsIGhvbGQgb24uLi4gYE1FTV9BTExPQ19QUk9GSUxJTkdfRU5BQkxFRF9CWV9ERUZBVUxUYCBkZWZhdWx0cyB0byAneScgKmlmKiBgTUVNX0FMTE9DX1BST0ZJTElOR2AgaXMgZW5hYmxlZC4gRXhjZWxsZW50LiBUaGF0IHNpbXBsaWZpZXMgdGhpbmdzIHF1aXRlIGEgYml0LiBKdXN0IHNldHRpbmcgYE1FTV9BTExPQ19QUk9GSUxJTkdgIHNob3VsZCBiZSBzdWZmaWNpZW50LlxuXG5Ob3csIGxldCdzIHNlZSB3aGF0IG5ldyBmdW5jdGlvbmFsaXR5IGlzIGJlaW5nIGludHJvZHVjZWQuIFRpbWUgdG8gY2hlY2sgdGhlIGZvY3VzIHN5bWJvbHMuIExvb2tzIGxpa2Ugd2UgaGF2ZSBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zOiBJIHNlZSBgYWxsb2NpbmZvX2lvY3RsX2dldF9jb250ZW50X2lkYCwgYGFsbG9jaW5mb19pb2N0bF9nZXRfYXRgLCBgYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0YCwgYGFsbG9jaW5mb19pb2N0bGAsIGBhbGxvY2luZm9fY29tcGF0X2lvY3RsYCwgYGFsbG9jaW5mb19vcGVuYCBhbmQgYGFsbG9jaW5mb19yZWxlYXNlYCBmdW5jdGlvbnMuIFRoZXJlJ3MgYWxzbyBgbWF0Y2hlc19maWx0ZXJgLiBHb29kIHRvIGhhdmUgdGhpcyBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkzNCwiT3V0cHV0VG9rZW5zIjoxNDYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wOVQxMTo1MDo0NS41ODU4NDAxNDdaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY1OTgwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNX0FMTE9DX1BST0ZJTElOR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfY29udGVudF9pZFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsX2dldF9hdFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsX2dldF9uZXh0XCIsXG4gICAgXCJhbGxvY2luZm9faW9jdGxcIixcbiAgICBcImFsbG9jaW5mb19jb21wYXRfaW9jdGxcIixcbiAgICBcImFsbG9jaW5mb19vcGVuXCIsXG4gICAgXCJhbGxvY2luZm9fcmVsZWFzZVwiLFxuICAgIFwibWF0Y2hlc19maWx0ZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGlvY3RsIGludGVyZmFjZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcHJvZmlsaW5nIHZpYSAvcHJvYy9hbGxvY2luZm8uIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb25hbCBBUEkgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTV9BTExPQ19QUk9GSUxJTkdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJhbGxvY2luZm9faW9jdGxfZ2V0X2NvbnRlbnRfaWRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfYXRcIixcbiAgICBcImFsbG9jaW5mb19pb2N0bF9nZXRfbmV4dFwiLFxuICAgIFwiYWxsb2NpbmZvX2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fY29tcGF0X2lvY3RsXCIsXG4gICAgXCJhbGxvY2luZm9fb3BlblwiLFxuICAgIFwiYWxsb2NpbmZvX3JlbGVhc2VcIixcbiAgICBcIm1hdGNoZXNfZmlsdGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBpb2N0bCBpbnRlcmZhY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHByb2ZpbGluZyB2aWEgL3Byb2MvYWxsb2NpbmZvLiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uYWwgQVBJIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowhm7pg[1] Phase: Succeeded StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 11:50:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 11:50:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2] Phase: Succeeded StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 11:51:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-09 11:50:58 +0000 UTC FinishedAt: 2026-07-09 11:51:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowhm7pg/series-workflowhm7pg-convert-artifact-3132820745/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-09 11:51:12 +0000 UTC FinishedAt: 2026-07-09 12:23:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-09 11:51:12 +0000 UTC FinishedAt: 2026-07-09 12:23:40 +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:*ae7278de-d533-4851-89a1-357fb80adaa6,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-workflowhm7pg/series-workflowhm7pg-convert-artifact-3132820745/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": "04312eae-8266-4565-b6a6-b94e63eb1e25", "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-workflowhm7pg/series-workflowhm7pg-build-action-3209938407/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-09 11:51:12 +0000 UTC FinishedAt: 2026-07-09 12:23:30 +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:*ae7278de-d533-4851-89a1-357fb80adaa6,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-workflowhm7pg/series-workflowhm7pg-convert-artifact-3132820745/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": "04312eae-8266-4565-b6a6-b94e63eb1e25", "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-workflowhm7pg/series-workflowhm7pg-build-action-3209938407/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-09 12:23:40 +0000 UTC FinishedAt: 2026-07-09 12:23:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-09 12:23:40 +0000 UTC FinishedAt: 2026-07-09 12:23:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-09 12:23:40 +0000 UTC FinishedAt: 2026-07-09 12:23:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-09 12:23:40 +0000 UTC FinishedAt: 2026-07-09 12:23:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowhm7pg/series-workflowhm7pg-convert-artifact-2936868636/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-09 12:23:50 +0000 UTC FinishedAt: 2026-07-09 12:26:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-09 12:23:50 +0000 UTC FinishedAt: 2026-07-09 12:25:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*04312eae-8266-4565-b6a6-b94e63eb1e25,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-workflowhm7pg/series-workflowhm7pg-build-action-3209938407/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-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-09 12:26:00 +0000 UTC FinishedAt: 2026-07-09 12:26:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-09 12:26:00 +0000 UTC FinishedAt: 2026-07-09 12:26:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-09 12:26:00 +0000 UTC FinishedAt: 2026-07-09 12:57:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-09 12:26:00 +0000 UTC FinishedAt: 2026-07-09 12:57:26 +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:*ae7278de-d533-4851-89a1-357fb80adaa6,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-workflowhm7pg/series-workflowhm7pg-convert-artifact-2936868636/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": "e58066e6-affa-422a-9d65-f3a6f88d371c", "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-workflowhm7pg/series-workflowhm7pg-build-action-520270456/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-09 12:26:00 +0000 UTC FinishedAt: 2026-07-09 12:57:16 +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:*ae7278de-d533-4851-89a1-357fb80adaa6,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-workflowhm7pg/series-workflowhm7pg-convert-artifact-2936868636/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": "e58066e6-affa-422a-9d65-f3a6f88d371c", "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-workflowhm7pg/series-workflowhm7pg-build-action-520270456/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-09 12:57:26 +0000 UTC FinishedAt: 2026-07-09 12:57:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-09 12:57:26 +0000 UTC FinishedAt: 2026-07-09 12:57:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-09 12:57:26 +0000 UTC FinishedAt: 2026-07-09 12:59:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-09 12:57:26 +0000 UTC FinishedAt: 2026-07-09 12:59:19 +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:*e58066e6-affa-422a-9d65-f3a6f88d371c,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-workflowhm7pg/series-workflowhm7pg-build-action-520270456/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-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +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"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},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:*04312eae-8266-4565-b6a6-b94e63eb1e25,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e58066e6-affa-422a-9d65-f3a6f88d371c,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-workflowhm7pg/series-workflowhm7pg-build-action-3209938407/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-workflowhm7pg/series-workflowhm7pg-build-action-520270456/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 13:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 12:59:52 +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"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},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-workflowhm7pg/series-workflowhm7pg-convert-artifact-2129031141/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 12:59:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 12:59:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-09 12:59:29 +0000 UTC FinishedAt: 2026-07-09 12:59:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-09 13:00:00 +0000 UTC FinishedAt: 2026-07-09 16:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhm7pg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["allocinfo_ioctl_get_content_id","allocinfo_ioctl_get_at","allocinfo_ioctl_get_next","allocinfo_ioctl","allocinfo_compat_ioctl","allocinfo_open","allocinfo_release","matches_filter"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d11ba1f570615ec8d4814d6313ee1d7075a33787","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEM_ALLOC_PROFILING"],"series_id":"f0a980a1-efc1-4beb-87b1-580ef7152ac0","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-09 13:00:00 +0000 UTC FinishedAt: 2026-07-09 16:01:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*04312eae-8266-4565-b6a6-b94e63eb1e25,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e58066e6-affa-422a-9d65-f3a6f88d371c,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-workflowhm7pg/series-workflowhm7pg-build-action-3209938407/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-workflowhm7pg/series-workflowhm7pg-build-action-520270456/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-workflowhm7pg/series-workflowhm7pg-convert-artifact-2129031141/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,}