Name: series-workflowz5fkg Phase: Succeeded StartedAt: 2026-08-11 13:00:24 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[0] Phase: Succeeded StartedAt: 2026-08-11 13:00:24 +0000 UTC FinishedAt: 2026-08-11 13:08:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[0].run-triage Phase: Succeeded StartedAt: 2026-08-11 13:00:24 +0000 UTC FinishedAt: 2026-08-11 13:08:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "005d5c898c17ecadec427819a20640e37c357997", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "005d5c898c17ecadec427819a20640e37c357997", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "13d7292c-6e76-4e1c-b00d-700ba9e0fed5" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "madvise_collapse", "hugepage_madvise" ], "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+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICAgJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTgxODY2NzBkYTI2MzQwZWFhNWRiNGI1NDNkOWMxODJkMzYzNWY2NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDExIDEzOjA0OjA1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcJiMzNDthbHdheXNcJiMzNDsgb3IgXCYjMzQ7bWFkdmlzZVwmIzM0OyksIGFuZCBpdCYjMzk7bGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXCYjMzQ7bmV2ZXJcJiMzNDspXG4mIzQzO3RvcC1sZXZlbCBjb250cm9sIGFyZSBcJiMzNDtuZXZlclwmIzM0OykuXG4gXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuQEAgLTMwMSw3ICYjNDM7MzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcbiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbiYjNDM7UGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcbiYjNDM7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVx1MDAzY3NpemVcdTAwM2VrQi9zdGF0cy8pOjpcbiBcbiBcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXG4gXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4mIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4mIzQzO1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4mIzQzO1x0UFRFX0NIRUNLX0ZBSUwsXG4mIzQzO1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuJiM0Mzt9O1xuJiM0MztcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuJiM0MztcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgbm9uZV9vcl96ZXJvO1xuJiM0MztcdGludCBzaGFyZWQ7XG4mIzQzO1x0aW50IHVubWFwcGVkO1xuJiM0MztcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4mIzQzO307XG4mIzQzO1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuJiM0MztcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4mIzQzO1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICYjNDM7NjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXG4mIzQzOyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGV2YWwpXG4mIzQzO3tcbiYjNDM7XHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdC8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi9cbiYjNDM7XHRyZXR1cm4gcHRlX3lvdW5nKHB0ZXZhbCkgfHwgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXG4mIzQzO1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbiYjNDM7XHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbiYjNDM7XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxuJiM0MzsgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxuJiM0MztcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4mIzQzO3tcbiYjNDM7XHRjdHgtXHUwMDNlcmVzdWx0ID0gcmVzdWx0O1xuJiM0MztcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbiYjNDM7ICpcbiYjNDM7ICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4mIzQzOyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4mIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlXG4mIzQzOyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbiYjNDM7ICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuJiM0MzsgKlxuJiM0MzsgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuJiM0MzsgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4mIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuJiM0MztcdFx0aWYgKCYjNDM7JiM0MztjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4mIzQzO1x0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXG4mIzQzO1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbiYjNDM7XHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4mIzQzO1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuJiM0MztcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbiYjNDM7XG4mIzQzO1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbiYjNDM7XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbiYjNDM7XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuJiM0MztcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuJiM0MztcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4mIzQzO1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbiYjNDM7XHRcdC5jYyA9IGNjLFxuJiM0MztcdFx0LnZtYSA9IHZtYSxcbiYjNDM7XHRcdC5vcmRlciA9IG9yZGVyLFxuJiM0MztcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbiYjMzk7dCBjaGVjayBzd2FwIFBURXMgKi9cbiYjNDM7XHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4mIzQzO1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICYjNDM7IG5yX3BhZ2VzO1xuIFx0ICAgICBfcHRlJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4tXHRcdHB0ZV90IHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4mIzQzO1x0XHRwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbiYjNDM7XHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbiYjNDM7XHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuLVx0XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuLVx0XHRcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcbi1cdFx0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseVxuIFx0XHQgKiB3YW50IHRvIGNvbGxhcHNlLlxuQEAgLTc1OSw4ICYjNDM7ODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4mIzQzO1x0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xuJiM0MztcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyAmIzQzOzg5Miw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdH1cbiBcbiBcdFx0Lypcbi1cdFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXG4mIzQzO1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCAmIzQzOzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuJiM0MztcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiYjNDM7XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4mIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4mIzQzO1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiYjNDM7XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuJiM0MztcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICYjNDM7MTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4mIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICYjNDM7MTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4mIzQzO1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4mIzQzO1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuJiM0MztcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4mIzQzO1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbiYjNDM7XHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4mIzQzO1x0aWYgKGFub25fdm1hX2xvY2tlZClcbiYjNDM7XHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiAmIzQzOzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbiYjNDM7XHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4mIzQzO1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4mIzQzO1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7dW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiYjNDM7XHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuJiM0MztcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbiYjNDM7XHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuIFx0XHQgICAoIXJlZmVyZW5jZWQgfHxcbi1cdFx0ICAgICh1bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4mIzQzO1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiAmIzQzOzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gb3V0X3VubWFwOlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XG4gXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xuLVx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4mIzQzO1x0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbiBcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHRcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4mIzQzO1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbiYjNDM7XHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuIFxuQEAgLTI2OTEsOCAmIzQzOzI3MTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRwcmVzZW50ID0gMDtcbiBcdHN3YXAgPSAwO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7XG4gXHRcdGlmICh4YXNfcmV0cnkoXHUwMDI2eGFzLCBmb2xpbykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICAgJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGluIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCB0byBwYXNzIHN0YXRlIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgdGhlIGhlbHBlci4gVGhlIHBhdGNoIGFsc28gYWRkcyBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyLiBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIGNvcmUga2VybmVsIGxvZ2ljLCBzcGVjaWZpY2FsbHkgaW4gdGhlIFRyYW5zcGFyZW50IEh1Z2VQYWdlcyAoVEhQKSBzdWJzeXN0ZW0uIFRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZSwgZWl0aGVyIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gb3IgbWFudWFsbHkgdmlhIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxMSAxMzowNDowNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAppbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CkBAIC0yMjQsNyAmIzQzOzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZAogKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0CiB0byAmIzM0O2Fsd2F5cyYjMzQ7IG9yICYjMzQ7bWFkdmlzZSYjMzQ7KSwgYW5kIGl0JiMzOTtsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW4KIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlCi10b3AtbGV2ZWwgY29udHJvbCBhcmUgJiMzNDtuZXZlciYjMzQ7KQomIzQzO3RvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspLgogCiBwcm9jZXNzIFRIUCBjb250cm9scwogLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMSw3ICYjNDM7MzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZQogaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSwKIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci4KIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLAotYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OgomIzQzO2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuCiYjNDM7UGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXIKJiM0Mzsvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtJmx0O3NpemUmZ3Q7a0Ivc3RhdHMvKTo6CiAKIAkvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZAogCmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmMKaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDQKLS0tIGEvbW0va2h1Z2VwYWdlZC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2todWdlcGFnZWQuYwpAQCAtNjUsNiAmIzQzOzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQgewogCVNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssCiB9OwogCiYjNDM7ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHsKJiM0MzsJUFRFX0NIRUNLX1NVQ0NFRUQsCiYjNDM7CVBURV9DSEVDS19GQUlMLAomIzQzOwlQVEVfQ0hFQ0tfQ09OVElOVUUsCiYjNDM7fTsKJiM0MzsKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgJmx0O3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oJmd0OwogCkBAIC0xMTksNiAmIzQzOzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7CiAJREVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwogfTsKIAomIzQzO3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7CiYjNDM7CXN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYzsKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiYjNDM7CXVuc2lnbmVkIGludCBvcmRlcjsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IG5vbmVfb3JfemVybzsKJiM0MzsJaW50IHNoYXJlZDsKJiM0MzsJaW50IHVubWFwcGVkOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkOwomIzQzO307CiYjNDM7CiAvKioKICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nCiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhbgpAQCAtNjIwLDcgJiM0Mzs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogCQkvKgogCQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0CiAJCSAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1bgotCQkgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGwKJiM0MzsJCSAqIHVuZGVyIG1tYXBfbG9jayByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGwKIAkJICogcGFnZXRhYmxlcyB3aWxsIGJlIGRlc3Ryb3llZCkgdW50aWwga2h1Z2VwYWdlZCBoYXMgZmluaXNoZWQKIAkJICogd29ya2luZyBvbiB0aGUgcGFnZXRhYmxlcyB1bmRlciB0aGUgbW1hcF9sb2NrLgogCQkgKi8KQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJfQogfQogCiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKQomIzQzO3sKJiM0MzsJbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7CiYjNDM7CW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAlub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLApAQCAtNjY1LDc2ICYjNDM7NjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSwKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIHJlY2VudCBhY2Nlc3Mgd2FzIG9ic2VydmVkIHRocm91Z2ggZWl0aGVyIHRoZSBmb2xpbyBzdGF0ZQomIzQzOyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19wdGVfcmVmZXJlbmNlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRldmFsKQomIzQzO3sKJiM0MzsJLyogVGhlIGZvbGlvIHdhcyByZWZlcmVuY2VkIHByZXZpb3VzbHkgLi4uICovCiYjNDM7CWlmIChmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fCBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CS8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi8KJiM0MzsJcmV0dXJuIHB0ZV95b3VuZyhwdGV2YWwpIHx8IG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCwKJiM0MzsJCWVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudCkKJiM0Mzt7CiYjNDM7CWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQomIzQzOwkJY291bnRfdm1fZXZlbnQodm1fZXZlbnQpOwomIzQzOwljb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kCiYjNDM7ICogcmV0dXJuIFBURV9DSEVDS19GQUlMLgomIzQzOyAqLwomIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsCiYjNDM7CQllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCkKJiM0Mzt7CiYjNDM7CWN0eC0mZ3Q7cmVzdWx0ID0gcmVzdWx0OwomIzQzOwlyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UKJiM0MzsgKgomIzQzOyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgomIzQzOyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkCiYjNDM7ICogLSB1ZmZkIGlzIG5vdCBhY3RpdmUKJiM0MzsgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50CiYjNDM7ICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudAomIzQzOyAqCiYjNDM7ICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnQKJiM0MzsgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsCiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsCiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KQomIzQzO3sKJiM0MzsJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O25vbmVfb3JfemVybyAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfbm9uZSkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewomIzQzOwkJaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpOwomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O3VubWFwcGVkICZndDsgY3R4LSZndDttYXhfcHRlc19zd2FwKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZAomIzQzOwkgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkCiYjNDM7CSAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGUKJiM0MzsJICogcmVnaXN0ZXJlZCByYW5nZS4KJiM0MzsJICovCiYjNDM7CWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CiYjNDM7CWN0eC0mZ3Q7Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LSZndDt2bWEsIGFkZHIsIHB0ZXZhbCk7CiYjNDM7CWlmICh1bmxpa2VseSghY3R4LSZndDtmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LSZndDtmb2xpbykpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCiYjNDM7CSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KJiM0MzsJICovCiYjNDM7CWlmIChjdHgtJmd0O2NjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgIShjdHgtJmd0O3ZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC0mZ3Q7Zm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSwgY3R4LSZndDtmb2xpbyk7CiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgomIzQzOwkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCiYjNDM7CQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCiYjNDM7CQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtzaGFyZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3NoYXJlZCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU0hBUkVEX1BURSk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19TVUNDRUVEOwomIzQzO30KJiM0MzsKIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLAogCQl1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KQogewotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7Ci0JcHRlX3QgKl9wdGU7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwomIzQzOwlwdGVfdCAqX3B0ZSwgcHRldmFsOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiAJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBvcmRlciwKJiM0MzsJCS51bm1hcHBlZCA9IC0xLCAvKiBkb24mIzM5O3QgY2hlY2sgc3dhcCBQVEVzICovCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLAomIzQzOwl9OwogCiAJZm9yIChfcHRlID0gcHRlOyBfcHRlICZsdDsgcHRlICYjNDM7IG5yX3BhZ2VzOwogCSAgICAgX3B0ZSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewotCQlwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTsKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChwdGVfdWZmZChwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQkJVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7Ci0KLQkJLyoKLQkJICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbAotCQkgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7Ci0JCSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSAmYW1wOyZhbXA7ICFwdGVfZGlydHkocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFOwomIzQzOwkJcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHsKJiM0MzsJCQlyZXN1bHQgPSBjdHgucmVzdWx0OwogCQkJZ290byBvdXQ7CiAJCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCi0JCS8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqLwotCQlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHsKLQkJCS8qCi0JCQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgotCQkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCi0JCQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCi0JCQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCi0JCQkgKi8KLQkJCWlmICgmIzQzOyYjNDM7c2hhcmVkICZndDsgbWF4X3B0ZXNfc2hhcmVkKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTsKLQkJCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9CiAJCS8qCiAJCSAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJiMzOTtkIGFjdHVhbGx5CiAJCSAqIHdhbnQgdG8gY29sbGFwc2UuCkBAIC03NTksOCAmIzQzOzg2NSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAkJLyoKIAkJICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZQotCQkgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9jawotCQkgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlCiYjNDM7CQkgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9jawomIzQzOwkJICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpCiAJCSAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS4KIAkJICovCiAJCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHsKQEAgLTc4Niw3ICYjNDM7ODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJfQogCiAJCS8qCi0JCSAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZQomIzQzOwkJICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlCiAJCSAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHsKQEAgLTgwMywxNCAmIzQzOzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKIAkJCWxpc3RfYWRkX3RhaWwoJmFtcDtmb2xpby0mZ3Q7bHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7CiBuZXh0OgotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCiAJCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAKQEAgLTgxOCwxMyAmIzQzOzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOwogCX0gZWxzZSB7CiAJCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKLQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybywKJiM0MzsJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIG91dDoKIAlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKLQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybywKIAkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC05MDQsNyAmIzQzOzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLAogCSAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlCiAJICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmcKIAkgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSwKLQkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS4KJiM0MzsJICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS4KIAkgKi8KIAlwbWRfcHRsID0gcG1kX2xvY2sodm1hLSZndDt2bV9tbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUodm1hLSZndDt2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpOwpAQCAtMTA3OCw5ICYjNDM7MTE3OCw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsCiAJCXJldHVybiBTQ0FOX1ZNQV9DSEVDSzsKIAkvKgogCSAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlbgotCSAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFxdWlyZWQgdGhlIG1tYXBfbG9jay4KJiM0MzsJICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay4KIAkgKgotCSAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlCiYjNDM7CSAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKIAkgKiB2bWFzLgogCSAqLwogCWlmIChleHBlY3RfYW5vbiAmYW1wOyZhbXA7ICghKCp2bWFwKS0mZ3Q7YW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSkKQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIC8qCiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLgotICogT25seSBkb25lIGlmIGtodWdlcGFnZWRfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS4KJiM0MzsgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgogICoKICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2UKICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdApAQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJcHRlID0gTlVMTDsKIAogCQkvKgotCQkgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KJiM0MzsJCSAqIGRvX3N3YXBfcGFnZSgpIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suCiAJCSAqIE5vdGUgd2UgdHJlYXQgVk1fRkFVTFRfUkVUUlkgYXMgVk1fRkFVTFRfRVJST1IgaGVyZSBiZWNhdXNlCiAJCSAqIHdlIGRvIG5vdCByZXRyeSBoZXJlIGFuZCBzd2FwIGVudHJ5IHdpbGwgcmVtYWluIGluIHBhZ2V0YWJsZQogCQkgKiByZXN1bHRpbmcgaW4gbGF0ZXIgZmFpbHVyZS4KQEAgLTEyNDcsMTUgJiM0MzsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1CiAJZm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsICZhbXA7Y2MtJmd0O2FsbG9jX25tYXNrKTsKIAlpZiAoIWZvbGlvKSB7CiAJCSpmb2xpb3AgPSBOVUxMOwotCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpOwotCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpOwomIzQzOwkJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsCiYjNDM7CQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiAJCXJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOwogCX0KIAotCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpOwotCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKJiM0MzsJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKIAogCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7CiAJCWZvbGlvX3B1dChmb2xpbyk7CkBAIC0xMjcxLDcgJiM0MzsxMzY4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIH0KIAogLyoKLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZAomIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrCiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi4KICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uCkBAIC0xMzE4LDcgJiM0MzsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCWlmICh1bm1hcHBlZCkgewogCQkvKgotCQkgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKJiM0MzsJCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbigpIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrCiAJCSAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpbgogCQkgKiB0aGF0IGNhc2UuICBDb250aW51aW5nIHRvIGNvbGxhcHNlIGNhdXNlcyBpbmNvbnNpc3RlbmN5LgogCQkgKi8KQEAgLTEzMzEsOCAmIzQzOzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCS8qCiAJICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0JICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNCi0JICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLgomIzQzOwkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTQomIzQzOwkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IGZvbGlvIGxvY2suCiAJICoKIAkgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGUKIAkgKiBtbWFwX2xvY2suCkBAIC0xMzg5LDkgJiM0MzsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAkJc3Bpbl9sb2NrKHBtZF9wdGwpOwogCQlWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTsKIAkJLyoKLQkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmcKJiM0MzsJCSAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmcKIAkJICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXQKLQkJICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdAomIzQzOwkJICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSgpIGZvciB0aGF0CiAJCSAqLwogCQlwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpOwogCQlzcGluX3VubG9jayhwbWRfcHRsKTsKQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQkJc3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCW1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkciwKLQkJCQkJICAvKnVmZmRfd3A9Ki8gZmFsc2UpOwomIzQzOwkJCQkJICAvKnVmZmQ9Ki8gZmFsc2UpOwogCQlpZiAocHRlX3B0bCAhPSBwbWRfcHRsKQogCQkJc3Bpbl91bmxvY2socHRlX3B0bCk7CiAJfQpAQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKIG91dF91cF93cml0ZToKLQlpZiAoYW5vbl92bWFfbG9ja2VkKQotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJaWYgKHB0ZSkKIAkJcHRlX3VubWFwKHB0ZSk7CiYjNDM7CWlmIChhbm9uX3ZtYV9sb2NrZWQpCiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJbW1hcF93cml0ZV91bmxvY2sobW0pOwogb3V0X25vbG9jazoKIAlpZiAoZm9saW8pCkBAIC0xNTkzLDQyICYjNDM7MTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKIAkJYm9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7Ci0JdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7CiAJZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7CiAJaW50IGk7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwotCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVyczsKIAlzcGlubG9ja190ICpwdGw7Ci0JaW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDsKJiM0MzsJaW50IG5vZGUgPSBOVU1BX05PX05PREU7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiAKIAlWTV9CVUdfT04oc3RhcnRfYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spOwogCiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksCiYjNDM7CX07CiYjNDM7CiAJcmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsICZhbXA7cG1kKTsKIAlpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkgewogCQljYy0mZ3Q7cHJvZ3Jlc3MmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAKLQliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwotCW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwotCW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTsKIAogCWVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLSZndDt2bV9mbGFncywgdHZhX2ZsYWdzKTsKIAogCS8qCiAJICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlCi0JICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4KJiM0MzsJICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcAomIzQzOwkgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci4KIAkgKi8KIAlpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpCi0JCW1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwomIzQzOwkJY3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCAmYW1wO3B0bCk7CiAJaWYgKCFwdGUpIHsKQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mzt1bm1hcHBlZCAmZ3Q7IG1heF9wdGVzX3N3YXApIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJLyoKLQkJCSAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwCi0JCQkgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWUKLQkJCSAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuCi0JCQkgKi8KLQkJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCS8qCi0JCQkgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbAotCQkJICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uCi0JCQkgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhcwotCQkJICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpcwotCQkJICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd24KLQkJCSAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2YKLQkJCSAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLgotCQkJICovCi0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHsKJiM0MzsJCQlyZXN1bHQgPSBjdHgucmVzdWx0OwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KLQotCQlpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQCi0JCSAqIGlzIHNoYXJlZC4KLQkJICovCi0JCWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkgewotCQkJaWYgKCYjNDM7JiM0MztzaGFyZWQgJmd0OyBtYXhfcHRlc19zaGFyZWQpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAogCQkvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqLwogCQlfX3NldF9iaXQoaSwgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzKTsKQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuCiAJCSAqCi0JCSAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OgotCQkgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgJmd0OyBmb2xpb19yZWZfY291bnQoKS4KLQkJICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlCi0JCSAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlCi0JCSAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVjawotCQkgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgomIzQzOwkJICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kCiYjNDM7CQkgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZQomIzQzOwkJICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy4KIAkJICovCiAJCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHsKIAkJCXJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9CiAKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwogCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCSAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4MSwxNiAmIzQzOzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiBvdXRfdW5tYXA6CiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJaWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHsKLQkJLyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqLwomIzQzOwkJLyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiAJCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCQlyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLAotCQkJCSAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKJiM0MzsJCQkJICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKIAkJLyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqLwogCQkqbG9ja19kcm9wcGVkID0gdHJ1ZTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsCi0JCQkJICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpOwomIzQzOwkJCQkgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjkxLDggJiM0MzsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJcHJlc2VudCA9IDA7CiAJc3dhcCA9IDA7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCXJjdV9yZWFkX2xvY2soKTsKIAl4YXNfZm9yX2VhY2goJmFtcDt4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7CiAJCWlmICh4YXNfcmV0cnkoJmFtcDt4YXMsIGZvbGlvKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTExNDUKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLaHVnZXBhZ2VkIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbW0va2h1Z2VwYWdlZC5jYC4gSXQgc2VlbXMgdGhleSYjMzk7dmUgcmVvcmdhbml6ZWQgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAuIFRoZXkmIzM5O3ZlIGNsZXZlcmx5IGV4dHJhY3RlZCB0aGlzIGxvZ2ljIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBHb29kIG1vdmUg4oCTIGtlZXBzIHRoaW5ncyBjbGVhbmVyIGFuZCBtb3JlIG1vZHVsYXIuIFRoZXkmIzM5O3ZlIGFsc28gaW50cm9kdWNlZCBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYXJvdW5kLiBUaGF0IG1ha2VzIGEgbG90IG9mIHNlbnNlLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHRoaXMga2luZCBvZiBpbnRyaWNhdGUgUFRFIG1hbmlwdWxhdGlvbi4KCkFuZCBhaCwgdGhlcmUmIzM5O3MgYSBuZXcgaGVscGVyLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcsIHByb2JhYmx5IHNpbXBsaWZpZXMgc29tZSBjaGVja3MuIE5vdywgdGhlIG1lYXQgb2YgaXQ6IHRoZXkmIzM5O3ZlIHN3aXRjaGVkIGZyb20gYHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSgpYCB0byBgZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oKWAgd2l0aGluIHRoYXQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBmdW5jdGlvbi4gV2FpdCBhIHNlY29uZC4uLiBgdm1fbm9ybWFsX2ZvbGlvKClgPyBJIHRob3VnaHQgd2Ugd2VyZSBzdGlsbCB1c2luZyBgdm1fbm9ybWFsX3BhZ2UoKWAgaW4gc29tZSBwbGFjZXMuIExldCYjMzk7cyBtYWtlIHN1cmUgdGhhdCBmdW5jdGlvbiBhY3R1YWxseSAqZXhpc3RzKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFRpbWUgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgY29uZmlybS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIGlzIHRydWx5IGEgc3RyYWlnaHRmb3J3YXJkIHJlZmFjdG9yLCBvciBpZiB0aGVyZSYjMzk7cyBzb21ldGhpbmcgZWxzZSBnb2luZyBvbiBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtX25vcm1hbF9mb2xpbyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9wcm9jL3Rhc2tfbW11LmM9MTY5MD1zdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3Bpbm5lZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGUpXG4tLVxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXHRcdHJldHVybiBmYWxzZTtcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGUpO1xuZnMvcHJvYy90YXNrX21tdS5jLTE3MDEtXHRpZiAoIWZvbGlvKVxuLS1cbmZzL3Byb2MvdGFza19tbXUuYz0xNzcwPXN0YXRpYyBpbnQgY2xlYXJfcmVmc19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbmZzL3Byb2MvdGFza19tbXUuYy0xODE1LVxuZnMvcHJvYy90YXNrX21tdS5jOjE4MTY6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xuZnMvcHJvYy90YXNrX21tdS5jLTE4MTctXHRcdGlmICghZm9saW8pXG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNC1cbmluY2x1ZGUvbGludXgvbW0uaDozMjA1OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNi1cdFx0XHQgICAgIHB0ZV90IHB0ZSk7XG5pbmNsdWRlL2xpbnV4L21tLmg9MzIwNz1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbmluY2x1ZGUvbGludXgvbW0uaC0zMjA4LVx0XHRcdCAgICAgcHRlX3QgcHRlKTtcbmluY2x1ZGUvbGludXgvbW0uaDozMjA5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvbW0uaC0zMjEwLVx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZCk7XG4tLVxubW0vZGFtb24vdmFkZHIuYz0zODk9c3RhdGljIGludCBkYW1vbl95b3VuZ19wbWRfZW50cnkocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVx0XHRcdGdvdG8gaHVnZV9vdXQ7XG5tbS9kYW1vbi92YWRkci5jOjQwNTpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXHUwMDNldm1hLCBhZGRyLCBwbWRlKTtcbm1tL2RhbW9uL3ZhZGRyLmMtNDA2LVx0XHRpZiAoIWZvbGlvKVxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVx0XHRnb3RvIG91dDtcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9kYW1vbi92YWRkci5jLTY1My1cdFx0XHRnb3RvIGh1Z2Vfb3V0O1xubW0vZGFtb24vdmFkZHIuYzo2NTQ6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTY1NS1cdFx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jLTY3Ni1cdFx0XHRjb250aW51ZTtcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xubW0vZGFtb24vdmFkZHIuYy02NzgtXHRcdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYz03OTU9c3RhdGljIGludCBkYW1vc192YV9zdGF0X3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZGFtb24vdmFkZHIuYy04MTQtXG5tbS9kYW1vbi92YWRkci5jOjgxNTpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTgxNi1cbi0tXG5tbS9kYW1vbi92YWRkci5jLTgzOS1cbm1tL2RhbW9uL3ZhZGRyLmM6ODQwOlx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtODQxLVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MjI3OD12bV9mYXVsdF90IGRvX2h1Z2VfcG1kX251bWFfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXG5tbS9odWdlX21lbW9yeS5jOjIzMDg6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpb19wbWQodm1hLCBoYWRkciwgcG1kKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cdGlmICghZm9saW8pXG4tLVxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0yNDY1LVx0aWYgKGlzX3ByZXNlbnQpXG5tbS9odWdlX21lbW9yeS5jOjI0NjY6XHRcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjQ2Ny1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNzc3LVxubW0va2h1Z2VwYWdlZC5jOjc3ODpcdGN0eC1cdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xubW0va2h1Z2VwYWdlZC5jLTc3OS1cdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbi0tXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuLS1cbm1tL2tzbS5jLTYzOC1cdFx0aWYgKHB0ZV9wcmVzZW50KHB0ZSkpIHtcbm1tL2tzbS5jOjYzOTpcdFx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcHRlKTtcbm1tL2tzbS5jLTY0MC1cdFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xuLS1cbm1tL21hZHZpc2UuYz0zNTM9c3RhdGljIGludCBtYWR2aXNlX2NvbGRfb3JfcGFnZW91dF9wdGVfcmFuZ2UocG1kX3QgKnBtZCxcbi0tXG5tbS9tYWR2aXNlLmMtNDc1LVxubW0vbWFkdmlzZS5jOjQ3NjpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XG5tbS9tYWR2aXNlLmMtNDc3LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWFkdmlzZS5jLTcwNC1cbm1tL21hZHZpc2UuYzo3MDU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWFkdmlzZS5jLTcwNi1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtb3J5LmM9ODI0PXN0cnVjdCBwYWdlICp2bV9ub3JtYWxfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTgzMy0vKipcbm1tL21lbW9yeS5jOjgzNDogKiB2bV9ub3JtYWxfZm9saW8oKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IGZvbGlvXCYjMzQ7IGFzc29jaWF0ZWQgd2l0aCBhIFBURVxubW0vbWVtb3J5LmMtODM1LSAqIEB2bWE6IFRoZSBWTUEgbWFwcGluZyB0aGUgQHB0ZS5cbi0tXG5tbS9tZW1vcnkuYy04NDQtICovXG5tbS9tZW1vcnkuYzo4NDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL21lbW9yeS5jLTg0Ni1cdFx0XHQgICAgcHRlX3QgcHRlKVxuLS1cbm1tL21lbW9yeS5jPTg2OD1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtODc3LS8qKlxubW0vbWVtb3J5LmM6ODc4OiAqIHZtX25vcm1hbF9mb2xpb19wbWQoKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IGZvbGlvXCYjMzQ7IGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxubW0vbWVtb3J5LmMtODc5LSAqIEB2bWE6IFRoZSBWTUEgbWFwcGluZyB0aGUgQHBtZC5cbi0tXG5tbS9tZW1vcnkuYy04ODgtICovXG5tbS9tZW1vcnkuYzo4ODk6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW9fcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vbWVtb3J5LmMtODkwLVx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcbi0tXG5tbS9tZW1vcnkuYz02Mjg5PXN0YXRpYyB2bV9mYXVsdF90IGRvX251bWFfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy02MzI0LVxubW0vbWVtb3J5LmM6NjMyNTpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVx1MDAzZWFkZHJlc3MsIHB0ZSk7XG5tbS9tZW1vcnkuYy02MzI2LVx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtcG9saWN5LmM9Njg3PXN0YXRpYyBpbnQgcXVldWVfZm9saW9zX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtcG9saWN5LmMtNzIzLVx0XHR9XG5tbS9tZW1wb2xpY3kuYzo3MjQ6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWVtcG9saWN5LmMtNzI1LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tZW1wb2xpY3kuYy03MjktXHRcdC8qXG5tbS9tZW1wb2xpY3kuYzo3MzA6XHRcdCAqIHZtX25vcm1hbF9mb2xpbygpIGZpbHRlcnMgb3V0IHplcm8gcGFnZXMsIGJ1dCB0aGVyZSBtaWdodFxubW0vbWVtcG9saWN5LmMtNzMxLVx0XHQgKiBzdGlsbCBiZSByZXNlcnZlZCBmb2xpb3MgdG8gc2tpcCwgcGVyaGFwcyBpbiBhIFZEU08uXG4tLVxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21sb2NrLmMtMzg3LVx0XHRcdGNvbnRpbnVlO1xubW0vbWxvY2suYzozODg6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWxvY2suYy0zODktXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21yZW1hcC5jPTE3OD1zdGF0aWMgaW50IG1yZW1hcF9mb2xpb19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tcmVtYXAuYy0xODktXG5tbS9tcmVtYXAuYzoxOTA6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZSk7XG5tbS9tcmVtYXAuYy0xOTEtXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTEyOTQtXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcbm1tL3VzZXJmYXVsdGZkLmMtMTI5Ni1cdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MTUwMT1zdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE2MTctXG5tbS91c2VyZmF1bHRmZC5jOjE2MTg6XHRcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XG5tbS91c2VyZmF1bHRmZC5jLTE2MTktXHRcdFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDQ3MwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDIyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFByb3Bvc2VkIEtIVUdFUEFHRUQgUmVmYWN0b3JpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgdGhpcyBwYXRjaCBpbnZvbHZlcyBhIHN0YW5kYXJkIGZ1bmN0aW9uLCBgdm1fbm9ybWFsX2ZvbGlvKClgLCB3aGljaCwgaWYgSSByZWNhbGwgY29ycmVjdGx5LCByZXNpZGVzIGluIGBtbS9tZW1vcnkuY2AuIEl0IGxvb2tzIGxpa2UgdGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2UgbGllcyBpbiByZWZhY3RvcmluZyBga2h1Z2VwYWdlZC5jYC4gVGhlIGdvYWwgaXMgdG8gY29uc29saWRhdGUgUFRFIChQYWdlIFRhYmxlIEVudHJ5KSBjaGVja2luZyBsb2dpYywgc3BlY2lmaWNhbGx5IGJldHdlZW4gdGhlIGZ1bmN0aW9ucyBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZGAuIEEgbmV3IGZ1bmN0aW9uLCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLCBpcyBiZWluZyBpbnRyb2R1Y2VkLiBUaGlzIGlzIGludGVyZXN0aW5nLCBhcyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RhdHVzLCBvbmUgb2Y6IGBQVEVfQ0hFQ0tfU1VDQ0VFRGAsIGBQVEVfQ0hFQ0tfRkFJTGAsIG9yIGBQVEVfQ0hFQ0tfQ09OVElOVUVgLCBhcyB3ZWxsIGFzIGEgZnVuY3Rpb24sIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYC4KClRoZSBpbXBsaWNhdGlvbnMgYXJlIGNsZWFyOiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0b3VjaGluZyBjcml0aWNhbCBrZXJuZWwgbG9naWMgd2l0aGluIGBtbS9raHVnZXBhZ2VkLmNgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMsIGlzIHRoaXMgZnVuY3Rpb25hbGl0eSBldmVuICpyZWFjaGFibGUqPyBZZXMsIG9mIGNvdXJzZS4gYGtodWdlcGFnZWRgIGlzIHRoZSBiYWNrYm9uZSBvZiBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIEl0JiMzOTtzIHRoZSBiYWNrZ3JvdW5kIGRhZW1vbiB0aGF0IGFjdGl2ZWx5IHNjYW5zIG1lbW9yeSBhbmQgY29uc29saWRhdGVzIHNtYWxsZXIgcGFnZXMgaW50byBodWdlIHBhZ2VzLiBUaGlzIGlzIHRyaWdnZXJlZCBieSBhIGNhbGwgdG8gYG1hZHZpc2UoTUFEVl9IVUdFUEFHRSlgIG9yIGNhbiBydW4gYXV0b21hdGljYWxseSBpZiBUSFAgaXMgZW5hYmxlZC4gSXQmIzM5O3Mgc2FmZSB0byBzYXkgdGhlc2UgY2hhbmdlcyBkZWZpbml0ZWx5IGhhdmUgYSBmdW5jdGlvbmFsIGltcGFjdC4gSSBuZWVkIHRvIGRpdmUgaW50byBga2h1Z2VwYWdlZC5jYCBpdHNlbGYuIEkgbmVlZCB0byBpZGVudGlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIG1vc3QgcmVsZXZhbnQgdG8gbXkgcmV2aWV3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzIzPXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTczMC0vKlxubW0va2h1Z2VwYWdlZC5jOjczMTogKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxubW0va2h1Z2VwYWdlZC5jLTczMi0gKlxuLS1cbm1tL2todWdlcGFnZWQuYy03MzktICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbm1tL2todWdlcGFnZWQuYzo3NDA6ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXG5tbS9raHVnZXBhZ2VkLmMtNzQxLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc0NS0gKi9cbm1tL2todWdlcGFnZWQuYzo3NDY6c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxubW0va2h1Z2VwYWdlZC5jLTc0Ny1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbi0tXG5tbS9raHVnZXBhZ2VkLmM9ODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTgzNC1cdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG5tbS9raHVnZXBhZ2VkLmM6ODM1Olx0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xubW0va2h1Z2VwYWdlZC5jLTgzNi1cdFx0Zm9saW8gPSBjdHguZm9saW87XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE3NDgtXG5tbS9raHVnZXBhZ2VkLmM6MTc0OTpcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbm1tL2todWdlcGFnZWQuYy0xNzUwLVx0XHRmb2xpbyA9IGN0eC5mb2xpbztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU1OAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIENvcmUgTG9naWMgQ2hhbmdlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoZXNlIG1vZGlmaWNhdGlvbnMuIExvb2tzIGxpa2UgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIHNlZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5JiMzOTtyZSBub3cgZW1wbG95aW5nIGBjb2xsYXBzZV9jaGVja19wdGVgLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gSSYjMzk7bGwgZGVmaW5pdGVseSB3YW50IHRvIGtlZXAgYSBjbG9zZSBleWUgb24gaG93IGBjb2xsYXBzZV9jaGVja19wdGVgIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRob3NlLiAKCkkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gaW5jbHVkZSBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfaHVnZV9wYWdlYCBpbiBteSBgRm9jdXNTeW1ib2xzYCBsaXN0OyB0aGVzZSBhcmUgY2xlYXJseSBjZW50cmFsIHRvIHRoZSB1cGRhdGVkIGJlaGF2aW9yLiBIbW0sIHdhaXQgYSBtb21lbnTigKYgSSBzZWUgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGRlY2xhcmVkIGFzIHN0YXRpYy4gVGhhdCB0aHJvd3MgYSBwb3RlbnRpYWwgd3JlbmNoIGluIHRoZSB3b3Jrcy4gSXMgaXQgaW5saW5lZD8gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoYXQuIEl0IGNvdWxkIGFmZmVjdCBob3cgZWFzaWx5IEkgY2FuIHRyYWNlIGl0cyBleGVjdXRpb24gZmxvdyBhbmQgdW5kZXJzdGFuZCBpdHMgaW1wYWN0LiBBc2lkZSBmcm9tIHRob3NlLCB0aGUgcmVtYWluaW5nIGNoYW5nZXMgc2VlbSByZWxhdGl2ZWx5IG1pbm9yIOKAkyBzb21lIGFkanVzdG1lbnRzIHRvIGBjb2xsYXBzZV9zY2FuX2ZpbGVgIGZvciBpbml0aWFsaXphdGlvbiwgc29tZSBzdGF0IGNvdW50aW5nIGFkZGVkIHRvIGBhbGxvY19jaGFyZ2VfZm9saW9gLCBhbmQganVzdCBhIGNvbW1lbnQgdXBkYXRlIHRvIGBfX2todWdlcGFnZWRfZXhpdGAuIFRoZXNlIGFyZSBtdWNoIGxlc3MgY29uY2VybmluZywgZ2l2ZW4gdGhlIGNvcmUgbG9naWMgcmVzaWRlcyB3aXRoaW4gdGhlIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBmdW5jdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODExLVxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxMy1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTk5Nj1zdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jPTEzNzY9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDE4CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqQW5hbHl6aW5nIGBjb2xsYXBzZV9odWdlX3BhZ2VgIEZ1bmN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gbG9va2luZyBhdCB0aGlzIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBmdW5jdGlvbiwgaXQmIzM5O3MgZGVjbGFyZWQgYHN0YXRpY2AsIGFuZCBpdCYjMzk7cyBvbmx5IGNhbGxlZCBvbmNlIGluIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiBIbW0sIHRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgcHJvYmFibHkgYmVlbiBpbmxpbmVkIGJ5IHRoZSBjb21waWxlci4gTm8gcmVhbCBuZWVkIHRvIHNwZW5kIG11Y2ggdGltZSBvbiB0aGF0IG9uZS4KCk5vdywgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXRzZWxmIGlzIGFsc28gYHN0YXRpY2AuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcuIEhvd2V2ZXIsIGl0JiMzOTtzIGEgKm11Y2gqIGxhcmdlciBmdW5jdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgKnRoYXQqIG9uZSBpcyBhY3R1YWxseSBnZXR0aW5nIGNhbGxlZCBmcm9tIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlIG9mIGl0cyByb2xlIGluIHRoZSBzeXN0ZW0uIExldCBtZSBjaGVjayB0aGUgY2FsbCBzaXRlcyBmb3IgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtEb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3Q9OTQ9bW1hcF9sb2NrIGluIHJlYWQgKG9yIHdyaXRlKSBtb2RlIHRvIGJlIHN1cmUgYSBodWdlIHBtZCBjYW5ub3QgYmVcbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdDo5NTpjcmVhdGVkIGZyb20gdW5kZXIgeW91IGJ5IGtodWdlcGFnZWQgKGtodWdlcGFnZWQgY29sbGFwc2VfaHVnZV9wYWdlXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtOTYtdGFrZXMgdGhlIG1tYXBfbG9jayBpbiB3cml0ZSBtb2RlIGluIGFkZGl0aW9uIHRvIHRoZSBhbm9uX3ZtYSBsb2NrKS4gSWZcbi0tXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmM9MjQ1PXBtZF90IGhhc2hfX3BtZHBfY29sbGFwc2VfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmMtMjc5LVx0ICogaGVuY2Ugd2FpdCBmb3IgY29sbGFwc2UgdG8gY29tcGxldGUuIFdpdGhvdXQgdGhpc1xuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jOjI4MDpcdCAqIHRoZSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IGNhbiByZXN1bHQgaW4gY29weWluZ1xuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jLTI4MS1cdCAqIHRoZSBvbGQgY29udGVudC5cbi0tXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYz0xMzg9cG1kX3QgcG1kcF9jb2xsYXBzZV9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYy0xNDktXHQgKiBmb3JtcyB0aGF0IHNwZWNpZnkgYW4gYWRkcmVzcyBvbmx5IGFwcGx5IHRvIGxlYWYgUFRFcywgd2UgbmVlZCBhXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYzoxNTA6XHQgKiBnbG9iYWwgZmx1c2ggaGVyZS4gIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGFzc3VtZXMgdGhlc2UgZmx1c2hlcyBhcmVcbmFyY2gvcmlzY3YvbW0vcGd0YWJsZS5jLTE1MS1cdCAqIGVhZ2VyLCBzbyBqdXN0IGRvIHRoZSBmZW5jZSBoZXJlLlxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NTY9VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTg5LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo5MDpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2UsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTkxLVxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTE2LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0Ny1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6MTQ4OlRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4sXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0OS1cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY2NTY9c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfcmF3X3RwX251bGxfYXJncyByYXdfdHBfbnVsbF9hcmdzW10gPSB7XG4tLVxua2VybmVsL2JwZi9idGYuYy02NzA2LVx0eyBcJiMzNDttbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCYjMzQ7LCAweDEwIH0sXG5rZXJuZWwvYnBmL2J0Zi5jOjY3MDc6XHR7IFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCYjMzQ7LCAweDEgfSxcbmtlcm5lbC9icGYvYnRmLmMtNjcwOC1cdHsgXCYjMzQ7bW1fa2h1Z2VwYWdlZF9zY2FuX2ZpbGVcJiMzNDssIDB4MTAgfSxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODExLVxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxMy1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTkyMC1cdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xubW0va2h1Z2VwYWdlZC5jOjkyMTpcdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG5tbS9raHVnZXBhZ2VkLmMtOTIyLVx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTI2LVx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XG5tbS9raHVnZXBhZ2VkLmM6OTI3Olx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG5tbS9raHVnZXBhZ2VkLmMtOTI4LVx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTkzMS1cbm1tL2todWdlcGFnZWQuYzo5MzI6c3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9zdWNjZWVkZWQocHRlX3QgKnB0ZSxcbm1tL2todWdlcGFnZWQuYy05MzMtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTk5NS1cbm1tL2todWdlcGFnZWQuYzo5OTY6c3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlX3QgKnB0ZSxcbm1tL2todWdlcGFnZWQuYy05OTctXHRcdHBtZF90ICpwbWQsIHBtZF90IG9yaWdfcG1kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cdCAqIFJlbGVhc2UgYm90aCByYXcgYW5kIGNvbXBvdW5kIHBhZ2VzIGlzb2xhdGVkXG5tbS9raHVnZXBhZ2VkLmM6MTAxNDpcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXG5tbS9raHVnZXBhZ2VkLmMtMTAxNS1cdCAqL1xuLS1cbm1tL2todWdlcGFnZWQuYy0xMDE5LS8qXG5tbS9raHVnZXBhZ2VkLmM6MTAyMDogKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IC0gYXR0ZW1wdHMgdG8gY29weSBtZW1vcnkgY29udGVudHMgZnJvbSByYXdcbm1tL2todWdlcGFnZWQuYy0xMDIxLSAqIHBhZ2VzIHRvIGEgaHVnZXBhZ2UuIENsZWFucyB1cCB0aGUgcmF3IHBhZ2VzIGlmIGNvcHlpbmcgc3VjY2VlZHM7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMzMtICovXG5tbS9raHVnZXBhZ2VkLmM6MTAzNDpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZV90ICpwdGUsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9raHVnZXBhZ2VkLmMtMTAzNS1cdFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDYzLVx0aWYgKGxpa2VseShyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSlcbm1tL2todWdlcGFnZWQuYzoxMDY0Olx0XHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGUsIHZtYSwgYWRkcmVzcywgcHRsLFxubW0va2h1Z2VwYWdlZC5jLTEwNjUtXHRcdFx0XHRcdFx0ICAgIG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XG5tbS9raHVnZXBhZ2VkLmMtMTA2Ni1cdGVsc2Vcbm1tL2todWdlcGFnZWQuYzoxMDY3Olx0XHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGUsIHBtZCwgb3JpZ19wbWQsIHZtYSxcbm1tL2todWdlcGFnZWQuYy0xMDY4LVx0XHRcdFx0XHRcdCBvcmRlciwgY29tcG91bmRfcGFnZWxpc3QpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTI0Ny0gKi9cbm1tL2todWdlcGFnZWQuYzoxMjQ4OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2todWdlcGFnZWQuYy0xMjQ5LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMzMzLW91dDpcbm1tL2todWdlcGFnZWQuYzoxMzM0Olx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgc3dhcHBlZF9pbiwgcmVmZXJlbmNlZCwgcmVzdWx0LFxubW0va2h1Z2VwYWdlZC5jLTEzMzUtXHRcdFx0XHRcdCAgIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTMzOT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3MC0vKlxubW0va2h1Z2VwYWdlZC5jOjEzNzE6ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbm1tL2todWdlcGFnZWQuYy0xMzcyLSAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3NS0gKi9cbm1tL2todWdlcGFnZWQuYzoxMzc2OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXHRcdGludCByZWZlcmVuY2VkLCBpbnQgdW5tYXBwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQxNy1cdFx0Lypcbm1tL2todWdlcGFnZWQuYzoxNDE4Olx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xubW0va2h1Z2VwYWdlZC5jLTE0MTktXHRcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxuLS1cbm1tL2todWdlcGFnZWQuYy0xNDIxLVx0XHQgKi9cbm1tL2todWdlcGFnZWQuYzoxNDIyOlx0XHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHZtYSwgc3RhcnRfYWRkciwgcG1kLFxubW0va2h1Z2VwYWdlZC5jLTE0MjMtXHRcdFx0XHRcdFx0ICAgICByZWZlcmVuY2VkLCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xNTA5LVxubW0va2h1Z2VwYWdlZC5jOjE1MTA6XHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZSwgZm9saW8sIHBtZCwgX3BtZCxcbm1tL2todWdlcGFnZWQuYy0xNTExLVx0XHRcdFx0XHQgICB2bWEsIHN0YXJ0X2FkZHIsIHB0ZV9wdGwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1NTYtXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6MTU1NzpcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZShtbSwgcmVzdWx0ID09IFNDQU5fU1VDQ0VFRCwgcmVzdWx0LCBvcmRlcik7XG5tbS9raHVnZXBhZ2VkLmMtMTU1OC1cdHJldHVybiByZXN1bHQ7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTYyMC1cdFx0XHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyAmIzQzOyBvZmZzZXQgKiBQQUdFX1NJWkU7XG5tbS9raHVnZXBhZ2VkLmM6MTYyMTpcdFx0XHRyZXQgPSBjb2xsYXBzZV9odWdlX3BhZ2UobW0sIGNvbGxhcHNlX2FkZHJlc3MsIHJlZmVyZW5jZWQsXG5tbS9raHVnZXBhZ2VkLmMtMTYyMi1cdFx0XHRcdFx0XHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE4MDYtXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xubW0va2h1Z2VwYWdlZC5jOjE4MDc6XHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xubW0va2h1Z2VwYWdlZC5jLTE4MDgtXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTQ0MAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipUcmFjaW5nIHRoZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbSoqCgpSaWdodCwgc28gYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXMgdGhlIGtleSBmdW5jdGlvbiBoZXJlLCBidXQgaXQmIzM5O3MgKnN0YXRpYyogd2hpY2ggbWVhbnMgd2UgZG9uJiMzOTt0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byBpdC4gSXQmIzM5O3MgY2FsbGVkIGJ5IGBtdGhwX2NvbGxhcHNlYCwgd2hpY2gsIGluIHR1cm4sIGlzIHRyaWdnZXJlZCBieSBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBTbywgdGhlIGNvbGxhcHNlIHVsdGltYXRlbHkgaGFwcGVucyB0aHJvdWdoIGEgY2hhaW4gb2YgZnVuY3Rpb24gY2FsbHMuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYWxzbyBzdGF0aWMsIG1lYW5pbmcgaXQmIzM5O3MgY29uZmluZWQgdG8gaXRzIHNvdXJjZSBmaWxlIGFuZCBub3QgZXhwb3NlZCB0byB0aGUgb3V0c2lkZS4gVGhhdCBsZWF2ZXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGFzIHRoZSBlbnRyeSBwb2ludCB0aGF0JiMzOTtzIGFjY2Vzc2libGUuIFRoaXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGlzIHRoZSBsaWtlbHkgY2FuZGlkYXRlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB3aG9sZSBwYWdlIGNvbGxhcHNlIHByb2Nlc3MgaXMgaW5pdGlhdGVkLiBJIG5lZWQgdG8gZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiBvbiB0aGF0IGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraHVnZXBhZ2VkX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY2NTY9c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfcmF3X3RwX251bGxfYXJncyByYXdfdHBfbnVsbF9hcmdzW10gPSB7XG4tLVxua2VybmVsL2JwZi9idGYuYy02NzA1LVx0LyogaHVnZV9tZW1vcnkgKi9cbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcdHsgXCYjMzQ7bW1fa2h1Z2VwYWdlZF9zY2FuX3BtZFwmIzM0OywgMHgxMCB9LFxua2VybmVsL2JwZi9idGYuYy02NzA3LVx0eyBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwmIzM0OywgMHgxIH0sXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE4MTQtb3V0OlxubW0va2h1Z2VwYWdlZC5jOjE4MTU6XHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbm1tL2todWdlcGFnZWQuYy0xODE2LVx0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDc3CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTmF2aWdhdGluZyB0aGUgS2VybmVsJiMzOTtzIFBhZ2UgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyBJIHdhcyBsb29raW5nIGZvciBga2h1Z2VwYWdlZF9zY2FuX3BtZGAsIGJ1dCB3YWl0IGEgbWludXRl4oCmIHRoYXQgZnVuY3Rpb24gZG9lc24mIzM5O3Qgc2VlbSB0byBiZSBkZWZpbmVkLiBIbW0sIEkgbXVzdCBoYXZlIGdvdHRlbiB0aGUgbmFtZSB3cm9uZy4gUmlnaHQsIHRoZSBhY3R1YWwgZnVuY3Rpb24gaXMgYGNvbGxhcHNlX3NjYW5fcG1kYC4gVGhhdCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UuIE5vdyB0aGF0IEkgaGF2ZSB0aGUgY29ycmVjdCBmdW5jdGlvbiBuYW1lLCBsZXQmIzM5O3MgdHJhY2Ugd2hlcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIHdpbGwgYmUgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0aGUgbGFyZ2VyIHBhZ2UgbWFuYWdlbWVudCBzY2hlbWUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsYXBzZV9zY2FuX3BtZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEyMzgtICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbm1tL2todWdlcGFnZWQuYzoxMjM5OiAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxuLS1cbm1tL2todWdlcGFnZWQuYz0xNTYyPXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X29yZGVyX2Zyb21fb2Zmc2V0KHVuc2lnbmVkIGludCBvZmZzZXQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1NzEtICogbXRocF9jb2xsYXBzZSgpIGNvbnN1bWVzIHRoZSBiaXRtYXAgdGhhdCBpcyBnZW5lcmF0ZWQgZHVyaW5nXG5tbS9raHVnZXBhZ2VkLmM6MTU3MjogKiBjb2xsYXBzZV9zY2FuX3BtZCgpIHRvIGRldGVybWluZSB3aGF0IHJlZ2lvbnMgYW5kIG1USFAgb3JkZXJzIGZpdCBiZXN0LlxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTU4Nz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNjg4LVxubW0va2h1Z2VwYWdlZC5jOjE2ODk6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MjgxMj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgyNC1cdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcbm1tL2todWdlcGFnZWQuYzoyODI1Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX3BtZChtbSwgdm1hLCBhZGRyLCBsb2NrX2Ryb3BwZWQsIGNjKTtcbm1tL2todWdlcGFnZWQuYy0yODI2LVx0XHRnb3RvIGVuZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA3NTMKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBQTUQgQ29sbGFwc2UgRnVuY3Rpb25zKioKCk9rYXksIHNvIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYmVpbmcgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gVGhhdCYjMzk7cyBhIGNydWNpYWwgbGluayB0byB1bmRlcnN0YW5kLiBUbyByZWFsbHkgZ3Jhc3Agd2hhdCYjMzk7cyBoYXBwZW5pbmcsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYGNvbGxhcHNlX3NpbmdsZV9wbWRgICpkb2VzKi4gU28sIGZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBJJiMzOTtsbCBzdGFydCB0aGVyZSBhbmQgc2VlIHdoZXJlIGl0IGxlYWRzLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIG9mdGVuIHRoZSBrZXkgdG8gdW5yYXZlbGluZyB0aGUgcHVycG9zZSBvZiBhbnkgY2FsbGVkIGZ1bmN0aW9uLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgdG8gZGV0ZXJtaW5lIGhvdyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGZpdHMgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsYXBzZV9zaW5nbGVfcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0yNzAyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgxMS0gKi9cbm1tL2todWdlcGFnZWQuYzoyODEyOnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxubW0va2h1Z2VwYWdlZC5jLTI4MTMtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sICpsb2NrX2Ryb3BwZWQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTI4Njk9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI5MzktXG5tbS9raHVnZXBhZ2VkLmM6Mjk0MDpcdFx0XHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcbm1tL2todWdlcGFnZWQuYy0yOTQxLVx0XHRcdFx0XHRcdCAgICAgIHZtYSwgXHUwMDI2bG9ja19kcm9wcGVkLCBjYyk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMyMTA9aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyNTgtXG5tbS9raHVnZXBhZ2VkLmM6MzI1OTpcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFx1MDAyNm1tYXBfdW5sb2NrZWQsIGNjKTtcbm1tL2todWdlcGFnZWQuYy0zMjYwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTMxMQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDEyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIFRob3VnaHRzIG9uIGBtYWR2aXNlX2NvbGxhcHNlYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKgoKT2theSwgc28gYG1hZHZpc2VfY29sbGFwc2VgIGlzIGEgZGlyZWN0IEFQSSBlbnRyeSBwb2ludCwgc3BlY2lmaWNhbGx5IGNhbGxlZCB3aGVuIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhhdCBtYWtlcyBpdCBhIGNyaXRpY2FsIHBvaW50IG9mIGludGVyZXN0LiBJdCYjMzk7cyB0aGUgcGVyZmVjdCBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBBbHNvLCB0aGUgYGNvbGxhcHNlX3NjYW5fbW1fc2xvdGAgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGxvb3Agd2l0aGluIGtodWdlcGFnZWQuIFRoaXMgaXMgZ29vZCB0byBrbm93LCBhbmQgSSBzaG91bGQgbWFrZSBzdXJlIHRvIGFkZCBgbWFkdmlzZV9jb2xsYXBzZWAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGRvbiYjMzk7dCBtaXNzIGFueXRoaW5nIHRoYXQgbWF5IGJlIG92ZXJsb29rZWQuIEFyZSB0aGVyZSBhbnkgb3RoZXIgbm9uLXN0YXRpYyBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzIHByb2Nlc3MgdGhhdCBJIGFtIG5vdCBzZWVpbmc/CgpOb3csIGxldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgJiMzOTtzIHNpZ25hdHVyZS4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaXRzIGlucHV0cyBhbmQgb3V0cHV0cyBiZWZvcmUgcHJvY2VlZGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aW50IG1hZHZpc2VfY29sbGFwc2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OS17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDktXG5tbS9raHVnZXBhZ2VkLmM6MzIxMDppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjExLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTI1Nj1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjcwOnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIyMTAKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUaGlua2luZyBBYm91dCBNZW1vcnkgTWFuYWdlbWVudCBhbmQgYGtodWdlcGFnZWRgKioKCk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIG5vbi1zdGF0aWMgZnVuY3Rpb24g4oCTIHRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBJIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gbWVtb3J5IGNvbGxhcHNpbmcsIGJ1dCBpdCBpbW1lZGlhdGVseSBtYWtlcyBtZSBjb25zaWRlciB0aGUgYmlnZ2VyIHBpY3R1cmUsIHBhcnRpY3VsYXJseSB0aGUgaW50ZXJhY3Rpb24gd2l0aCBga2h1Z2VwYWdlZGAuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGh1Z2VwYWdlIG1hbmFnZW1lbnQgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIG1lbW9yeSBmcmFnbWVudGF0aW9uIG9yIGluZWZmaWNpZW50IGFsbG9jYXRpb24uIFNpbmNlIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBwYXJ0IG9mIHRoZSB0b29sIHNldCBmb3IgZGVhbGluZyB3aXRoIHRoaXMsIGl0IG1ha2VzIG1lIHRoaW5rIGFib3V0IGhvdyB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpdHNlbGYgaXMgKmludm9sdmVkKiBhbmQgaG93IGl0cyBiZWhhdmlvciBtaWdodCBpbmZsdWVuY2UgdGhlIGVmZmljYWN5IG9mIGBtYWR2aXNlX2NvbGxhcHNlYC4gV2hhdCBhcmUgdGhlIHRyaWdnZXJpbmcgY29uZGl0aW9ucyBmb3IgYGtodWdlcGFnZWRgIHRvIHN3ZWVwIGluLCBhbmQgaG93IGRvZXMgaXQgZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gdGhhdCAqbWFkdmlzZV9jb2xsYXBzZSogaXMgZGVzaWduZWQgdG8gYWxsZXZpYXRlPyBJcyB0aGVyZSBjb250ZW50aW9uPyBBcmUgdGhlcmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpbiB0aGF0IGludGVyYWN0aW9uIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUga25vYnMgSSBjYW4gdHVybiBpbiBlaXRoZXIgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2U/IEkgbmVlZCB0byB0aGluayB0aGlzIHRocm91Z2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfc2Nhbl9tbV9zbG90JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3Q9OTk9TG9vayBhdCB0aGUgY3VycmVudCBsb2NrIHN0YXRpc3RpY3M6OlxuLS1cbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTEzLSAgMDggICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0OjExNDogIDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDI2bW0tXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgIDEgICAgICAgICAgW1x1MDAzY2ZmZmZmZmZmODExNTAyYTdcdTAwM2VdIGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90JiM0MzsweDU3LzB4MjgwXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0LTExNS0gIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDI2bW0tXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgOTYgICAgICAgICAgW1x1MDAzY2ZmZmZmZmZmODE1MzUxYzRcdTAwM2VdIF9fZG9fcGFnZV9mYXVsdCYjNDM7MHgxZDQvMHg1MTBcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdD0xMjA9UGVyIHZlZGVyZSBsZSBzdGF0aXN0aWNoZSBjb3JyZW50aSBzdWkgYmxvY2NoaTo6XG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTM0LSAgMDggICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdDoxMzU6ICAwOSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAyNm1tLVx1MDAzZW1tYXBfc2VtICAgICAgICAgICAgICAxICAgICAgICAgIFtcdTAwM2NmZmZmZmZmZjgxMTUwMmE3XHUwMDNlXSBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCYjNDM7MHg1Ny8weDI4MFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTM2LSAgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwMjZtbS1cdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICA5NiAgICAgICAgICBbXHUwMDNjZmZmZmZmZmY4MTUzNTFjNFx1MDAzZV0gX19kb19wYWdlX2ZhdWx0JiM0MzsweDFkNC8weDUxMFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjg1OQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRlYnVnZ2luZyBhIE1pc3NpbmcgYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCoqCgpIbW0sIHRoYXQmIzM5O3Mgb2RkLiBJIHdhcyBleHBlY3RpbmcgdG8gc2VlIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaW4gdGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlLCBidXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHRocm93aW5nIGFuIGVycm9yLiBBIHF1aWNrIGNoZWNrIHJldmVhbHMgaXQmIzM5O3Mgbm93aGVyZSB0byBiZSBmb3VuZC4gT2theSwgdGltZSB0byBzdGVwIGJhY2sgYW5kIHJlLWV2YWx1YXRlIHRoZSBzZWFyY2ggc3RyYXRlZ3kuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIEkmIzM5O20gbG9va2luZyBmb3IgbWF5IGhhdmUgYmVlbiByZW5hbWVkLCBvciBpcyBjYWxsZWQgaW5kaXJlY3RseS4gTGV0JiMzOTtzIHdpZGVuIHRoZSBuZXQuIEkmIzM5O2xsIGdyZXAgdGhlIGNvZGViYXNlIGZvciBhbnkgYW5kIGFsbCBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBIb3BlZnVsbHkgdGhpcyB3aWxsIHJldmVhbCB0aGUgZGVwZW5kZW5jeSB0cmVlIGFuZCBsZXQgbWUgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eS4gR290dGEga2VlcCBkaWdnaW5nIGFuZCBob3BlZnVsbHkgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcHJlc2VudCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfdGhyZWFkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz02OD1lbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy03Ni1cbm1tL2todWdlcGFnZWQuYzo3NzpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpraHVnZXBhZ2VkX3RocmVhZCBfX3JlYWRfbW9zdGx5O1xubW0va2h1Z2VwYWdlZC5jLTc4LXN0YXRpYyBERUZJTkVfTVVURVgoa2h1Z2VwYWdlZF9tdXRleCk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxMzk9aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTQyLVx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSkge1xubW0va2h1Z2VwYWdlZC5jOjMxNDM6XHRcdGlmICgha2h1Z2VwYWdlZF90aHJlYWQpIHtcbm1tL2todWdlcGFnZWQuYy0zMTQ0LVx0XHRcdHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3X3RocmVhZCA9IGt0aHJlYWRfcnVuKGtodWdlcGFnZWQsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMxNTItXG5tbS9raHVnZXBhZ2VkLmM6MzE1MzpcdFx0XHRraHVnZXBhZ2VkX3RocmVhZCA9IG5ld190aHJlYWQ7XG5tbS9raHVnZXBhZ2VkLmMtMzE1NC1cdFx0fVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTU3LVx0XHRcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcdTAwMjZraHVnZXBhZ2VkX3dhaXQpO1xubW0va2h1Z2VwYWdlZC5jOjMxNTg6XHR9IGVsc2UgaWYgKGtodWdlcGFnZWRfdGhyZWFkKSB7XG5tbS9raHVnZXBhZ2VkLmM6MzE1OTpcdFx0a3RocmVhZF9zdG9wKGtodWdlcGFnZWRfdGhyZWFkKTtcbm1tL2todWdlcGFnZWQuYzozMTYwOlx0XHRraHVnZXBhZ2VkX3RocmVhZCA9IE5VTEw7XG5tbS9raHVnZXBhZ2VkLmMtMzE2MS1cdH1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzE2Nj12b2lkIGtodWdlcGFnZWRfbWluX2ZyZWVfa2J5dGVzX3VwZGF0ZSh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTY4LVx0Z3VhcmQobXV0ZXgpKFx1MDAyNmtodWdlcGFnZWRfbXV0ZXgpO1xubW0va2h1Z2VwYWdlZC5jOjMxNjk6XHRpZiAoaHVnZXBhZ2VfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiBraHVnZXBhZ2VkX3RocmVhZClcbm1tL2todWdlcGFnZWQuYy0zMTcwLVx0XHRzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNjMyCgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipVbmRlcnN0YW5kaW5nIHRoZSBLZXJuZWwmIzM5O3MgSHVnZSBQYWdlIE1hbmFnZW1lbnQqKgoKUmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gdGhlIHRvcGljIGhlcmUgaXMgdGhlIGtlcm5lbCYjMzk7cyBodWdlIHBhZ2UgbWFuYWdlbWVudCwgYW5kIHNwZWNpZmljYWxseSwgdGhlIGBraHVnZXBhZ2VkYCB0aHJlYWQuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGlzIHRocmVhZCBpcyB0aGUgaGVhcnQgb2YgdGhlIGF1dG9tYXRlZCBodWdlIHBhZ2UgbWFuYWdlbWVudCBwcm9jZXNzLiBJdHMgY29yZSBmdW5jdGlvbiBpcyB0byBhbmFseXplIHRoZSBtZW1vcnkgdXNhZ2UgcGF0dGVybnMgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHByb2FjdGl2ZWx5IGFsbG9jYXRlIG9yIGRlYWxsb2NhdGUgaHVnZSBwYWdlcyAodHlwaWNhbGx5IDJNQiBvciAxR0IsIGRlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBjb25maWd1cmF0aW9uKSB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4KCk15IHRoaW5raW5nIHRoZW4gZ29lcyB0bzogd2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gY3JpdGVyaWEgdGhhdCBga2h1Z2VwYWdlZGAgaXMgdHJ5aW5nIHRvIGFjaGlldmU/IElzIGl0IHByaW1hcmlseSBmb2N1c2VkIG9uIG1pbmltaXppbmcgVExCIG1pc3Nlcz8gSXMgdGhlcmUgYSBkeW5hbWljIHRocmVzaG9sZCByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3Igb3ZlcmFsbCBtZW1vcnkgdXRpbGl6YXRpb24gdGhhdCB0cmlnZ2VycyB0aGVzZSBhbGxvY2F0aW9ucz8gSSBuZWVkIHRvIGNvbnNpZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLCBzdWNoIGFzIHRoZSBOVU1BIGJhbGFuY2luZyBjb2RlLCB0aGUgcGFnZSByZWNsYWltIGNvZGUsIGFuZCB0aGUgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIChUSFApIG1lY2hhbmlzbS4gSSYjMzk7bSB3b25kZXJpbmcgaWYgaXQmIzM5O3MgYWN0aXZlbHkgc2Vla2luZyB0byBjb25zb2xpZGF0ZSBzbWFsbGVyIGFsbG9jYXRpb25zIGludG8gbGFyZ2VyIFRIUC1lbGlnaWJsZSByZWdpb25zLCBvciBpZiBpdCBwcmlvcml0aXplcyBzcGVjaWZpYyBwcm9jZXNzZXMgYmFzZWQgb24gc29tZSBtZXRyaWNzIGxpa2Ugd29ya2luZyBzZXQgc2l6ZSBvciBwYWdlIGZhdWx0IHJhdGUuCgpUaGlua2luZyBmdXJ0aGVyLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIGBraHVnZXBhZ2VkYCBhcmUgY3J1Y2lhbC4gSXMgaXQgZWZmaWNpZW50PyBIb3cgbXVjaCBvdmVyaGVhZCBkb2VzIGl0IGludHJvZHVjZSwgaW4gdGVybXMgb2YgQ1BVIGN5Y2xlcyBhbmQgbWVtb3J5IGJhbmR3aWR0aCBjb25zdW1wdGlvbj8gV2hhdCBhcmUgdGhlIHR1bmluZyBrbm9icyBhdmFpbGFibGU/IEkgbmVlZCB0byByZW1lbWJlciB0aGUgdmFyaW91cyBzeXNjdGwgcGFyYW1ldGVycywgc3VjaCBhcyBga2h1Z2VwYWdlZF9zY2FuX3BhZ2VzYCwgYGtodWdlcGFnZWRfYWxsb2NfcGFnZXNgLCBhbmQgdGhlIHJlbGF0ZWQgZmxhZ3MgdGhhdCBjb250cm9sIGl0cyBiZWhhdmlvciwgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHByb2FjdGl2ZSBhbGxvY2F0aW9uIGFuZCB0aGUgcmlzayBvZiBpbnRyb2R1Y2luZyBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbiBvciB3YXN0aW5nIHJlc291cmNlcy4gRmluYWxseSwgSSYjMzk7bSBnb2luZyB0byBjb25zaWRlciBlZGdlIGNhc2VzOiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgc3lzdGVtIGlzIHVuZGVyIGV4dHJlbWUgbWVtb3J5IHByZXNzdXJlIG9yIHdoZW4gZGVhbGluZyB3aXRoIGhpZ2hseSBmcmFnbWVudGVkIGFkZHJlc3Mgc3BhY2VzPyBIb3cgZG9lcyBga2h1Z2VwYWdlZGAgZ3JhY2VmdWxseSBoYW5kbGUgdGhvc2Ugc2NlbmFyaW9zPwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdGF0aWMgaW50IGtodWdlcGFnZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTI4Njk9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI5ODctXG5tbS9raHVnZXBhZ2VkLmM6Mjk4ODpzdGF0aWMgaW50IGtodWdlcGFnZWRfaGFzX3dvcmsodm9pZClcbm1tL2todWdlcGFnZWQuYy0yOTg5LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjk5Mi1cbm1tL2todWdlcGFnZWQuYzoyOTkzOnN0YXRpYyBpbnQga2h1Z2VwYWdlZF93YWl0X2V2ZW50KHZvaWQpXG5tbS9raHVnZXBhZ2VkLmMtMjk5NC17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMwNDc9c3RhdGljIHZvaWQga2h1Z2VwYWdlZF93YWl0X3dvcmsodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzA2Ni1cbm1tL2todWdlcGFnZWQuYzozMDY3OnN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxubW0va2h1Z2VwYWdlZC5jLTMwNjgte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDMyMgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIHRoZSBIdWdlIFBhZ2UgQ29sbGFwc2luZyBNZWNoYW5pc20qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYGtodWdlcGFnZWRgIHRocmVhZC4gU2VlbXMgbGlrZSB0aGUgaGVhcnQgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGUgcGF0Y2ggSSYjMzk7bSBleGFtaW5pbmcgdHdlYWtzIGBjb2xsYXBzZV9jaGVja19wdGVgLiBUaGF0JiMzOTtzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQmIzM5O3MgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXRzZWxmIGlzIGNhbGxlZCBieSBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIEdvdCBpdC4gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIGNhbGxlZCBpbiB0d28gcGxhY2VzOiB0aHJvdWdoIHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB2aWEgYG1hZHZpc2VfY29sbGFwc2VgLiBBaGEhIFRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIHBhdGggbG9va3MgbGlrZSBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gSXQmIzM5O3MgYSBkaXJlY3QgZW50cnkgcG9pbnQsIHdoaWNoIG1ha2VzIGl0IGZhciBtb3JlIGludGVyZXN0aW5nLgoKQW5kIGBraHVnZXBhZ2VkYCBpdHNlbGYgaXMgYSBkZWNlbnQgZW50cnkgcG9pbnQgZm9yIGZ1enppbmcsIG9mIGNvdXJzZS4KCldhaXQgYSBzZWNvbmTigKYgYG1hZHZpc2VfY29sbGFwc2VgIGlzIG5vbi1zdGF0aWMuIFRoYXQmIzM5O3MgYSBodWdlIGFkdmFudGFnZSwgYSBnb29kIHRhcmdldCB0byBzdGFydCB3aXRoLiBMZXQgbWUgc2VlLi4uIGFyZSB0aGVyZSBhbnkgb3RoZXIgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaW4gdGhpcyBhcmVhIHRoYXQgbWlnaHQgYmUgZXhwb3NlZD8gSSBzaG91bGQgZG91YmxlLWNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxuLS1cbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTMtXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OS17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDktXG5tbS9raHVnZXBhZ2VkLmM6MzIxMDppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjExLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyOTctXHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxubW0va2h1Z2VwYWdlZC5jOjMyOTg6XHRcdFx0OiBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGxhc3RfZmFpbCk7XG5tbS9raHVnZXBhZ2VkLmMtMzI5OS19XG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTM2Mi1cdGNhc2UgTUFEVl9DT0xMQVBTRTpcbm1tL21hZHZpc2UuYzoxMzYzOlx0XHRyZXR1cm4gbWFkdmlzZV9jb2xsYXBzZSh2bWEsIHJhbmdlLVx1MDAzZXN0YXJ0LCByYW5nZS1cdTAwM2VlbmQsXG5tbS9tYWR2aXNlLmMtMTM2NC1cdFx0XHRcdTAwMjZtYWR2X2JlaGF2aW9yLVx1MDAzZWxvY2tfZHJvcHBlZCk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTI1Nj1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjcwOnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9Mjg4PXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0zMDEtXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cJiMzNDspO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjMwMjpcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0zMDMtXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfQ09MTEFQU0UpXCYjMzQ7KTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9NTMyPXN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM2LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUzNzpzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzOC1cdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU2MC1cdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU2MTpcdHJldCA9IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU2Mi1cdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3MS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NzI6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTczLVx0XHRcdCAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3Ny1cdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgaHVnZSBwYWdlXFxuXCYjMzQ7KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1Nzg6XHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NzktfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz03MDE9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjcwMjpcdC5jb2xsYXBzZSA9IFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNzAzLVx0LmVuZm9yY2VfcHRlX3NjYW5fbGltaXRzID0gZmFsc2UsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTExMDk9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMTY2LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNjc6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNjgtXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNzctXHQvKiBjLVx1MDAzZWNvbGxhcHNlKCkgd2lsbCBmaW5kIGEgaHVnZXBhZ2UgYW5kIGNvbXBsYWluIC0gY2FsbCBkaXJlY3RseS4gKi9cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMTc4Olx0X19tYWR2aXNlX2NvbGxhcHNlKFwmIzM0O1JlLWNvbGxhcHNlIFBNRC1tYXBwZWQgaHVnZXBhZ2VcJiMzNDssIHAsIDEsIG9wcywgdHJ1ZSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3OS1cdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEzNDQ9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xNDY1LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0NjY6XHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2NzpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2ODpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2OTpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTQ3MC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjY5MTQKCQkJCQkJCW91dHB1dDogNjUKCQkJCQkJCXRob3VnaHRzOiAyMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBDb2xsYXBzZSBFbnRyeSBQb2ludHMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHplcm8gaW4gb24gdGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQgbG9va2luZy4gYG1hZHZpc2VfY29sbGFwc2VgIHNlZW1zIGxpa2UgYSBzb2xpZCBjYW5kaWRhdGU7IGl0JiMzOTtzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGEga2V5IHJlcXVpcmVtZW50LiBIbW0sIEkga25vdyBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAgYWxyZWFkeTsgYmVzdCB0byBrZWVwIHRoYXQgb3V0IG9mIGNvbnNpZGVyYXRpb24gZm9yIG5vdy4gV2hhdCBhYm91dCBgbXRocF9jb2xsYXBzZWAsIGBjb2xsYXBzZV9odWdlX3BhZ2VgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlYD8gVGhvc2UgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb25zLCB1bmZvcnR1bmF0ZWx5LiBBbmQgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkYCBpcyBzdGF0aWMgaW5saW5lLCBzbyB0aGF0IGlzIG5vdCBhbiBvcHRpb24gZWl0aGVyLgoKU28sIGZyb20gd2hhdCBJJiMzOTt2ZSBzZWVuLCBgbWFkdmlzZV9jb2xsYXBzZWAgcmVtYWlucyB0aGUgbW9zdCBwcm9taXNpbmcgbm9uLXN0YXRpYyBlbnRyeSBwb2ludC4gSSBkbyByZW1lbWJlciB0aGUgYGtodWdlcGFnZWRgIHRocmVhZCBmdW5jdGlvbiwgYnV0IHRoYXQgaXMgYWxzbyBzdGF0aWMuIEhvd2V2ZXIsIHdhaXQgYSBtaW51dGUsIGBzdGFydF9zdG9wX2todWdlcGFnZWRgIGlzIG5vbi1zdGF0aWMuIEludGVyZXN0aW5nLiBUaGF0IHdhcnJhbnRzIGFub3RoZXIgbG9vay4KClRvIGJlIHRob3JvdWdoLCBsZXQmIzM5O3MgdGFrZSBhIGdhbmRlciBhdCBgbW0va2h1Z2VwYWdlZC5jYC4gSSBuZWVkIHRvIGVuc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnkgb3RoZXIgZXhwb3J0ZWQgb3Igbm9uLXN0YXRpYyBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XlthLXpBLVpfXVthLXpBLVowLTlfXSogW2EtekEtWl9dW2EtekEtWjAtOV9dKlxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9Nzc9c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1Z2VwYWdlZF90aHJlYWQgX19yZWFkX21vc3RseTtcbm1tL2todWdlcGFnZWQuYzo3ODpzdGF0aWMgREVGSU5FX01VVEVYKGtodWdlcGFnZWRfbXV0ZXgpO1xubW0va2h1Z2VwYWdlZC5jLTc5LVxuLS1cbm1tL2todWdlcGFnZWQuYz05MD1zdGF0aWMgdW5zaWduZWQgbG9uZyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZTtcbm1tL2todWdlcGFnZWQuYzo5MTpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtodWdlcGFnZWRfbW1fbG9jayk7XG5tbS9raHVnZXBhZ2VkLmM6OTI6c3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWdlcGFnZWRfd2FpdCk7XG5tbS9raHVnZXBhZ2VkLmMtOTMtLypcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTAzPXN0YXRpYyB1bnNpZ25lZCBpbnQga2h1Z2VwYWdlZF9tYXhfcHRlc19zaGFyZWQgX19yZWFkX21vc3RseTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTA1LSNkZWZpbmUgTU1fU0xPVFNfSEFTSF9CSVRTIDEwXG5tbS9raHVnZXBhZ2VkLmM6MTA2OnN0YXRpYyBERUZJTkVfUkVBRF9NT1NUTFlfSEFTSFRBQkxFKG1tX3Nsb3RzX2hhc2gsIE1NX1NMT1RTX0hBU0hfQklUUyk7XG5tbS9raHVnZXBhZ2VkLmMtMTA3LVxuLS1cbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNDY5LVxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2todWdlcGFnZWQuYy00NzEtXHRcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXG4tLVxubW0va2h1Z2VwYWdlZC5jPTU0MD1zdGF0aWMgYm9vbCBodWdlcGFnZV9lbmFibGVkKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTU1Ny1cbm1tL2todWdlcGFnZWQuYzo1NTg6dm9pZCBfX2todWdlcGFnZWRfZW50ZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG5tbS9raHVnZXBhZ2VkLmMtNTU5LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9NjA4PXN0YXRpYyBib29sIGNvbGxhcHNlX3Bvc3NpYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy02MTMtXG5tbS9raHVnZXBhZ2VkLmM6NjE0OnZvaWQga2h1Z2VwYWdlZF9lbnRlcl92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9raHVnZXBhZ2VkLmMtNjE1LVx0XHRcdCAgdm1fZmxhZ3NfdCB2bV9mbGFncylcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNjIxLVxubW0va2h1Z2VwYWdlZC5jOjYyMjp2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxubW0va2h1Z2VwYWdlZC5jLTYyMy17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE4Nzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTIxMTYtICovXG5tbS9raHVnZXBhZ2VkLmM6MjExNzp2b2lkIGNvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9raHVnZXBhZ2VkLmMtMjExOC1cdFx0Ym9vbCBpbnN0YWxsX3BtZClcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzA2Nz1zdGF0aWMgaW50IGtodWdlcGFnZWQodm9pZCAqbm9uZSlcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzA4Ny1cbm1tL2todWdlcGFnZWQuYzozMDg4OnZvaWQgc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlcyh2b2lkKVxubW0va2h1Z2VwYWdlZC5jLTMwODkte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMTM4LVxubW0va2h1Z2VwYWdlZC5jOjMxMzk6aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxubW0va2h1Z2VwYWdlZC5jLTMxNDAte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMTY1LVxubW0va2h1Z2VwYWdlZC5jOjMxNjY6dm9pZCBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGUodm9pZClcbm1tL2todWdlcGFnZWQuYy0zMTY3LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Mi1cbm1tL2todWdlcGFnZWQuYzozMTczOmJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXG5tbS9raHVnZXBhZ2VkLmMtMzE3NC17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzg9c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGVudW0gc2Nhbl9yZXN1bHQgcilcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzIwOS1cbm1tL2todWdlcGFnZWQuYzozMjEwOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg2NDAKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAyNzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgUmVsZXZhbnQgVEhQIEZ1bmN0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgbWFuYWdlbWVudCwgcGFydGljdWxhcmx5IHRoZSBvbmVzIHRoYXQgc2VlbSBtb3N0IHJlbGV2YW50IHRvIHRoZSBtb2RpZmllZCBsb2dpYy4gSSYjMzk7dmUgYmVlbiBnaXZlbiBhIGxpc3Qgb2Ygbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCBteSBleHBlcnQgaW50dWl0aW9uIGlzIGltbWVkaWF0ZWx5IGRyYXduIHRvIGEgZmV3IGtleSBwbGF5ZXJzLgoKSSYjMzk7bSBzZWVpbmc6IGBodWdlcGFnZV9tYWR2aXNlYCwgYF9fa2h1Z2VwYWdlZF9lbnRlcmAsIGBraHVnZXBhZ2VkX2VudGVyX3ZtYWAsIGBfX2todWdlcGFnZWRfZXhpdGAsIGBjb2xsYXBzZV9wdGVfbWFwcGVkX3RocGAsIGBzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzYCwgYHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZGAsIGBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGVgLCBgY3VycmVudF9pc19raHVnZXBhZ2VkYCwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYC4KClJpZ2h0IGF3YXksIEkgemVybyBpbiBvbiBgbWFkdmlzZV9jb2xsYXBzZWAgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBhcyBsaWtlbHkgcG9pbnRzIG9mIGludGVyZXN0LiBBZnRlciBhIHF1aWNrIHNjYW4sIEkgcmVjYWxsIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBvbmUgdGhhdCB1bHRpbWF0ZWx5IGNhbGxzIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiwgaGl0cyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGlzIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBmdW5jdGlvbiBJJiMzOTttIGxvb2tpbmcgZm9yIC0gYSBmdW5jdGlvbiB0aGF0IGRpcmVjdGx5IG1hbmFnZXMgcGFnZSB0YWJsZSBlbnRyaWVzLiBFeGNlbGxlbnQuIEkmIzM5O20gZ29pbmcgdG8gaW5jbHVkZSBgbWFkdmlzZV9jb2xsYXBzZWAgaW4gYEZvY3VzU3ltYm9sc2AuCgpUaGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpcyBhbHNvIGltbWVkaWF0ZWx5IGp1bXBpbmcgb3V0IGF0IG1lIGFzIGFub3RoZXIga2V5IHBhcnQgb2YgdGhpcyBvdmVyYWxsIFRIUCBzdG9yeS4gSXQmIzM5O3MgYSBiYWNrZ3JvdW5kIHRocmVhZCwgc28gaXQgb3BlcmF0ZXMgZGlmZmVyZW50bHksIGJ1dCBpdCYjMzk7cyBjZW50cmFsIHRvIG1hbmFnaW5nIFRIUHMuCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbG93LWxldmVsIGRldGFpbHMuIFRpbWUgdG8gY2hlY2sgdGhlIGBDT05GSUdfYCBvcHRpb25zIG5lZWRlZC4gSSBuZWVkIHRvIGxvb2sgaW50byB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgZm9yIFRIUC4gSSBrbm93IHRoZSBzb3VyY2UgZmlsZSBpcyBgbW0va2h1Z2VwYWdlZC5jYC4gSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL01ha2VmaWxlYCBhcyB3ZWxsIHRvIHNlZSBob3cgdGhpcyBhbGwgZml0cyB0b2dldGhlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTEwMD1vYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgJiM0Mzs9IG1pZ3JhdGVfZGV2aWNlLm9cbm1tL01ha2VmaWxlOjEwMTpvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xubW0vTWFrZWZpbGUtMTAyLW9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICYjNDM7PSBwYWdlX2NvdW50ZXIub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTQ2MAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLCB0aGUgc3lzdGVtIG5lZWRzIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZS4gTm93LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhlIGNvZGUsIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZvciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiBUaGUgcGF0Y2ggbWVudGlvbnMgYG1USFBg4oCUbXVsdGktc2l6ZSBUSFAsIEkgYXNzdW1lLiBJIHdvbmRlciBpZiB0aGVyZSYjMzk7cyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGZvciB0aGF0IGFzIHdlbGwuIEJlc3QgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlIG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW52b2x2ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bVRIUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTY0NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipDaGVja2luZyB0aGUgS2NvbmZpZyBmb3IgVHJhbnNwYXJlbnQgSHVnZXBhZ2VzKioKCkFscmlnaHQsIHRoZSBvYmplY3RpdmUgaXMgcHJldHR5IGNsZWFyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkga25vdyB0aGF0IGBtbS9LY29uZmlnYCBpcyB0aGUgZ28tdG8gcGxhY2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBpbiB0aGUgTGludXgga2VybmVsLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBkZWZpbmVkIGFuZCBkb2N1bWVudGVkLiBTbywgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gY3JhY2sgb3BlbiB0aGF0IGZpbGUgYW5kIHN0YXJ0IGxvb2tpbmcuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gZm9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgdGhlcmUuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGl0cyBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBhbnkgcmVsZXZhbnQgaGVscCB0ZXh0IHRoYXQgY2xhcmlmaWVzIGl0cyBwdXJwb3NlIGFuZCBpbXBsaWNhdGlvbnMuIEl0JiMzOTtzIHRpbWUgdG8gZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyBwbGFjZSBpbiB0aGUgYnJvYWRlciBtZW1vcnkgbWFuYWdlbWVudCBsYW5kc2NhcGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04MzE9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04MzMtXG5tbS9LY29uZmlnOjgzNDptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzNS1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODUyPWNob2ljZVxuLS1cbm1tL0tjb25maWctODU3LVxubW0vS2NvbmZpZzo4NTg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg1OS1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg2NC1cbm1tL0tjb25maWc6ODY1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODY2LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3My1cbm1tL0tjb25maWc6ODc0Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg3NS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODgxPWNob2ljZVxuLS1cbm1tL0tjb25maWctODkwLVxubW0vS2NvbmZpZzo4OTE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy04OTItXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwMC1cbm1tL0tjb25maWc6OTAxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkwMi1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwOC1cbm1tL0tjb25maWc6OTA5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTEwLVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTYtXG5tbS9LY29uZmlnOjkxNzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MTgtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05MzUtXG5tbS9LY29uZmlnOjkzNjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTkzNy1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQ0LVxubW0vS2NvbmZpZzo5NDU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTQ2LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTUyLVxubW0vS2NvbmZpZzo5NTM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NTQtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk2MC1cbm1tL0tjb25maWc6OTYxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk2Mi1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA2MDAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgUGF0Y2gqKgoKT2theSwgc28gdGhlIGNvcmUgZm9jdXMgaGVyZSBpcyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBjb25maWcsIHRoYXQmIzM5O3MgdGhlIHByaW1hcnkgZHJpdmVyLiBJJiMzOTttIHdvbmRlcmluZyBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHJlbGF0ZWQgY29uZmlncywgYnV0IEkmIzM5O2xsIGFzc3VtZSB0aGlzIGlzIHRoZSBtYWluIGVuYWJsZXIgZm9yIG5vdy4gVGhpcyBwYXRjaCBtb2RpZmllcyBgbW0va2h1Z2VwYWdlZC5jYCwgd2hpY2ggdGVsbHMgbWUgd2UmIzM5O3JlIGRlYWxpbmcgZGlyZWN0bHkgd2l0aCB0aGUgY29yZSBrZXJuZWwgbG9naWMgcmVsYXRlZCB0byBUcmFuc3BhcmVudCBIdWdlUGFnZXMuIEdvb2QuCgpUaGUgbW9kaWZpY2F0aW9ucyBhcmUgZnVuY3Rpb25hbCwgYW5kIEkgY2FuIGNvbmZpcm0gdGhleSBhcmUgcmVhY2hhYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgY29kZS4gVGhleSYjMzk7dmUgcmVmYWN0b3JlZCB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljLCBzcGxpdHRpbmcgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24uIFNtYXJ0IG1vdmUuIFRoZXkmIzM5O3ZlIGFsc28gaW50cm9kdWNlZCBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgLCB3aGljaCBpcyBhIG5lYXQgd2F5IHRvIHBhc3MgdGhlIHJlcXVpcmVkIHN0YXRlLiBBbmQgdGhlIGFkZGl0aW9uIG9mIHRoZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyIHNlZW1zIGxpa2UgYSB1c2VmdWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgdGhpcyBhcmVhLgoKVGhlIGNoYW5nZXMgYXJlIGNsZWFybHkgd2l0aGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLCBzbyB0aGlzIGlzIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkuIFRoaXMgY29kZSBpcyBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZS4gVGhhdCBjYW4gYmUgZG9uZSBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB3aXRoIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4gR2l2ZW4gdGhlIGNyaXRpY2FsIG5hdHVyZSBvZiBUSFAsIGFuZCB0aGlzIHBhdGNoJiMzOTtzIGludm9sdmVtZW50IGluIFBURSBoYW5kbGluZywgaXQmIzM5O3MgY2xlYXIgdGhpcyBpcyBgV29ydGhGdXp6aW5nPXRydWVgLgoKTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlci4gSSB3YW50IHRvIGNoZWNrIGZvciBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0va2h1Z2VwYWdlZC5jYCB0aGF0IGFyZSBhbHNvIG1vZGlmaWVkIG9yIHJlbGF0ZWQuIExldCYjMzk7cyBzZWUuLi4gQWgsIGBodWdlcGFnZV9tYWR2aXNlYCBsb29rcyByZWxldmFudCwgYXMgd2VsbC4gTGV0IG1lIHRha2UgYSBsb29rIGF0IGl0IGluIGBtbS9raHVnZXBhZ2VkLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ5OT1jaGFuZ2VfaHVnZV9wdWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTEwLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NTExOmludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MDI9c3RhdGljIGlubGluZSBib29sIHVubWFwX2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTEtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTI6c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxMy1cdFx0XHRcdCAgIHZtX2ZsYWdzX3QgKnZtX2ZsYWdzLCBpbnQgYWR2aWNlKVxuLS1cbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNDY5LVxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2todWdlcGFnZWQuYy00NzEtXHRcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTQxNy1cdGNhc2UgTUFEVl9OT0hVR0VQQUdFOlxubW0vbWFkdmlzZS5jOjE0MTg6XHRcdGVycm9yID0gaHVnZXBhZ2VfbWFkdmlzZSh2bWEsIFx1MDAyNm5ld19mbGFncywgYmVoYXZpb3IpO1xubW0vbWFkdmlzZS5jLTE0MTktXHRcdGlmIChlcnJvcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE3ODIKCQkJCQkJCW91dHB1dDogMTkzCgkJCQkJCQl0aG91Z2h0czogNTI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBQYXRjaCBvbiBUcmFuc3BhcmVudCBIdWdlUGFnZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGhvdyBpdCByZWxhdGVzIHRvIFRyYW5zcGFyZW50IEh1Z2VQYWdlcyAoVEhQKS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGV4YW1pbmUgaG93IGBodWdlcGFnZV9tYWR2aXNlYCBhbmQgYG1hZHZpc2VfY29sbGFwc2VgIGFyZSBpbnZvbHZlZCwgYXMgdGhleSBhcmUgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgcmVsYXRlZCBgbWFkdmlzZWAgY2FsbHMuIEJvdGggYE1BRFZfSFVHRVBBR0VgIGFuZCBgTUFEVl9OT0hVR0VQQUdFYCBhcmUgaGFuZGxlZCBieSBgaHVnZXBhZ2VfbWFkdmlzZWAsIGFuZCBgTUFEVl9DT0xMQVBTRWAgYnkgYG1hZHZpc2VfY29sbGFwc2VgLiBJJiMzOTtsbCB3YW50IHRvIGluY2x1ZGUgYm90aCBpbiBteSBhbmFseXNpcy4KCk5vdywgYSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyBgbWFkdmlzZV9jb2xsYXBzZWAgaXRzZWxmIGRpcmVjdGx5IG1vZGlmaWVkIGJ5IHRoaXMgcGF0Y2g/IExldCBtZSBkb3VibGUtY2hlY2suLi4gbm8sIGl0IGlzbiYjMzk7dC4gSG93ZXZlciwgYG1hZHZpc2VfY29sbGFwc2VgICpkb2VzKiBjYWxsIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGUgcGF0Y2ggaGFzIHJlZmFjdG9yZWQgdGhlIFBURSBjaGVja2luZyBsb2dpYyB3aXRoaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIFNvLCBmdXp6aW5nIGBtYWR2aXNlX2NvbGxhcHNlYCB3aWxsIGRlZmluaXRlbHkgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGUgaW5kaXJlY3RseS4gSSBhbHNvIG5vdGUgdGhhdCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuCgpMZXQmIzM5O3Mgbm90IGZvcmdldCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmN5LiBJdCBzZWVtcyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBvbmx5IHJlbGV2YW50IGNvbmZpZy4KCkZpbmFsbHksIEkgd2FudCB0byBjb25maXJtIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgaHVnZXBhZ2VfbWFkdmlzZWAgYXJlbiYjMzk7dCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpZGVseS4gQXMgZXhwZWN0ZWQsIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBleGNsdXNpdmVseSBjYWxsZWQgd2hlbiBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgaXMgdXNlZCwgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBpcyBpbnZva2VkIG9ubHkgd2hlbiBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgYG1hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKWAgaXMgZXhlY3V0ZWQuIEV4Y2VsbGVudCwgdGhleSBhcmUgbm90LiBUaGF0IG1lYW5zIEkgY2FuIGZvY3VzIG15IGFuYWx5c2lzIG9uIHRoZW0gc3BlY2lmaWNhbGx5LgoKSSYjMzk7bSBub3cgcmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDssCiAgICAmIzM0O2h1Z2VwYWdlX21hZHZpc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OywKICAgICYjMzQ7aHVnZXBhZ2VfbWFkdmlzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYTgxODY2NzBkYTI2MzQwZWFhNWRiNGI1NDNkOWMxODJkMzYzNWY2NQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDExIDEzOjA0OjA1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NAotLS0gYS9tbS9raHVnZXBhZ2VkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va2h1Z2VwYWdlZC5jCkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7CiAJU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSywKIH07CiAKJiM0MztlbnVtIHB0ZV9jaGVja19yZXN1bHQgewomIzQzOwlQVEVfQ0hFQ0tfU1VDQ0VFRCwKJiM0MzsJUFRFX0NIRUNLX0ZBSUwsCiYjNDM7CVBURV9DSEVDS19DT05USU5VRSwKJiM0Mzt9OwomIzQzOwogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAmbHQ7dHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmZ3Q7CiAKQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHsKIAlERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiB9OwogCiYjNDM7c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHsKJiM0MzsJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwomIzQzOwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwlpbnQgbm9uZV9vcl96ZXJvOwomIzQzOwlpbnQgc2hhcmVkOwomIzQzOwlpbnQgdW5tYXBwZWQ7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0OwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7CiYjNDM7fTsKJiM0MzsKIC8qKgogICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmcKICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuCkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJCS8qCiAJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3QKIAkJICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuCi0JCSAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAomIzQzOwkJICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAogCQkgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZAogCQkgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suCiAJCSAqLwpAQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiYjNDM7ewomIzQzOwltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKJiM0MzsJbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJYml0bWFwX3plcm8oY2MtJmd0O210aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogCW5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sCkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU1IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLAogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogZm9saW9fcHRlX3JlZmVyZW5jZWQoKSAtIENoZWNrIGlmIGEgZm9saW8gb3IgaXRzIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlCiYjNDM7ICogb3IgdGhlIGN1cnJlbnQgUFRFIG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGV2YWwpCiYjNDM7ewomIzQzOwkvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi8KJiM0MzsJaWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogLi4uIG9yIHRoZSBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZCAqLwomIzQzOwlyZXR1cm4gcHRlX3lvdW5nKHB0ZXZhbCkgfHwgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LAomIzQzOwkJZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KQomIzQzO3sKJiM0MzsJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCiYjNDM7CQljb3VudF92bV9ldmVudCh2bV9ldmVudCk7CiYjNDM7CWNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmQKJiM0MzsgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCwKJiM0MzsJCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KQomIzQzO3sKJiM0MzsJY3R4LSZndDtyZXN1bHQgPSByZXN1bHQ7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfRkFJTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZQomIzQzOyAqCiYjNDM7ICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiYjNDM7ICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWQKJiM0MzsgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZQomIzQzOyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnQKJiM0MzsgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50CiYjNDM7ICoKJiM0MzsgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudAomIzQzOyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSwKJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSwKJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLgomIzQzOyAqLwomIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpCiYjNDM7ewomIzQzOwlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7bm9uZV9vcl96ZXJvICZndDsgY3R4LSZndDttYXhfcHRlc19ub25lKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CiYjNDM7CQlpZiAoY3R4LSZndDt1bm1hcHBlZCA9PSAtMSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpOwomIzQzOwkJfQomIzQzOwkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTsKJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJLyoKJiM0MzsJICogRG9uJiMzOTt0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkCiYjNDM7CSAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWQKJiM0MzsJICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZQomIzQzOwkgKiByZWdpc3RlcmVkIHJhbmdlLgomIzQzOwkgKi8KJiM0MzsJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTsKJiM0MzsKJiM0MzsJY3R4LSZndDtmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtJmd0O3ZtYSwgYWRkciwgcHRldmFsKTsKJiM0MzsJaWYgKHVubGlrZWx5KCFjdHgtJmd0O2ZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtJmd0O2ZvbGlvKSkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKJiM0MzsJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgomIzQzOwkgKi8KJiM0MzsJaWYgKGN0eC0mZ3Q7Y2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOyAhKGN0eC0mZ3Q7dm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKJiM0MzsJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LSZndDtmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpOwomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSkgewomIzQzOwkJVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTsKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtJmd0O2ZvbGlvKSkgewomIzQzOwkJLyoKJiM0MzsJCSAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyCiYjNDM7CQkgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWEKJiM0MzsJCSAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGEKJiM0MzsJCSAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O3NoYXJlZCAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7CiYjNDM7fQomIzQzOwogc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsCiAJCXVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjsKLQlwdGVfdCAqX3B0ZTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CXB0ZV90ICpfcHRlLCBwdGV2YWw7CiYjNDM7CWludCByZWZlcmVuY2VkID0gMDsKIAllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IG9yZGVyLAomIzQzOwkJLnVubWFwcGVkID0gLTEsIC8qIGRvbiYjMzk7dCBjaGVjayBzd2FwIFBURXMgKi8KJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksCiYjNDM7CQkubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksCiYjNDM7CX07CiAKIAlmb3IgKF9wdGUgPSBwdGU7IF9wdGUgJmx0OyBwdGUgJiM0MzsgbnJfcGFnZXM7CiAJICAgICBfcHRlJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCXB0ZV90IHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQlWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGV2YWwgPSBwdGVwX2dldChfcHRlKTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dDsKIAkJfQomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpCiYjNDM7CQkJY29udGludWU7CiAKLQkJLyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovCi0JCWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkgewotCQkJLyoKLQkJCSAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyCi0JCQkgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWEKLQkJCSAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGEKLQkJCSAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS4KLQkJCSAqLwotCQkJaWYgKCYjNDM7JiM0MztzaGFyZWQgJmd0OyBtYXhfcHRlc19zaGFyZWQpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KIAkJLyoKIAkJICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UmIzM5O2QgYWN0dWFsbHkKIAkJICogd2FudCB0byBjb2xsYXBzZS4KQEAgLTc1OSw4ICYjNDM7ODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAogCQkvKgogCQkgKiBXZSBjYW4gZG8gaXQgYmVmb3JlIGZvbGlvX2lzb2xhdGVfbHJ1IGJlY2F1c2UgdGhlCi0JCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrCi0JCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UKJiM0MzsJCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrCiYjNDM7CQkgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKCkKIAkJICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkgewpAQCAtNzg2LDcgJiM0Mzs4OTIsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl9CiAKIAkJLyoKLQkJICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlCiYjNDM7CQkgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2UKIAkJICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uCiAJCSAqLwogCQlpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkgewpAQCAtODAzLDE0ICYjNDM7OTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQogCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2ZvbGlvLSZndDtscnUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKIG5leHQ6Ci0JCS8qCi0JCSAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpcwotCQkgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZQotCQkgKi8KIAkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsKLQkJICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fAotCQkgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKLQkJICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtJmd0O3ZtX21tLCBhZGRyKSkpCiYjNDM7CQkgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSkKIAkJCXJlZmVyZW5jZWQmIzQzOyYjNDM7OwogCX0KIApAQCAtODE4LDEzICYjNDM7OTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwotCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sCiAJCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogb3V0OgogCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpOwotCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sCiYjNDM7CXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsCiAJICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUKIAkgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZwogCSAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLAotCSAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LgomIzQzOwkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LgogCSAqLwogCXBtZF9wdGwgPSBwbWRfbG9jayh2bWEtJmd0O3ZtX21tLCBwbWQpOwogCXBtZF9wb3B1bGF0ZSh2bWEtJmd0O3ZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7CkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCi0JICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKJiM0MzsJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZQogCSAqIHZtYXMuCiAJICovCiAJaWYgKGV4cGVjdF9hbm9uICZhbXA7JmFtcDsgKCEoKnZtYXApLSZndDthbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKQpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuCiAgKgogICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZQogICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0CkBAIC0xMjA0LDcgJiM0MzsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlwdGUgPSBOVUxMOwogCiAJCS8qCi0JCSAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLgomIzQzOwkJICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KIAkJICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2UKIAkJICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlCiAJCSAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLgpAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKIAkJcmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7CiAJfQogCi0JaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7Ci0JY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwomIzQzOwljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwogCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHsKIAkJZm9saW9fcHV0KGZvbGlvKTsKQEAgLTEyNzEsNyAmIzQzOzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydQogfQogCiAvKgotICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiYjNDM7ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmQKICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2sKICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLgogICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi4KQEAgLTEzMTgsNyAmIzQzOzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJaWYgKHVubWFwcGVkKSB7CiAJCS8qCi0JCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9jawomIzQzOwkJICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKIAkJICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluCiAJCSAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuCiAJCSAqLwpAQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJLyoKIAkgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKLQkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk0KLQkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IFBHX2xvY2suCiYjNDM7CSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQlzcGluX2xvY2socG1kX3B0bCk7CiAJCVZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpOwogCQkvKgotCQkgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZwomIzQzOwkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZwogCQkgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdAotCQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0CiYjNDM7CQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXQKIAkJICovCiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCXNwaW5fdW5sb2NrKHBtZF9wdGwpOwpAQCAtMTQzOSw3ICYjNDM7MTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJCQlzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAkJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTsKIAkJbWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLAotCQkJCQkgIC8qdWZmZF93cD0qLyBmYWxzZSk7CiYjNDM7CQkJCQkgIC8qdWZmZD0qLyBmYWxzZSk7CiAJCWlmIChwdGVfcHRsICE9IHBtZF9wdGwpCiAJCQlzcGluX3VubG9jayhwdGVfcHRsKTsKIAl9CkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwogb3V0X3VwX3dyaXRlOgotCWlmIChhbm9uX3ZtYV9sb2NrZWQpCi0JCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAlpZiAocHRlKQogCQlwdGVfdW5tYXAocHRlKTsKJiM0MzsJaWYgKGFub25fdm1hX2xvY2tlZCkKJiM0MzsJCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAltbWFwX3dyaXRlX3VubG9jayhtbSk7CiBvdXRfbm9sb2NrOgogCWlmIChmb2xpbykKQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAogCQlib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTsKLQl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTsKIAllbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLSZndDtpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDsKIAlpbnQgaTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7Ci0JZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKIAogCVZNX0JVR19PTihzdGFydF9hZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiAKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUiwKJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJfTsKJiM0MzsKIAlyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgJmFtcDtwbWQpOwogCWlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7CiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAJCWdvdG8gb3V0OwogCX0KIAotCWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCiAJZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtJmd0O3ZtX2ZsYWdzLCB0dmFfZmxhZ3MpOwogCiAJLyoKIAkgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2UKLQkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLgomIzQzOwkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwCiYjNDM7CSAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLgogCSAqLwogCWlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSkKLQkJbWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiYjNDM7CQljdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiAKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsICZhbXA7cHRsKTsKIAlpZiAoIXB0ZSkgewpAQCAtMTY0NCw4NCAmIzQzOzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAkJY2MtJmd0O3Byb2dyZXNzJiM0MzsmIzQzOzsKIAotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3VubWFwcGVkICZndDsgbWF4X3B0ZXNfc3dhcCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQkvKgotCQkJICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3AKLQkJCSAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZQotCQkJICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS4KLQkJCSAqLwotCQkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkgewotCQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJLyoKLQkJCSAqIERvbiYjMzk7dCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsCi0JCQkgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi4KLQkJCSAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzCi0JCQkgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzCi0JCQkgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93bgotCQkJICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZgotCQkJICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuCi0JCQkgKi8KLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dF91bm1hcDsKIAkJfQotCi0JCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0FOT047Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFAKLQkJICogaXMgc2hhcmVkLgotCQkgKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCS8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovCiAJCV9fc2V0X2JpdChpLCBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMpOwpAQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qCiAJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy4KIAkJICoKLQkJICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6Ci0JCSAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSAmZ3Q7IGZvbGlvX3JlZl9jb3VudCgpLgotCQkgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UKLQkJICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2UKLQkJICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrCi0JCSAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuCiYjNDM7CQkgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmQKJiM0MzsJCSAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lCiYjNDM7CQkgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgogCQkgKi8KIAkJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkgewogCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UOwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KIAotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCiAJCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsKIAkJICAgKCFyZWZlcmVuY2VkIHx8Ci0JCSAgICAodW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiYjNDM7CQkgICAgKGN0eC51bm1hcHBlZCAmYW1wOyZhbXA7IHJlZmVyZW5jZWQgJmx0OyBIUEFHRV9QTURfTlIgLyAyKSkpIHsKIAkJcmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTsKIAl9IGVsc2UgewogCQlyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7CkBAIC0xNzgxLDE2ICYjNDM7MTgwNCwxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIG91dF91bm1hcDoKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKIAlpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkgewotCQkvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiYjNDM7CQkvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi8KIAkJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJCXJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsCi0JCQkJICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwomIzQzOwkJCQkgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwogCQkvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovCiAJCSpsb2NrX2Ryb3BwZWQgPSB0cnVlOwogCX0KIG91dDoKIAl0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwKLQkJCQkgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7CiYjNDM7CQkJCSAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI2OTEsOCAmIzQzOzI3MTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlwcmVzZW50ID0gMDsKIAlzd2FwID0gMDsKLQltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKLQlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwljb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7CiAJcmN1X3JlYWRfbG9jaygpOwogCXhhc19mb3JfZWFjaCgmYW1wO3hhcywgZm9saW8sIHN0YXJ0ICYjNDM7IEhQQUdFX1BNRF9OUiAtIDEpIHsKIAkJaWYgKHhhc19yZXRyeSgmYW1wO3hhcywgZm9saW8pKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTExNDIKCQkJCQkJCW91dHB1dDogMjA0CgkJCQkJCQl0aG91Z2h0czogMTYxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBraHVnZXBhZ2VkIFJlZmFjdG9yaW5nIGZvciBLTVNBTiBSZWxldmFuY2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyByZWZhY3RvcmluZyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBga2h1Z2VwYWdlZGAsIHNwZWNpZmljYWxseSBpbiBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludHJvZHVjdGlvbiBvZiBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIHJlZmFjdG9yaW5nIG9mIHRoZSBleGlzdGluZyBjb2RlIGludG8gaGVscGVyIGZ1bmN0aW9ucyBsaWtlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEFsc28sIHRoZXkgYXJlIGFkZGluZyBzb21lIG5ldyBmdW5jdGlvbnMgbGlrZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBwdGVfY2hlY2tfZmFpbCgpYC4gVGhlIG1haW4gZ29hbCBzZWVtcyB0byBiZSB0byBpbXByb3ZlIHRoZSBjb2RlJiMzOTtzIHN0cnVjdHVyZSwgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBLTVNBTi1kZXRlY3RhYmxlIGlzc3Vlcy4KCkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0OgoKYGBgYwpzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgewoJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwoJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Cgl1bnNpZ25lZCBpbnQgb3JkZXI7CglzdHJ1Y3QgZm9saW8gKmZvbGlvOwoJaW50IG5vbmVfb3JfemVybzsKCWludCBzaGFyZWQ7CglpbnQgdW5tYXBwZWQ7CgllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDsKCXVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lOwoJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7Cgl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkOwp9OwpgYGAKCkFscmlnaHQsIEkgc2VlIGhvdyBpdCYjMzk7cyB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYDoKCmBgYGMKCXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CgkJLmNjID0gY2MsCgkJLnZtYSA9IHZtYSwKCQkub3JkZXIgPSBvcmRlciwKCQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwoJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksCgkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLAoJfTsKYGBgCgpJbXBvcnRhbnQgcG9pbnQgaGVyZTogIGBjdHgubm9uZV9vcl96ZXJvYCBhbmQgYGN0eC5zaGFyZWRgIGFyZSAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCdXQgd2FpdCwgSSYjMzk7bSBwcmV0dHkgc3VyZSBpbiBDLCBpZiB5b3UgZG9uJiMzOTt0IGluaXRpYWxpemUgYSBzdHJ1Y3QgbWVtYmVyIGl0IGdvZXMgdG8gemVybywgdGhlIHplcm8taW5pdGlhbGl6YXRpb24gcnVsZXMuIFF1aWNrIGNoZWNrIG9uIHRoZSBDIHN0YW5kYXJkIGp1c3QgdG8gYmUgc3VyZTogeWVwLCBtaXNzaW5nIGZpZWxkcyBpbiBhbiBpbml0aWFsaXplciBsaXN0IGFyZSBpbml0aWFsaXplZCBhcyBpZiB0aGV5IGhhZCBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbiAoaS5lLiwgemVyb2VkKS4gVGhhdCBtZWFucyBgbm9uZV9vcl96ZXJvYCwgYHNoYXJlZGAsIGByZXN1bHRgLCBgZm9saW9gLCBhbmQgYG1heF9wdGVzX3N3YXBgIHdpbGwgYWxsIGJlIHplcm8uICBObyBwcm9ibGVtIHRoZXJlLiAgSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgbG9naWMsIHRob3VnaCwgdG8gbWFrZSBzdXJlIHRoaXMgaXMgd2hhdCBpcyBleHBlY3RlZC4KCkkgYWxzbyBjaGVja2VkIGhvdyB0aGlzIHN0cnVjdCBpcyB1c2VkIGluIGBjb2xsYXBzZV9zY2FuX3BtZGAsIHdoZXJlIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYHJlc3VsdGAgYXJlIHNpbWlsYXJseSBsZWZ0IHVuaW5pdGlhbGl6ZWQgYW5kIHRodXMgd2lsbCBiZSBpbXBsaWNpdGx5IHplcm9lZC4KCk9rYXksIGxldCYjMzk7cyBtYWtlIHN1cmUgbm90aGluZyBpcyB1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gIFRoZSBtYWluIHJpc2sgd291bGQgYmUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYmVpbmcgcmVhZCBhbmQgdXNlZCBpbiBsb2dpYyBvciBjb21wYXJpc29ucy4KCkkgY2hlY2tlZCBgY3R4LnVubWFwcGVkYCwgd2hpY2ggaXMgaW5pdGlhbGx5IHplcm8taW5pdGlhbGl6ZWQgaW4gbW9zdCBjYXNlcywgdGhlbiBzZXQgdG8gYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAuIE5vdyBsZXQmIzM5O3Mgc2VlIHdoZXJlIHRoYXQgaXMgdXNlZC4gSXQgbG9va3MgbGlrZSBpdCBpcyB1c2VkIGluIGBjb2xsYXBzZV9zY2FuX3BtZGA6CgpgYGBjCglpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwoJCSAgICghcmVmZXJlbmNlZCB8fAoJCSAgICAoY3R4LnVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewpgYGAKCkxvb2tzIGxpa2UgaXQgaXMgYmVpbmcgdXNlZCBzYWZlbHkuIEl0IGlzIGluY3JlbWVudGVkIGxhdGVyIGluIGBjb2xsYXBzZV9jaGVja19wdGVgOgoKYGBgYwoJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CgkJaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCgkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKCQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKYGBgCgpTbyBpdCBsb29rcyBsaWtlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIChvciB0aGUgLTEgaW4gdGhlIG9uZSBjYXNlKSBpcyBkZWxpYmVyYXRlLiBHb29kLgoKSSYjMzk7bSBhbHNvIGxvb2tpbmcgYXQgdGhlIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYylgIGZ1bmN0aW9uLiBTZWVtcyB0aGlzIGlzIGJlaW5nIHJlcGxhY2VkIGluIGEgdmVyeSBzdHJhaWdodGZvcndhcmQgd2F5LCBzbyBJIGRvbiYjMzk7dCBzZWUgYW55IGlzc3VlLgoKTm93LCBjaGVja2luZyB0aGUgYC0xYCBpbml0aWFsaXphdGlvbiBvZiBgdW5tYXBwZWRgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgaXQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBwcmV2aW91cyBsb2dpYyBhbmQgYXBwZWFycyBzYWZlLgoKU28sIGlzIHRoZXJlIGFueSBLTVNBTiByaXNrPyBJIGRvbiYjMzk7dCB0aGluayBzby4gVGhpcyBwYXRjaCBpcyBtb3N0bHkgYSAqcmVmYWN0b3JpbmcqIG9mIGBraHVnZXBhZ2VkYCYjMzk7cyBQVEUgc2Nhbm5pbmcuIEl0JiMzOTtzIG5vdCBkaXJlY3RseSBpbnRlcmFjdGluZyB3aXRoIHVzZXIgc3BhY2UKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDQ6MDcuNzU4ODQxNzQ4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMzMDY0OTA2NDQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiLFxuICAgIFwiaHVnZXBhZ2VfbWFkdmlzZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA0OjA3Ljc1ODg0NzA5OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyMjkxNjc3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBBdWcgMTEgMTM6MDQ6MDUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcXG5AQCAtMjI0LDcgKzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcXG4gdG8gXFxcImFsd2F5c1xcXCIgb3IgXFxcIm1hZHZpc2VcXFwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxcbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXFxcIm5ldmVyXFxcIilcXG4rdG9wLWxldmVsIGNvbnRyb2wgYXJlIFxcXCJuZXZlclxcXCIpLlxcbiBcXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxcbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxcbithbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxcbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxcbisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXFx1MDAzY3NpemVcXHUwMDNla0Ivc3RhdHMvKTo6XFxuIFxcbiBcXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxcbiBcXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXFxuaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDRcXG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcXG5AQCAtNjUsNiArNjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XFxuIFxcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXFxuIH07XFxuIFxcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xcbitcXHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcXG4rXFx0UFRFX0NIRUNLX0ZBSUwsXFxuK1xcdFBURV9DSEVDS19DT05USU5VRSxcXG4rfTtcXG4rXFxuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xcbiAjaW5jbHVkZSBcXHUwMDNjdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcXHUwMDNlXFxuIFxcbkBAIC0xMTksNiArMTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcXG4gXFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbiB9O1xcbiBcXG4rc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHtcXG4rXFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xcbitcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyO1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgbm9uZV9vcl96ZXJvO1xcbitcXHRpbnQgc2hhcmVkO1xcbitcXHRpbnQgdW5tYXBwZWQ7XFxuK1xcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XFxuK307XFxuK1xcbiAvKipcXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cXG5AQCAtNjIwLDcgKzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcXG4gXFx0XFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXFxuLVxcdFxcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbitcXHRcXHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXFxuIFxcdFxcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXFxuIFxcdFxcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cXG4gXFx0XFx0ICovXFxuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4gXFx0fVxcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuK3tcXG4rXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuK1xcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGJpdG1hcF96ZXJvKGNjLVxcdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4gXFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG5AQCAtNjY1LDc2ICs2OTIsMTU1IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXFxuKyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90IHB0ZXZhbClcXG4re1xcbitcXHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cXG4rXFx0aWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHQvKiAuLi4gb3IgdGhlIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkICovXFxuK1xcdHJldHVybiBwdGVfeW91bmcocHRldmFsKSB8fCBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXFxuK1xcdFxcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcXG4re1xcbitcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4rXFx0XFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xcbitcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxcbitcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcXG4re1xcbitcXHRjdHgtXFx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcXG4rXFx0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xcbit9XFxuK1xcbisvKlxcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxcbisgKlxcbisgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcXG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcXG4rICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XFxuKyAqXFxuKyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cXG4rICovXFxuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcXG4re1xcbitcXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XFxuK1xcdFxcdGlmICgrK2N0eC1cXHUwMDNlbm9uZV9vcl96ZXJvIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19ub25lKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcXG4rXFx0fVxcbitcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNldW5tYXBwZWQgPT0gLTEpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2V1bm1hcHBlZCBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcXG4rfVxcbitcXG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xcbi1cXHRwdGVfdCAqX3B0ZTtcXG4tXFx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xcbitcXHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuIFxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbitcXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gb3JkZXIsXFxuK1xcdFxcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cXG4rXFx0XFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxcbitcXHR9O1xcbiBcXG4gXFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFxcdTAwM2MgcHRlICsgbnJfcGFnZXM7XFxuIFxcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxcbi1cXHRcXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXFx1MDAyNlxcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXFxuLVxcdFxcdFxcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxcbi1cXHRcXHRcXHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXFxuLVxcdFxcdFxcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XFxuIFxcdFxcdCAqIHdhbnQgdG8gY29sbGFwc2UuXFxuQEAgLTc1OSw4ICs4NjUsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXFxuLVxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4rXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xcbkBAIC03ODYsNyArODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXFxuK1xcdFxcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxcbiBcXHRcXHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XFxuQEAgLTgwMywxNCArOTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZmb2xpby1cXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuIG5leHQ6XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4gXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcXG4gXFx0XFx0XFx0cmVmZXJlbmNlZCsrO1xcbiBcXHR9XFxuIFxcbkBAIC04MTgsMTMgKzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuLVxcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdFxcdHJldHVybiByZXN1bHQ7XFxuIFxcdH1cXG4gb3V0OlxcbiBcXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tXFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcXG4rXFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXFxuIFxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4gXFx0cmV0dXJuIHJlc3VsdDtcXG4gfVxcbkBAIC05MDQsNyArMTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuIFxcdCAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlXFxuIFxcdCAqIGVudHJ5LiBSZXN0b3JpbmcgUE1EIG5lZWRzIHRvIGJlIGRvbmUgcHJpb3IgdG8gcmVsZWFzaW5nXFxuIFxcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxcbi1cXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS5cXG4rXFx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cXG4gXFx0ICovXFxuIFxcdHBtZF9wdGwgPSBwbWRfbG9jayh2bWEtXFx1MDAzZXZtX21tLCBwbWQpO1xcbiBcXHRwbWRfcG9wdWxhdGUodm1hLVxcdTAwM2V2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpO1xcbkBAIC0xMDc4LDkgKzExNzgsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxcbiBcXHRcXHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XFxuIFxcdC8qXFxuIFxcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxcbi1cXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXFxuK1xcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXFxuIFxcdCAqXFxuLVxcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXFxuK1xcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcXG4gXFx0ICogdm1hcy5cXG4gXFx0ICovXFxuIFxcdGlmIChleHBlY3RfYW5vbiBcXHUwMDI2XFx1MDAyNiAoISgqdm1hcCktXFx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXFxuQEAgLTExMzYsNyArMTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIC8qXFxuICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxuKyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxuICAqXFxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XFxuQEAgLTEyMDQsNyArMTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0cHRlID0gTlVMTDtcXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxcbitcXHRcXHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxcbiBcXHRcXHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxcbiBcXHRcXHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcXG4gXFx0XFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXFxuQEAgLTEyNDcsMTUgKzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcXG4gXFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFxcdTAwMjZjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbiBcXHRpZiAoIWZvbGlvKSB7XFxuIFxcdFxcdCpmb2xpb3AgPSBOVUxMO1xcbi1cXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XFxuLVxcdFxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XFxuK1xcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxcbitcXHRcXHRcXHRcXHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbiBcXHRcXHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XFxuLVxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4rXFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuQEAgLTEyNzEsNyArMTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XFxuIH1cXG4gXFxuIC8qXFxuLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxcbisgKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxcbiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrXFxuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxcbiAgKiBOb3RlIHRoYXQgdGhlIFZNQSBtdXN0IGJlIHJlY2hlY2tlZCBhZnRlciBncmFiYmluZyB0aGUgbW1hcF9sb2NrIGFnYWluLlxcbkBAIC0xMzE4LDcgKzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXG4gXFx0aWYgKHVubWFwcGVkKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbitcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbiBcXHRcXHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cXG4gXFx0XFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cXG4gXFx0XFx0ICovXFxuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2ZcXG4tXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXFxuLVxcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxcbitcXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTVxcbitcXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgZm9saW8gbG9jay5cXG4gXFx0ICpcXG4gXFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXFxuIFxcdCAqIG1tYXBfbG9jay5cXG5AQCAtMTM4OSw5ICsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcXG4gXFx0XFx0c3Bpbl9sb2NrKHBtZF9wdGwpO1xcbiBcXHRcXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmdcXG4rXFx0XFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xcbiBcXHRcXHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxcbi1cXHRcXHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XFxuK1xcdFxcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUoKSBmb3IgdGhhdFxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcXG4gXFx0XFx0c3Bpbl91bmxvY2socG1kX3B0bCk7XFxuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdFxcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xcbiBcXHRcXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xcbiBcXHRcXHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xcbiBcXHRcXHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxcbiBcXHRcXHRcXHRzcGluX3VubG9jayhwdGVfcHRsKTtcXG4gXFx0fVxcbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcbiBcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuIG91dF91cF93cml0ZTpcXG4tXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRpZiAocHRlKVxcbiBcXHRcXHRwdGVfdW5tYXAocHRlKTtcXG4rXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4rXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XFxuIG91dF9ub2xvY2s6XFxuIFxcdGlmIChmb2xpbylcXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4gXFx0XFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG4gXFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcXG4gXFx0cG1kX3QgKnBtZDtcXG4gXFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcXG4gXFx0aW50IGk7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4tXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuK1xcdGludCByZWZlcmVuY2VkID0gMDtcXG4rXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkcjtcXG4gXFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xcbitcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4gXFxuIFxcdFZNX0JVR19PTihzdGFydF9hZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4gXFxuK1xcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XFxuK1xcdFxcdC5jYyA9IGNjLFxcbitcXHRcXHQudm1hID0gdm1hLFxcbitcXHRcXHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdH07XFxuK1xcbiBcXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXFx1MDAyNnBtZCk7XFxuIFxcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0Yml0bWFwX3plcm8oY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4tXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuLVxcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4gXFxuIFxcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxcbi1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxcbitcXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxuK1xcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxcbi1cXHRcXHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4rXFx0XFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xcbiBcXG4gXFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcXHUwMDI2cHRsKTtcXG4gXFx0aWYgKCFwdGUpIHtcXG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrdW5tYXBwZWQgXFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxcbi1cXHRcXHRcXHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcXG4tXFx0XFx0XFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxcbi1cXHRcXHRcXHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cXG4tXFx0XFx0XFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcXG4tXFx0XFx0XFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xcbi1cXHRcXHRcXHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxcbi1cXHRcXHRcXHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXFxuLVxcdFxcdFxcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbi1cXG4tXFx0XFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xcbi1cXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxcbi1cXHRcXHQgKiBpcyBzaGFyZWQuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0aWYgKCsrc2hhcmVkIFxcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XFxuLVxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXFxuIFxcdFxcdF9fc2V0X2JpdChpLCBjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xcbkBAIC0xNzQ5LDMxICsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5Olxcbi1cXHRcXHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cXG4tXFx0XFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXFxuLVxcdFxcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXFxuLVxcdFxcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xcbi1cXHRcXHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxcbitcXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcXG4rXFx0XFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcXG4rXFx0XFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcXG4gXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXFxuLVxcdFxcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXFxuLVxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSkpXFxuK1xcdFxcdCAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKVxcbiBcXHRcXHRcXHRyZWZlcmVuY2VkKys7XFxuIFxcdH1cXG4gXFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICghcmVmZXJlbmNlZCB8fFxcbi1cXHRcXHQgICAgKHVubWFwcGVkIFxcdTAwMjZcXHUwMDI2IHJlZmVyZW5jZWQgXFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcXG4rXFx0XFx0ICAgIChjdHgudW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuQEAgLTE3ODEsMTYgKzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIG91dF91bm1hcDpcXG4gXFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XFxuIFxcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XFxuLVxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4rXFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXFxuIFxcdFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHRcXHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuK1xcdFxcdFxcdFxcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuIFxcdFxcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cXG4gXFx0XFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XFxuIFxcdH1cXG4gb3V0OlxcbiBcXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcXG4tXFx0XFx0XFx0XFx0ICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpO1xcbitcXHRcXHRcXHRcXHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcXG4gXFx0cmV0dXJuIHJlc3VsdDtcXG4gfVxcbiBcXG5AQCAtMjY5MSw4ICsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0cHJlc2VudCA9IDA7XFxuIFxcdHN3YXAgPSAwO1xcbi1cXHRtZW1zZXQoY2MtXFx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVxcdTAwM2Vub2RlX2xvYWQpKTtcXG4tXFx0bm9kZXNfY2xlYXIoY2MtXFx1MDAzZWFsbG9jX25tYXNrKTtcXG4rXFx0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xcbiBcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdHhhc19mb3JfZWFjaChcXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XFxuIFxcdFxcdGlmICh4YXNfcmV0cnkoXFx1MDAyNnhhcywgZm9saW8pKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDowOS4xODI0OTc0OTFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyMDk5MDUxNjY4OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCIsXG4gICAgXCJodWdlcGFnZV9tYWR2aXNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhODE4NjY3MGRhMjYzNDBlYWE1ZGI0YjU0M2Q5YzE4MmQzNjM1ZjY1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTEgMTM6MDQ6MDUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcImFsd2F5c1wiIG9yIFwibWFkdmlzZVwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIilcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDRcbi0tLSBhL21tL2todWdlcGFnZWQuY1xuKysrIGIvbW0va2h1Z2VwYWdlZC5jXG5AQCAtNjUsNiArNjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcbitcdFBURV9DSEVDS19TVUNDRUVELFxuK1x0UFRFX0NIRUNLX0ZBSUwsXG4rXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXG4rfTtcbitcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOSw2ICsxMjUsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wge1xuIFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuIH07XG4gXG4rc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHtcbitcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuK1x0dW5zaWduZWQgaW50IG9yZGVyO1xuK1x0c3RydWN0IGZvbGlvICpmb2xpbztcbitcdGludCBub25lX29yX3plcm87XG4rXHRpbnQgc2hhcmVkO1xuK1x0aW50IHVubWFwcGVkO1xuK1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbit9O1xuK1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyArNjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdFx0LypcbiBcdFx0ICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdFxuIFx0XHQgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW5cbi1cdFx0ICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4rXHRcdCAqIHVuZGVyIG1tYXBfbG9jayByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbiBcdFx0ICogcGFnZXRhYmxlcyB3aWxsIGJlIGRlc3Ryb3llZCkgdW50aWwga2h1Z2VwYWdlZCBoYXMgZmluaXNoZWRcbiBcdFx0ICogd29ya2luZyBvbiB0aGUgcGFnZXRhYmxlcyB1bmRlciB0aGUgbW1hcF9sb2NrLlxuIFx0XHQgKi9cbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbit7XG4rXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4rXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcbkBAIC02NjUsNzYgKzY5MiwxNTUgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfcGFnZXMocHRlX3QgKnB0ZSwgcHRlX3QgKl9wdGUsXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogZm9saW9fcHRlX3JlZmVyZW5jZWQoKSAtIENoZWNrIGlmIGEgZm9saW8gb3IgaXRzIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkXG4rICpcbisgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXG4rICogb3IgdGhlIGN1cnJlbnQgUFRFIG1hcHBpbmcuXG4rICovXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90IHB0ZXZhbClcbit7XG4rXHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cbitcdGlmIChmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fCBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdC8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi9cbitcdHJldHVybiBwdGVfeW91bmcocHRldmFsKSB8fCBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbitcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuK3tcbitcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuK1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4rXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuK31cbitcbisvKlxuKyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4rXHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuK3tcbitcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4rXHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4rfVxuK1xuKy8qXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbisgKlxuKyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbisgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuKyAqXG4rICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbisgKi9cbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4re1xuK1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbitcdFx0fVxuK1x0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuK1x0fVxuK1x0LypcbitcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXG4rXHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4rXHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4rXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxuK1x0ICovXG4rXHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXG4rXHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbitcdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuK1xuK1x0LypcbitcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbitcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbitcdCAqL1xuK1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO1xuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4rXHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuK1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4rXHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbitcdFx0ICovXG4rXHRcdGlmICgrK2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuK31cbitcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbitcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gb3JkZXIsXG4rXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuK1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggKzg2NSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbitcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyArODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbitcdFx0ICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlXG4gXHRcdCAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHtcbkBAIC04MDMsMTQgKzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdCAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKVxuIFx0XHRcdHJlZmVyZW5jZWQrKztcbiBcdH1cbiBcbkBAIC04MTgsMTMgKzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuLVx0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxuK1x0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG4gb3V0OlxuIFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XG4tXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxuK1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICsxMDA0LDcgQEAgc3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlX3QgKnB0ZSxcbiBcdCAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlXG4gXHQgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZ1xuIFx0ICogcGFnZXMuIFNpbmNlIHBhZ2VzIGFyZSBzdGlsbCBpc29sYXRlZCBhbmQgbG9ja2VkIGhlcmUsXG4tXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS5cbitcdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlKCkgaXMgdW5uZWNlc3NhcnkuXG4gXHQgKi9cbiBcdHBtZF9wdGwgPSBwbWRfbG9jayh2bWEtXHUwMDNldm1fbW0sIHBtZCk7XG4gXHRwbWRfcG9wdWxhdGUodm1hLVx1MDAzZXZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7XG5AQCAtMTA3OCw5ICsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuK1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4tXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuK1x0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbiBcdCAqL1xuIFx0aWYgKGV4cGVjdF9hbm9uIFx1MDAyNlx1MDAyNiAoISgqdm1hcCktXHUwMDNlYW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSlcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4rICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbiAgKlxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcbkBAIC0xMjA0LDcgKzEzMDQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHB0ZSA9IE5VTEw7XG4gXG4gXHRcdC8qXG4tXHRcdCAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuK1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuK1x0XHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcbitcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4rXHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuIFxuIFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbkBAIC0xMjcxLDcgKzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIH1cbiBcbiAvKlxuLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxuKyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdGlmICh1bm1hcHBlZCkge1xuIFx0XHQvKlxuLVx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbitcdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbiBcdFx0ICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluXG4gXHRcdCAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuXG4gXHRcdCAqL1xuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIFBHX2xvY2suXG4rXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTVxuK1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXG4gXHQgKlxuIFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXG4gXHQgKiBtbWFwX2xvY2suXG5AQCAtMTM4OSw5ICsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0c3Bpbl9sb2NrKHBtZF9wdGwpO1xuIFx0XHRWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTtcbiBcdFx0Lypcbi1cdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmdcbitcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4rXHRcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUoKSBmb3IgdGhhdFxuIFx0XHQgKi9cbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0c3Bpbl91bmxvY2socG1kX3B0bCk7XG5AQCAtMTQzOSw3ICsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4rXHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4gb3V0X3VwX3dyaXRlOlxuLVx0aWYgKGFub25fdm1hX2xvY2tlZClcbi1cdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRpZiAocHRlKVxuIFx0XHRwdGVfdW5tYXAocHRlKTtcbitcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbiBcdFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpO1xuIFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIFx0cG1kX3QgKnBtZDtcbiBcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XG4gXHRpbnQgaTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbi1cdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuK1x0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4rXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0fTtcbitcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4rXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4rXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cbiBcdCAqL1xuIFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxuLVx0XHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbitcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrbm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrdW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24ndCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsXG4tXHRcdFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXG4tXHRcdFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcbi1cdFx0XHQgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzXG4tXHRcdFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cbi1cdFx0XHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXG4tXHRcdFx0ICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuLVxuLVx0XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQXG4tXHRcdCAqIGlzIHNoYXJlZC5cbi1cdFx0ICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSArMTc4MSwyMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0LypcbiBcdFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxuIFx0XHQgKlxuLVx0XHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcbi1cdFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cbi1cdFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXG4tXHRcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXG4tXHRcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xuLVx0XHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuK1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbitcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbitcdFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiBcdFx0ICovXG4gXHRcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcbiBcdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQ09VTlQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuIFx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0ICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuLVx0XHQgICAgKHVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbitcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODEsMTYgKzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gb3V0X3VubWFwOlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XG4gXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xuLVx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4rXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xuIFx0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdFx0cmVzdWx0ID0gbXRocF9jb2xsYXBzZShtbSwgc3RhcnRfYWRkciwgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbitcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4rXHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuIFxuQEAgLTI2OTEsOCArMjcxNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdHByZXNlbnQgPSAwO1xuIFx0c3dhcCA9IDA7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XG4gXHRcdGlmICh4YXNfcmV0cnkoXHUwMDI2eGFzLCBmb2xpbykpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDowOS4xODI0OTg2NDJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTY5NTYzNTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS9raHVnZXBhZ2VkLmNgLiBJdCBzZWVtcyB0aGV5J3ZlIHJlb3JnYW5pemVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5J3ZlIGNsZXZlcmx5IGV4dHJhY3RlZCB0aGlzIGxvZ2ljIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBHb29kIG1vdmUg4oCTIGtlZXBzIHRoaW5ncyBjbGVhbmVyIGFuZCBtb3JlIG1vZHVsYXIuIFRoZXkndmUgYWxzbyBpbnRyb2R1Y2VkIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBhcm91bmQuIFRoYXQgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhpcyBraW5kIG9mIGludHJpY2F0ZSBQVEUgbWFuaXB1bGF0aW9uLlxuXG5BbmQgYWgsIHRoZXJlJ3MgYSBuZXcgaGVscGVyLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuIFRoYXQncyBpbnRlcmVzdGluZywgcHJvYmFibHkgc2ltcGxpZmllcyBzb21lIGNoZWNrcy4gTm93LCB0aGUgbWVhdCBvZiBpdDogdGhleSd2ZSBzd2l0Y2hlZCBmcm9tIGBwYWdlID0gdm1fbm9ybWFsX3BhZ2UoKWAgdG8gYGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKClgIHdpdGhpbiB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGUoKWAgZnVuY3Rpb24uIFdhaXQgYSBzZWNvbmQuLi4gYHZtX25vcm1hbF9mb2xpbygpYD8gSSB0aG91Z2h0IHdlIHdlcmUgc3RpbGwgdXNpbmcgYHZtX25vcm1hbF9wYWdlKClgIGluIHNvbWUgcGxhY2VzLiBMZXQncyBtYWtlIHN1cmUgdGhhdCBmdW5jdGlvbiBhY3R1YWxseSAqZXhpc3RzKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFRpbWUgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgY29uZmlybS4gTGV0J3Mgc2VlIGlmIHRoaXMgaXMgdHJ1bHkgYSBzdHJhaWdodGZvcndhcmQgcmVmYWN0b3IsIG9yIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGVsc2UgZ29pbmcgb24gaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExNDUsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDoxNC4zNTIwNjQ4NTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5ODA4NzQ3MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9ub3JtYWxfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTcwMS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jPTE3NzA9c3RhdGljIGludCBjbGVhcl9yZWZzX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTgxNjpcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNy1cXHRcXHRpZiAoIWZvbGlvKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XFxuaW5jbHVkZS9saW51eC9tbS5oLTMyMDQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjMyMDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNi1cXHRcXHRcXHQgICAgIHB0ZV90IHB0ZSk7XFxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyMDgtXFx0XFx0XFx0ICAgICBwdGVfdCBwdGUpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMjA5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIxMC1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgcG1kKTtcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo0MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy00MDYtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVxcdFxcdGdvdG8gb3V0O1xcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjUzLVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo2NTQ6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy02NTUtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjc2LVxcdFxcdFxcdGNvbnRpbnVlO1xcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVxcdFxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTc5NT1zdGF0aWMgaW50IGRhbW9zX3ZhX3N0YXRfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxcbm1tL2RhbW9uL3ZhZGRyLmM6ODE1OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtODE2LVxcbi0tXFxubW0vZGFtb24vdmFkZHIuYy04MzktXFxubW0vZGFtb24vdmFkZHIuYzo4NDA6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vZGFtb24vdmFkZHIuYy04NDEtXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXFxubW0vaHVnZV9tZW1vcnkuYzoyMzA4OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTI0NjUtXFx0aWYgKGlzX3ByZXNlbnQpXFxubW0vaHVnZV9tZW1vcnkuYzoyNDY2OlxcdFxcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcXG5tbS9odWdlX21lbW9yeS5jLTI0NjctXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03NzctXFxubW0va2h1Z2VwYWdlZC5jOjc3ODpcXHRjdHgtXFx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xcbm1tL2todWdlcGFnZWQuYy03NzktXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuLS1cXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbi0tXFxubW0va3NtLmMtNjM4LVxcdFxcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XFxubW0va3NtLmM6NjM5OlxcdFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlKTtcXG5tbS9rc20uYy02NDAtXFx0XFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xcbi0tXFxubW0vbWFkdmlzZS5jPTM1Mz1zdGF0aWMgaW50IG1hZHZpc2VfY29sZF9vcl9wYWdlb3V0X3B0ZV9yYW5nZShwbWRfdCAqcG1kLFxcbi0tXFxubW0vbWFkdmlzZS5jLTQ3NS1cXG5tbS9tYWR2aXNlLmM6NDc2OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21hZHZpc2UuYy00NzctXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tYWR2aXNlLmMtNzA0LVxcbm1tL21hZHZpc2UuYzo3MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWFkdmlzZS5jLTcwNi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbW9yeS5jPTgyND1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTgzMy0vKipcXG5tbS9tZW1vcnkuYzo4MzQ6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURVxcbm1tL21lbW9yeS5jLTgzNS0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXFxuLS1cXG5tbS9tZW1vcnkuYy04NDQtICovXFxubW0vbWVtb3J5LmM6ODQ1OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vbWVtb3J5LmMtODQ2LVxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuLS1cXG5tbS9tZW1vcnkuYz04Njg9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtODc3LS8qKlxcbm1tL21lbW9yeS5jOjg3ODogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbm1tL21lbW9yeS5jLTg3OS0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXFxuLS1cXG5tbS9tZW1vcnkuYy04ODgtICovXFxubW0vbWVtb3J5LmM6ODg5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9tZW1vcnkuYy04OTAtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcXG4tLVxcbm1tL21lbW9yeS5jPTYyODk9c3RhdGljIHZtX2ZhdWx0X3QgZG9fbnVtYV9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjMyNC1cXG5tbS9tZW1vcnkuYzo2MzI1OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVxcdTAwM2VhZGRyZXNzLCBwdGUpO1xcbm1tL21lbW9yeS5jLTYzMjYtXFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz02ODc9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyMy1cXHRcXHR9XFxubW0vbWVtcG9saWN5LmM6NzI0OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21lbXBvbGljeS5jLTcyNS1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyOS1cXHRcXHQvKlxcbm1tL21lbXBvbGljeS5jOjczMDpcXHRcXHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcXG5tbS9tZW1wb2xpY3kuYy03MzEtXFx0XFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxcbi0tXFxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWxvY2suYy0zODctXFx0XFx0XFx0Y29udGludWU7XFxubW0vbWxvY2suYzozODg6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWxvY2suYy0zODktXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tcmVtYXAuYy0xODktXFxubW0vbXJlbWFwLmM6MTkwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5tbS9tcmVtYXAuYy0xOTEtXFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTI5NC1cXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XFxubW0vdXNlcmZhdWx0ZmQuYy0xMjk2LVxcdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0xNTAxPXN0YXRpYyBsb25nIG1vdmVfcGFnZXNfcHRlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNjE3LVxcbm1tL3VzZXJmYXVsdGZkLmM6MTYxODpcXHRcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcXG5tbS91c2VyZmF1bHRmZC5jLTE2MTktXFx0XFx0XFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDoxNS45NTAxNTk2MTRaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NTQyMTAzNTM5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFByb3Bvc2VkIEtIVUdFUEFHRUQgUmVmYWN0b3JpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaW52b2x2ZXMgYSBzdGFuZGFyZCBmdW5jdGlvbiwgYHZtX25vcm1hbF9mb2xpbygpYCwgd2hpY2gsIGlmIEkgcmVjYWxsIGNvcnJlY3RseSwgcmVzaWRlcyBpbiBgbW0vbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG9mIHRoaXMgY2hhbmdlIGxpZXMgaW4gcmVmYWN0b3JpbmcgYGtodWdlcGFnZWQuY2AuIFRoZSBnb2FsIGlzIHRvIGNvbnNvbGlkYXRlIFBURSAoUGFnZSBUYWJsZSBFbnRyeSkgY2hlY2tpbmcgbG9naWMsIHNwZWNpZmljYWxseSBiZXR3ZWVuIHRoZSBmdW5jdGlvbnMgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBBIG5ldyBmdW5jdGlvbiwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCwgaXMgYmVpbmcgaW50cm9kdWNlZC4gVGhpcyBpcyBpbnRlcmVzdGluZywgYXMgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0YXR1cywgb25lIG9mOiBgUFRFX0NIRUNLX1NVQ0NFRURgLCBgUFRFX0NIRUNLX0ZBSUxgLCBvciBgUFRFX0NIRUNLX0NPTlRJTlVFYCwgYXMgd2VsbCBhcyBhIGZ1bmN0aW9uLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuXG5cblRoZSBpbXBsaWNhdGlvbnMgYXJlIGNsZWFyOiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0b3VjaGluZyBjcml0aWNhbCBrZXJuZWwgbG9naWMgd2l0aGluIGBtbS9raHVnZXBhZ2VkLmNgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMsIGlzIHRoaXMgZnVuY3Rpb25hbGl0eSBldmVuICpyZWFjaGFibGUqPyBZZXMsIG9mIGNvdXJzZS4gYGtodWdlcGFnZWRgIGlzIHRoZSBiYWNrYm9uZSBvZiBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIEl0J3MgdGhlIGJhY2tncm91bmQgZGFlbW9uIHRoYXQgYWN0aXZlbHkgc2NhbnMgbWVtb3J5IGFuZCBjb25zb2xpZGF0ZXMgc21hbGxlciBwYWdlcyBpbnRvIGh1Z2UgcGFnZXMuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IGEgY2FsbCB0byBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgY2FuIHJ1biBhdXRvbWF0aWNhbGx5IGlmIFRIUCBpcyBlbmFibGVkLiBJdCdzIHNhZmUgdG8gc2F5IHRoZXNlIGNoYW5nZXMgZGVmaW5pdGVseSBoYXZlIGEgZnVuY3Rpb25hbCBpbXBhY3QuIEkgbmVlZCB0byBkaXZlIGludG8gYGtodWdlcGFnZWQuY2AgaXRzZWxmLiBJIG5lZWQgdG8gaWRlbnRpZnkgd2hpY2ggZnVuY3Rpb25zIGFyZSBtb3N0IHJlbGV2YW50IHRvIG15IHJldmlldy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0NzMsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MTEuMzcxMTk4MDMxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjM5OTgwMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2VfY2hlY2tfcHRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz03MjM9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03MzAtLypcXG5tbS9raHVnZXBhZ2VkLmM6NzMxOiAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlXFxubW0va2h1Z2VwYWdlZC5jLTczMi0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTczOS0gKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxcbm1tL2todWdlcGFnZWQuYzo3NDA6ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXFxubW0va2h1Z2VwYWdlZC5jLTc0MS0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc0NS0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6NzQ2OnN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG5tbS9raHVnZXBhZ2VkLmMtNzQ3LVxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9ODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODM0LVxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xcbm1tL2todWdlcGFnZWQuYzo4MzU6XFx0XFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXFx1MDAyNmN0eCk7XFxubW0va2h1Z2VwYWdlZC5jLTgzNi1cXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE3NDgtXFxubW0va2h1Z2VwYWdlZC5jOjE3NDk6XFx0XFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXFx1MDAyNmN0eCk7XFxubW0va2h1Z2VwYWdlZC5jLTE3NTAtXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjEyLjk5NTIwMjgyMloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0MTEyODQ2MzI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29yZSBMb2dpYyBDaGFuZ2VzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZXNlIG1vZGlmaWNhdGlvbnMuIExvb2tzIGxpa2UgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIHNlZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5J3JlIG5vdyBlbXBsb3lpbmcgYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJJ2xsIGRlZmluaXRlbHkgd2FudCB0byBrZWVwIGEgY2xvc2UgZXllIG9uIGhvdyBgY29sbGFwc2VfY2hlY2tfcHRlYCBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aG9zZS4gXG5cbkknbGwgbmVlZCB0byByZW1lbWJlciB0byBpbmNsdWRlIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGluIG15IGBGb2N1c1N5bWJvbHNgIGxpc3Q7IHRoZXNlIGFyZSBjbGVhcmx5IGNlbnRyYWwgdG8gdGhlIHVwZGF0ZWQgYmVoYXZpb3IuIEhtbSwgd2FpdCBhIG1vbWVudOKApiBJIHNlZSBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaXMgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGF0IHRocm93cyBhIHBvdGVudGlhbCB3cmVuY2ggaW4gdGhlIHdvcmtzLiBJcyBpdCBpbmxpbmVkPyBJIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgdGhhdC4gSXQgY291bGQgYWZmZWN0IGhvdyBlYXNpbHkgSSBjYW4gdHJhY2UgaXRzIGV4ZWN1dGlvbiBmbG93IGFuZCB1bmRlcnN0YW5kIGl0cyBpbXBhY3QuIEFzaWRlIGZyb20gdGhvc2UsIHRoZSByZW1haW5pbmcgY2hhbmdlcyBzZWVtIHJlbGF0aXZlbHkgbWlub3Ig4oCTIHNvbWUgYWRqdXN0bWVudHMgdG8gYGNvbGxhcHNlX3NjYW5fZmlsZWAgZm9yIGluaXRpYWxpemF0aW9uLCBzb21lIHN0YXQgY291bnRpbmcgYWRkZWQgdG8gYGFsbG9jX2NoYXJnZV9mb2xpb2AsIGFuZCBqdXN0IGEgY29tbWVudCB1cGRhdGUgdG8gYF9fa2h1Z2VwYWdlZF9leGl0YC4gVGhlc2UgYXJlIG11Y2ggbGVzcyBjb25jZXJuaW5nLCBnaXZlbiB0aGUgY29yZSBsb2dpYyByZXNpZGVzIHdpdGhpbiB0aGUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGZ1bmN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU1NTgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MjcuMTA4MDUxNDkxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MjkyMzM3NDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTEtXFxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTMtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTk2PXN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTM3Nj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MjguNTM3MjkzMjg0WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTA1MDgyODg4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6XG5cbioqQW5hbHl6aW5nIGBjb2xsYXBzZV9odWdlX3BhZ2VgIEZ1bmN0aW9uKipcblxuQWxyaWdodCwgbGV0J3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhpcyBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgZnVuY3Rpb24sIGl0J3MgZGVjbGFyZWQgYHN0YXRpY2AsIGFuZCBpdCdzIG9ubHkgY2FsbGVkIG9uY2UgaW4gYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEhtbSwgdGhhdCBtYWtlcyBtZSB0aGluayBpdCdzIHByb2JhYmx5IGJlZW4gaW5saW5lZCBieSB0aGUgY29tcGlsZXIuIE5vIHJlYWwgbmVlZCB0byBzcGVuZCBtdWNoIHRpbWUgb24gdGhhdCBvbmUuXG5cbk5vdywgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXRzZWxmIGlzIGFsc28gYHN0YXRpY2AuIFRoYXQncyBpbnRlcmVzdGluZy4gSG93ZXZlciwgaXQncyBhICptdWNoKiBsYXJnZXIgZnVuY3Rpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlICp0aGF0KiBvbmUgaXMgYWN0dWFsbHkgZ2V0dGluZyBjYWxsZWQgZnJvbSB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBvZiBpdHMgcm9sZSBpbiB0aGUgc3lzdGVtLiBMZXQgbWUgY2hlY2sgdGhlIGNhbGwgc2l0ZXMgZm9yIGBjb2xsYXBzZV9odWdlX3BhZ2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjQxOCwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjMzLjU4ODEyNDMzN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1OTc5MjI5MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9odWdlX3BhZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0PTk0PW1tYXBfbG9jayBpbiByZWFkIChvciB3cml0ZSkgbW9kZSB0byBiZSBzdXJlIGEgaHVnZSBwbWQgY2Fubm90IGJlXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojk1OmNyZWF0ZWQgZnJvbSB1bmRlciB5b3UgYnkga2h1Z2VwYWdlZCAoa2h1Z2VwYWdlZCBjb2xsYXBzZV9odWdlX3BhZ2VcXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtOTYtdGFrZXMgdGhlIG1tYXBfbG9jayBpbiB3cml0ZSBtb2RlIGluIGFkZGl0aW9uIHRvIHRoZSBhbm9uX3ZtYSBsb2NrKS4gSWZcXG4tLVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9oYXNoX3BndGFibGUuYz0yNDU9cG1kX3QgaGFzaF9fcG1kcF9jb2xsYXBzZV9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jLTI3OS1cXHQgKiBoZW5jZSB3YWl0IGZvciBjb2xsYXBzZSB0byBjb21wbGV0ZS4gV2l0aG91dCB0aGlzXFxuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jOjI4MDpcXHQgKiB0aGUgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weSBjYW4gcmVzdWx0IGluIGNvcHlpbmdcXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmMtMjgxLVxcdCAqIHRoZSBvbGQgY29udGVudC5cXG4tLVxcbmFyY2gvcmlzY3YvbW0vcGd0YWJsZS5jPTEzOD1wbWRfdCBwbWRwX2NvbGxhcHNlX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuYXJjaC9yaXNjdi9tbS9wZ3RhYmxlLmMtMTQ5LVxcdCAqIGZvcm1zIHRoYXQgc3BlY2lmeSBhbiBhZGRyZXNzIG9ubHkgYXBwbHkgdG8gbGVhZiBQVEVzLCB3ZSBuZWVkIGFcXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYzoxNTA6XFx0ICogZ2xvYmFsIGZsdXNoIGhlcmUuICBjb2xsYXBzZV9odWdlX3BhZ2UoKSBhc3N1bWVzIHRoZXNlIGZsdXNoZXMgYXJlXFxuYXJjaC9yaXNjdi9tbS9wZ3RhYmxlLmMtMTUxLVxcdCAqIGVhZ2VyLCBzbyBqdXN0IGRvIHRoZSBmZW5jZSBoZXJlLlxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD01Nj1UUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC04OS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjkwOlRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZSxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTkxLVxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0xMTYtXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0xMTgtXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0Ny1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjE0ODpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluLFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTQ5LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NzA2LVxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9wbWRcXFwiLCAweDEwIH0sXFxua2VybmVsL2JwZi9idGYuYzo2NzA3OlxcdHsgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXFxcIiwgMHgxIH0sXFxua2VybmVsL2JwZi9idGYuYy02NzA4LVxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9maWxlXFxcIiwgMHgxMCB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTc0Nj1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODExLVxcbm1tL2todWdlcGFnZWQuYzo4MTI6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtODEzLVxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkyMC1cXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxubW0va2h1Z2VwYWdlZC5jOjkyMTpcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG5tbS9raHVnZXBhZ2VkLmMtOTIyLVxcdFxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05MjYtXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxubW0va2h1Z2VwYWdlZC5jOjkyNzpcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG5tbS9raHVnZXBhZ2VkLmMtOTI4LVxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05MzEtXFxubW0va2h1Z2VwYWdlZC5jOjkzMjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGVfdCAqcHRlLFxcbm1tL2todWdlcGFnZWQuYy05MzMtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05OTUtXFxubW0va2h1Z2VwYWdlZC5jOjk5NjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxcbm1tL2todWdlcGFnZWQuYy05OTctXFx0XFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMTMtXFx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcXG5tbS9raHVnZXBhZ2VkLmM6MTAxNDpcXHQgKiBpbiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlLlxcbm1tL2todWdlcGFnZWQuYy0xMDE1LVxcdCAqL1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMTktLypcXG5tbS9raHVnZXBhZ2VkLmM6MTAyMDogKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IC0gYXR0ZW1wdHMgdG8gY29weSBtZW1vcnkgY29udGVudHMgZnJvbSByYXdcXG5tbS9raHVnZXBhZ2VkLmMtMTAyMS0gKiBwYWdlcyB0byBhIGh1Z2VwYWdlLiBDbGVhbnMgdXAgdGhlIHJhdyBwYWdlcyBpZiBjb3B5aW5nIHN1Y2NlZWRzO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMzMtICovXFxubW0va2h1Z2VwYWdlZC5jOjEwMzQ6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weShwdGVfdCAqcHRlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL2todWdlcGFnZWQuYy0xMDM1LVxcdFxcdHBtZF90ICpwbWQsIHBtZF90IG9yaWdfcG1kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDYzLVxcdGlmIChsaWtlbHkocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkpXFxubW0va2h1Z2VwYWdlZC5jOjEwNjQ6XFx0XFx0X19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9zdWNjZWVkZWQocHRlLCB2bWEsIGFkZHJlc3MsIHB0bCxcXG5tbS9raHVnZXBhZ2VkLmMtMTA2NS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5tbS9raHVnZXBhZ2VkLmMtMTA2Ni1cXHRlbHNlXFxubW0va2h1Z2VwYWdlZC5jOjEwNjc6XFx0XFx0X19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlLCBwbWQsIG9yaWdfcG1kLCB2bWEsXFxubW0va2h1Z2VwYWdlZC5jLTEwNjgtXFx0XFx0XFx0XFx0XFx0XFx0IG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTI0Ny0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MTI0ODpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTEyNDktXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMzMzLW91dDpcXG5tbS9raHVnZXBhZ2VkLmM6MTMzNDpcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCByZXN1bHQsXFxubW0va2h1Z2VwYWdlZC5jLTEzMzUtXFx0XFx0XFx0XFx0XFx0ICAgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEzMzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTM3MC0vKlxcbm1tL2todWdlcGFnZWQuYzoxMzcxOiAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXFxubW0va2h1Z2VwYWdlZC5jLTEzNzItICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzNzUtICovXFxubW0va2h1Z2VwYWdlZC5jOjEzNzY6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXFx0XFx0aW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MTctXFx0XFx0LypcXG5tbS9raHVnZXBhZ2VkLmM6MTQxODpcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbm1tL2todWdlcGFnZWQuYy0xNDE5LVxcdFxcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MjEtXFx0XFx0ICovXFxubW0va2h1Z2VwYWdlZC5jOjE0MjI6XFx0XFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCB2bWEsIHN0YXJ0X2FkZHIsIHBtZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTQyMy1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIHJlZmVyZW5jZWQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTA5LVxcbm1tL2todWdlcGFnZWQuYzoxNTEwOlxcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkocHRlLCBmb2xpbywgcG1kLCBfcG1kLFxcbm1tL2todWdlcGFnZWQuYy0xNTExLVxcdFxcdFxcdFxcdFxcdCAgIHZtYSwgc3RhcnRfYWRkciwgcHRlX3B0bCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTU2LVxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxubW0va2h1Z2VwYWdlZC5jOjE1NTc6XFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlKG1tLCByZXN1bHQgPT0gU0NBTl9TVUNDRUVELCByZXN1bHQsIG9yZGVyKTtcXG5tbS9raHVnZXBhZ2VkLmMtMTU1OC1cXHRyZXR1cm4gcmVzdWx0O1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNjIwLVxcdFxcdFxcdGNvbGxhcHNlX2FkZHJlc3MgPSBhZGRyZXNzICsgb2Zmc2V0ICogUEFHRV9TSVpFO1xcbm1tL2todWdlcGFnZWQuYzoxNjIxOlxcdFxcdFxcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTYyMi1cXHRcXHRcXHRcXHRcXHRcXHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODA2LVxcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XFxubW0va2h1Z2VwYWdlZC5jOjE4MDc6XFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXFxubW0va2h1Z2VwYWdlZC5jLTE4MDgtXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjM1LjA0NzkyMjg4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyNzkyMjEwMTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipUcmFjaW5nIHRoZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbSoqXG5cblJpZ2h0LCBzbyBgY29sbGFwc2VfaHVnZV9wYWdlYCBpcyB0aGUga2V5IGZ1bmN0aW9uIGhlcmUsIGJ1dCBpdCdzICpzdGF0aWMqIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byBpdC4gSXQncyBjYWxsZWQgYnkgYG10aHBfY29sbGFwc2VgLCB3aGljaCwgaW4gdHVybiwgaXMgdHJpZ2dlcmVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIFNvLCB0aGUgY29sbGFwc2UgdWx0aW1hdGVseSBoYXBwZW5zIHRocm91Z2ggYSBjaGFpbiBvZiBmdW5jdGlvbiBjYWxscy4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBhbHNvIHN0YXRpYywgbWVhbmluZyBpdCdzIGNvbmZpbmVkIHRvIGl0cyBzb3VyY2UgZmlsZSBhbmQgbm90IGV4cG9zZWQgdG8gdGhlIG91dHNpZGUuIFRoYXQgbGVhdmVzIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCBhcyB0aGUgZW50cnkgcG9pbnQgdGhhdCdzIGFjY2Vzc2libGUuIFRoaXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGlzIHRoZSBsaWtlbHkgY2FuZGlkYXRlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB3aG9sZSBwYWdlIGNvbGxhcHNlIHByb2Nlc3MgaXMgaW5pdGlhdGVkLiBJIG5lZWQgdG8gZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiBvbiB0aGF0IGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTQ0MCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjQwLjMyNzE0NTk2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYyNjEwMDczLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cXHQvKiBodWdlX21lbW9yeSAqL1xcbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcXHR7IFxcXCJtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXFxcIiwgMHgxMCB9LFxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cXHR7IFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVxcXCIsIDB4MSB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgxNC1vdXQ6XFxubW0va2h1Z2VwYWdlZC5jOjE4MTU6XFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE4MTYtXFx0XFx0XFx0XFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjQxLjc4OTc2NDI2M1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MzMxMzAwMjAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCdzIFBhZ2UgTWFuYWdlbWVudCoqXG5cbk9rYXksIHNvIEkgd2FzIGxvb2tpbmcgZm9yIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCwgYnV0IHdhaXQgYSBtaW51dGXigKYgdGhhdCBmdW5jdGlvbiBkb2Vzbid0IHNlZW0gdG8gYmUgZGVmaW5lZC4gSG1tLCBJIG11c3QgaGF2ZSBnb3R0ZW4gdGhlIG5hbWUgd3JvbmcuIFJpZ2h0LCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGlzIGBjb2xsYXBzZV9zY2FuX3BtZGAuIFRoYXQgbWFrZXMgbXVjaCBtb3JlIHNlbnNlLiBOb3cgdGhhdCBJIGhhdmUgdGhlIGNvcnJlY3QgZnVuY3Rpb24gbmFtZSwgbGV0J3MgdHJhY2Ugd2hlcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIHdpbGwgYmUgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0aGUgbGFyZ2VyIHBhZ2UgbWFuYWdlbWVudCBzY2hlbWUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDA3NywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjUxLjEyMTA2NzQzNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ5MjY2NjUxMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9zY2FuX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTIzOC0gKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbm1tL2todWdlcGFnZWQuYzoxMjM5OiAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxubW0va2h1Z2VwYWdlZC5jLTEyNDAtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTYyPXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X29yZGVyX2Zyb21fb2Zmc2V0KHVuc2lnbmVkIGludCBvZmZzZXQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTU3MS0gKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcXG5tbS9raHVnZXBhZ2VkLmM6MTU3MjogKiBjb2xsYXBzZV9zY2FuX3BtZCgpIHRvIGRldGVybWluZSB3aGF0IHJlZ2lvbnMgYW5kIG1USFAgb3JkZXJzIGZpdCBiZXN0Llxcbm1tL2todWdlcGFnZWQuYy0xNTczLSAqXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTU4Nz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE2ODgtXFxubW0va2h1Z2VwYWdlZC5jOjE2ODk6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTE2OTAtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MjQtXFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSkge1xcbm1tL2todWdlcGFnZWQuYzoyODI1OlxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0yODI2LVxcdFxcdGdvdG8gZW5kO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNTo1Mi42MTM3NDA2OTlaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDYwMzc5NTA2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgUE1EIENvbGxhcHNlIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYmVpbmcgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gVGhhdCdzIGEgY3J1Y2lhbCBsaW5rIHRvIHVuZGVyc3RhbmQuIFRvIHJlYWxseSBncmFzcCB3aGF0J3MgaGFwcGVuaW5nLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBjb2xsYXBzZV9zaW5nbGVfcG1kYCAqZG9lcyouIFNvLCBmaXJzdCB0aGluZ3MgZmlyc3QsIGxldCdzIGRpdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBJJ2xsIHN0YXJ0IHRoZXJlIGFuZCBzZWUgd2hlcmUgaXQgbGVhZHMuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgb2Z0ZW4gdGhlIGtleSB0byB1bnJhdmVsaW5nIHRoZSBwdXJwb3NlIG9mIGFueSBjYWxsZWQgZnVuY3Rpb24uIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgY29udGV4dCB0byBkZXRlcm1pbmUgaG93IGBjb2xsYXBzZV9zY2FuX3BtZGAgZml0cyBpbnRvIHRoZSBicm9hZGVyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzUzLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6NTcuMjE3NTM3Nzk2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDc0NjQwOTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NpbmdsZV9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTI3MDI9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MTEtICovXFxubW0va2h1Z2VwYWdlZC5jOjI4MTI6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTI4MTMtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODY5PXN0YXRpYyB2b2lkIGNvbGxhcHNlX3NjYW5fbW1fc2xvdCh1bnNpZ25lZCBpbnQgcHJvZ3Jlc3NfbWF4LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI5MzktXFxubW0va2h1Z2VwYWdlZC5jOjI5NDA6XFx0XFx0XFx0KnJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MsXFxubW0va2h1Z2VwYWdlZC5jLTI5NDEtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdm1hLCBcXHUwMDI2bG9ja19kcm9wcGVkLCBjYyk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MzIxMD1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjU4LVxcbm1tL2todWdlcGFnZWQuYzozMjU5OlxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoYWRkciwgdm1hLCBcXHUwMDI2bW1hcF91bmxvY2tlZCwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0zMjYwLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNTo1OC42OTIxODMwMVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NzIwOTUzMzgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgVGhvdWdodHMgb24gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBSZWxhdGVkIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIGRpcmVjdCBBUEkgZW50cnkgcG9pbnQsIHNwZWNpZmljYWxseSBjYWxsZWQgd2hlbiB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoYXQgbWFrZXMgaXQgYSBjcml0aWNhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQncyB0aGUgcGVyZmVjdCBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBBbHNvLCB0aGUgYGNvbGxhcHNlX3NjYW5fbW1fc2xvdGAgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGxvb3Agd2l0aGluIGtodWdlcGFnZWQuIFRoaXMgaXMgZ29vZCB0byBrbm93LCBhbmQgSSBzaG91bGQgbWFrZSBzdXJlIHRvIGFkZCBgbWFkdmlzZV9jb2xsYXBzZWAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGRvbid0IG1pc3MgYW55dGhpbmcgdGhhdCBtYXkgYmUgb3Zlcmxvb2tlZC4gQXJlIHRoZXJlIGFueSBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgcHJvY2VzcyB0aGF0IEkgYW0gbm90IHNlZWluZz9cblxuTm93LCBsZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgJ3Mgc2lnbmF0dXJlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzIGJlZm9yZSBwcm9jZWVkaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTMxMSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjowNi40MTMxMzg4OTFaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NzY2MTMyMDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaW50IG1hZHZpc2VfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo1MTM6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTE0LVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxNy1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTczPWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3ODpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTc5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjA5LVxcbm1tL2todWdlcGFnZWQuYzozMjEwOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjExLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz0yNTY9c3RhdGljIHZvaWQgZmlsbF9tZW1vcnkoaW50ICpwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3MDpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjowNy45ODk3NTcyMzNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY4OTA1MjQ3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVGhpbmtpbmcgQWJvdXQgTWVtb3J5IE1hbmFnZW1lbnQgYW5kIGBraHVnZXBhZ2VkYCoqXG5cbk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIG5vbi1zdGF0aWMgZnVuY3Rpb24g4oCTIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEkgdW5kZXJzdGFuZCBpdHMgcm9sZSBpbiBtZW1vcnkgY29sbGFwc2luZywgYnV0IGl0IGltbWVkaWF0ZWx5IG1ha2VzIG1lIGNvbnNpZGVyIHRoZSBiaWdnZXIgcGljdHVyZSwgcGFydGljdWxhcmx5IHRoZSBpbnRlcmFjdGlvbiB3aXRoIGBraHVnZXBhZ2VkYC4gV2UncmUgdGFsa2luZyBhYm91dCBodWdlcGFnZSBtYW5hZ2VtZW50IGFuZCB0aGUgcG90ZW50aWFsIGZvciBtZW1vcnkgZnJhZ21lbnRhdGlvbiBvciBpbmVmZmljaWVudCBhbGxvY2F0aW9uLiBTaW5jZSBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgcGFydCBvZiB0aGUgdG9vbCBzZXQgZm9yIGRlYWxpbmcgd2l0aCB0aGlzLCBpdCBtYWtlcyBtZSB0aGluayBhYm91dCBob3cgdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gaXRzZWxmIGlzICppbnZvbHZlZCogYW5kIGhvdyBpdHMgYmVoYXZpb3IgbWlnaHQgaW5mbHVlbmNlIHRoZSBlZmZpY2FjeSBvZiBgbWFkdmlzZV9jb2xsYXBzZWAuIFdoYXQgYXJlIHRoZSB0cmlnZ2VyaW5nIGNvbmRpdGlvbnMgZm9yIGBraHVnZXBhZ2VkYCB0byBzd2VlcCBpbiwgYW5kIGhvdyBkb2VzIGl0IGRlYWwgd2l0aCB0aGUgc2l0dWF0aW9uIHRoYXQgKm1hZHZpc2VfY29sbGFwc2UqIGlzIGRlc2lnbmVkIHRvIGFsbGV2aWF0ZT8gSXMgdGhlcmUgY29udGVudGlvbj8gQXJlIHRoZXJlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaW4gdGhhdCBpbnRlcmFjdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGtub2JzIEkgY2FuIHR1cm4gaW4gZWl0aGVyIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyB0aHJvdWdoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjIxMCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjEyLjY3ODgxMTgyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTExMDA1MjEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9tbV9zbG90XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3Q9OTk9TG9vayBhdCB0aGUgY3VycmVudCBsb2NrIHN0YXRpc3RpY3M6Olxcbi0tXFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMTMtICAwOCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS1cXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0OjExNDogIDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAyNm1tLVxcdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICAgMSAgICAgICAgICBbXFx1MDAzY2ZmZmZmZmZmODExNTAyYTdcXHUwMDNlXSBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCsweDU3LzB4MjgwXFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMTUtICAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgOTYgICAgICAgICAgW1xcdTAwM2NmZmZmZmZmZjgxNTM1MWM0XFx1MDAzZV0gX19kb19wYWdlX2ZhdWx0KzB4MWQ0LzB4NTEwXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdD0xMjA9UGVyIHZlZGVyZSBsZSBzdGF0aXN0aWNoZSBjb3JyZW50aSBzdWkgYmxvY2NoaTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMzQtICAwOCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdDoxMzU6ICAwOSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgIDEgICAgICAgICAgW1xcdTAwM2NmZmZmZmZmZjgxMTUwMmE3XFx1MDAzZV0ga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3QrMHg1Ny8weDI4MFxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3N0YXQucnN0LTEzNi0gIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAyNm1tLVxcdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICA5NiAgICAgICAgICBbXFx1MDAzY2ZmZmZmZmZmODE1MzUxYzRcXHUwMDNlXSBfX2RvX3BhZ2VfZmF1bHQrMHgxZDQvMHg1MTBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MTQuMTg5ODIxMzQyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyMDUyNzMzMjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIE1pc3NpbmcgYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCoqXG5cbkhtbSwgdGhhdCdzIG9kZC4gSSB3YXMgZXhwZWN0aW5nIHRvIHNlZSBga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3RgIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSwgYnV0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyB0aHJvd2luZyBhbiBlcnJvci4gQSBxdWljayBjaGVjayByZXZlYWxzIGl0J3Mgbm93aGVyZSB0byBiZSBmb3VuZC4gT2theSwgdGltZSB0byBzdGVwIGJhY2sgYW5kIHJlLWV2YWx1YXRlIHRoZSBzZWFyY2ggc3RyYXRlZ3kuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIEknbSBsb29raW5nIGZvciBtYXkgaGF2ZSBiZWVuIHJlbmFtZWQsIG9yIGlzIGNhbGxlZCBpbmRpcmVjdGx5LiBMZXQncyB3aWRlbiB0aGUgbmV0LiBJJ2xsIGdyZXAgdGhlIGNvZGViYXNlIGZvciBhbnkgYW5kIGFsbCBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBIb3BlZnVsbHkgdGhpcyB3aWxsIHJldmVhbCB0aGUgZGVwZW5kZW5jeSB0cmVlIGFuZCBsZXQgbWUgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eS4gR290dGEga2VlcCBkaWdnaW5nIGFuZCBob3BlZnVsbHkgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcHJlc2VudCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyODU5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MTkuMzk1MDk2NDYzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYxMzQ0NzgzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfdGhyZWFkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz02OD1lbnVtIHB0ZV9jaGVja19yZXN1bHQge1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc2LVxcbm1tL2todWdlcGFnZWQuYzo3NzpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpraHVnZXBhZ2VkX3RocmVhZCBfX3JlYWRfbW9zdGx5O1xcbm1tL2todWdlcGFnZWQuYy03OC1zdGF0aWMgREVGSU5FX01VVEVYKGtodWdlcGFnZWRfbXV0ZXgpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxMzk9aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNDItXFx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSkge1xcbm1tL2todWdlcGFnZWQuYzozMTQzOlxcdFxcdGlmICgha2h1Z2VwYWdlZF90aHJlYWQpIHtcXG5tbS9raHVnZXBhZ2VkLmMtMzE0NC1cXHRcXHRcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ld190aHJlYWQgPSBrdGhyZWFkX3J1bihraHVnZXBhZ2VkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNTItXFxubW0va2h1Z2VwYWdlZC5jOjMxNTM6XFx0XFx0XFx0a2h1Z2VwYWdlZF90aHJlYWQgPSBuZXdfdGhyZWFkO1xcbm1tL2todWdlcGFnZWQuYy0zMTU0LVxcdFxcdH1cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTU3LVxcdFxcdFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcXHUwMDI2a2h1Z2VwYWdlZF93YWl0KTtcXG5tbS9raHVnZXBhZ2VkLmM6MzE1ODpcXHR9IGVsc2UgaWYgKGtodWdlcGFnZWRfdGhyZWFkKSB7XFxubW0va2h1Z2VwYWdlZC5jOjMxNTk6XFx0XFx0a3RocmVhZF9zdG9wKGtodWdlcGFnZWRfdGhyZWFkKTtcXG5tbS9raHVnZXBhZ2VkLmM6MzE2MDpcXHRcXHRraHVnZXBhZ2VkX3RocmVhZCA9IE5VTEw7XFxubW0va2h1Z2VwYWdlZC5jLTMxNjEtXFx0fVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxNjY9dm9pZCBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGUodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTY4LVxcdGd1YXJkKG11dGV4KShcXHUwMDI2a2h1Z2VwYWdlZF9tdXRleCk7XFxubW0va2h1Z2VwYWdlZC5jOjMxNjk6XFx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiBraHVnZXBhZ2VkX3RocmVhZClcXG5tbS9raHVnZXBhZ2VkLmMtMzE3MC1cXHRcXHRzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjIwLjg1NjQ0NTUyNloiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NjU5OTE0Mzc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKlVuZGVyc3RhbmRpbmcgdGhlIEtlcm5lbCdzIEh1Z2UgUGFnZSBNYW5hZ2VtZW50KipcblxuUmlnaHQsIGxldCdzIHNlZS4uLiB0aGUgdG9waWMgaGVyZSBpcyB0aGUga2VybmVsJ3MgaHVnZSBwYWdlIG1hbmFnZW1lbnQsIGFuZCBzcGVjaWZpY2FsbHksIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyB0aHJlYWQgaXMgdGhlIGhlYXJ0IG9mIHRoZSBhdXRvbWF0ZWQgaHVnZSBwYWdlIG1hbmFnZW1lbnQgcHJvY2Vzcy4gSXRzIGNvcmUgZnVuY3Rpb24gaXMgdG8gYW5hbHl6ZSB0aGUgbWVtb3J5IHVzYWdlIHBhdHRlcm5zIHdpdGhpbiB0aGUgc3lzdGVtIGFuZCBwcm9hY3RpdmVseSBhbGxvY2F0ZSBvciBkZWFsbG9jYXRlIGh1Z2UgcGFnZXMgKHR5cGljYWxseSAyTUIgb3IgMUdCLCBkZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgY29uZmlndXJhdGlvbikgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXG5cbk15IHRoaW5raW5nIHRoZW4gZ29lcyB0bzogd2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gY3JpdGVyaWEgdGhhdCBga2h1Z2VwYWdlZGAgaXMgdHJ5aW5nIHRvIGFjaGlldmU/IElzIGl0IHByaW1hcmlseSBmb2N1c2VkIG9uIG1pbmltaXppbmcgVExCIG1pc3Nlcz8gSXMgdGhlcmUgYSBkeW5hbWljIHRocmVzaG9sZCByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3Igb3ZlcmFsbCBtZW1vcnkgdXRpbGl6YXRpb24gdGhhdCB0cmlnZ2VycyB0aGVzZSBhbGxvY2F0aW9ucz8gSSBuZWVkIHRvIGNvbnNpZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLCBzdWNoIGFzIHRoZSBOVU1BIGJhbGFuY2luZyBjb2RlLCB0aGUgcGFnZSByZWNsYWltIGNvZGUsIGFuZCB0aGUgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIChUSFApIG1lY2hhbmlzbS4gSSdtIHdvbmRlcmluZyBpZiBpdCdzIGFjdGl2ZWx5IHNlZWtpbmcgdG8gY29uc29saWRhdGUgc21hbGxlciBhbGxvY2F0aW9ucyBpbnRvIGxhcmdlciBUSFAtZWxpZ2libGUgcmVnaW9ucywgb3IgaWYgaXQgcHJpb3JpdGl6ZXMgc3BlY2lmaWMgcHJvY2Vzc2VzIGJhc2VkIG9uIHNvbWUgbWV0cmljcyBsaWtlIHdvcmtpbmcgc2V0IHNpemUgb3IgcGFnZSBmYXVsdCByYXRlLlxuXG5UaGlua2luZyBmdXJ0aGVyLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIGBraHVnZXBhZ2VkYCBhcmUgY3J1Y2lhbC4gSXMgaXQgZWZmaWNpZW50PyBIb3cgbXVjaCBvdmVyaGVhZCBkb2VzIGl0IGludHJvZHVjZSwgaW4gdGVybXMgb2YgQ1BVIGN5Y2xlcyBhbmQgbWVtb3J5IGJhbmR3aWR0aCBjb25zdW1wdGlvbj8gV2hhdCBhcmUgdGhlIHR1bmluZyBrbm9icyBhdmFpbGFibGU/IEkgbmVlZCB0byByZW1lbWJlciB0aGUgdmFyaW91cyBzeXNjdGwgcGFyYW1ldGVycywgc3VjaCBhcyBga2h1Z2VwYWdlZF9zY2FuX3BhZ2VzYCwgYGtodWdlcGFnZWRfYWxsb2NfcGFnZXNgLCBhbmQgdGhlIHJlbGF0ZWQgZmxhZ3MgdGhhdCBjb250cm9sIGl0cyBiZWhhdmlvciwgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHByb2FjdGl2ZSBhbGxvY2F0aW9uIGFuZCB0aGUgcmlzayBvZiBpbnRyb2R1Y2luZyBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbiBvciB3YXN0aW5nIHJlc291cmNlcy4gRmluYWxseSwgSSdtIGdvaW5nIHRvIGNvbnNpZGVyIGVkZ2UgY2FzZXM6IHdoYXQgaGFwcGVucyB3aGVuIHRoZSBzeXN0ZW0gaXMgdW5kZXIgZXh0cmVtZSBtZW1vcnkgcHJlc3N1cmUgb3Igd2hlbiBkZWFsaW5nIHdpdGggaGlnaGx5IGZyYWdtZW50ZWQgYWRkcmVzcyBzcGFjZXM/IEhvdyBkb2VzIGBraHVnZXBhZ2VkYCBncmFjZWZ1bGx5IGhhbmRsZSB0aG9zZSBzY2VuYXJpb3M/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjMyLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MjYuNTE2MzYzMzYxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg1NjA3MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0YXRpYyBpbnQga2h1Z2VwYWdlZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9Mjg2OT1zdGF0aWMgdm9pZCBjb2xsYXBzZV9zY2FuX21tX3Nsb3QodW5zaWduZWQgaW50IHByb2dyZXNzX21heCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0yOTg3LVxcbm1tL2todWdlcGFnZWQuYzoyOTg4OnN0YXRpYyBpbnQga2h1Z2VwYWdlZF9oYXNfd29yayh2b2lkKVxcbm1tL2todWdlcGFnZWQuYy0yOTg5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0yOTkyLVxcbm1tL2todWdlcGFnZWQuYzoyOTkzOnN0YXRpYyBpbnQga2h1Z2VwYWdlZF93YWl0X2V2ZW50KHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTI5OTQte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMwNDc9c3RhdGljIHZvaWQga2h1Z2VwYWdlZF93YWl0X3dvcmsodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMDY2LVxcbm1tL2todWdlcGFnZWQuYzozMDY3OnN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxcbm1tL2todWdlcGFnZWQuYy0zMDY4LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MjguMTAxOTc0OTE0WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwMTUyODE0NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNpbmcgTWVjaGFuaXNtKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBga2h1Z2VwYWdlZGAgdGhyZWFkLiBTZWVtcyBsaWtlIHRoZSBoZWFydCBvZiB0aGUgaHVnZSBwYWdlIG1hbmFnZW1lbnQuIFRoZSBwYXRjaCBJJ20gZXhhbWluaW5nIHR3ZWFrcyBgY29sbGFwc2VfY2hlY2tfcHRlYC4gVGhhdCdzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQncyBjYWxsZWQgYnkgYGNvbGxhcHNlX3NjYW5fcG1kYC4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpdHNlbGYgaXMgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gR290IGl0LiBgY29sbGFwc2Vfc2luZ2xlX3BtZGAgaXMgY2FsbGVkIGluIHR3byBwbGFjZXM6IHRocm91Z2ggdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHZpYSBgbWFkdmlzZV9jb2xsYXBzZWAuIEFoYSEgVGhhdCBgbWFkdmlzZV9jb2xsYXBzZWAgcGF0aCBsb29rcyBsaWtlIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLiBJdCdzIGEgZGlyZWN0IGVudHJ5IHBvaW50LCB3aGljaCBtYWtlcyBpdCBmYXIgbW9yZSBpbnRlcmVzdGluZy5cblxuQW5kIGBraHVnZXBhZ2VkYCBpdHNlbGYgaXMgYSBkZWNlbnQgZW50cnkgcG9pbnQgZm9yIGZ1enppbmcsIG9mIGNvdXJzZS5cblxuV2FpdCBhIHNlY29uZOKApiBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgbm9uLXN0YXRpYy4gVGhhdCdzIGEgaHVnZSBhZHZhbnRhZ2UsIGEgZ29vZCB0YXJnZXQgdG8gc3RhcnQgd2l0aC4gTGV0IG1lIHNlZS4uLiBhcmUgdGhlcmUgYW55IG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoaXMgYXJlYSB0aGF0IG1pZ2h0IGJlIGV4cG9zZWQ/IEkgc2hvdWxkIGRvdWJsZS1jaGVjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQzMjIsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MzUuMTE3MjU4NTYzWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQyNDc4NzA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1hZHZpc2VfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0PTM0Nj1BIGhpZ2hlciB2YWx1ZSBtYXkgaW5jcmVhc2UgbWVtb3J5IGZvb3RwcmludCBmb3Igc29tZSB3b3JrbG9hZHMuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QtMzUzLVxcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdDozNTQ6ICAgQ3VycmVudGx5LCBtYWR2aXNlX2NvbGxhcHNlIG9ubHkgc3VwcG9ydHMgY29sbGFwc2luZyB0byBQTUQtc2l6ZWQgVEhQc1xcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD01MTE9aW50IGh1Z2VwYWdlX21hZHZpc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3QgKnZtX2ZsYWdzLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cXHRcXHQgICAgIGludCBhZHZpY2UpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTQtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTcxMj1zdGF0aWMgaW5saW5lIGludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNzE3LVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjcxODpzdGF0aWMgaW5saW5lIGludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTc3LVxcbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXFxubW0va2h1Z2VwYWdlZC5jLTMxNzkte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMDktXFxubW0va2h1Z2VwYWdlZC5jOjMyMTA6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyOTctXFx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcXHUwMDNlXFx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxcbm1tL2todWdlcGFnZWQuYzozMjk4OlxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbm1tL2todWdlcGFnZWQuYy0zMjk5LX1cXG4tLVxcbm1tL21hZHZpc2UuYz0xMzM4PXN0YXRpYyBpbnQgbWFkdmlzZV92bWFfYmVoYXZpb3Ioc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTM2Mi1cXHRjYXNlIE1BRFZfQ09MTEFQU0U6XFxubW0vbWFkdmlzZS5jOjEzNjM6XFx0XFx0cmV0dXJuIG1hZHZpc2VfY29sbGFwc2Uodm1hLCByYW5nZS1cXHUwMDNlc3RhcnQsIHJhbmdlLVxcdTAwM2VlbmQsXFxubW0vbWFkdmlzZS5jLTEzNjQtXFx0XFx0XFx0XFx1MDAyNm1hZHZfYmVoYXZpb3ItXFx1MDAzZWxvY2tfZHJvcHBlZCk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjU2PXN0YXRpYyB2b2lkIGZpbGxfbWVtb3J5KGludCAqcCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjY5LSAqL1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoyNzA6c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz0yODg9c3RhdGljIHZvaWQgKmFsbG9jX2hwYWdlKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMzAxLVxcdGtzZnRfcHJpbnRfbXNnKFxcXCJBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cXFwiKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MzAyOlxcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMzAzLVxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0NPTExBUFNFKVxcXCIpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTUzMj1zdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM2LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1Mzc6c3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM4LVxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NjAtXFx0bWFkdmlzZShwLCBucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU2MTpcXHRyZXQgPSBtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIG5yX2hwYWdlcyAqIGhwYWdlX3BtZF9zaXplKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTYyLVxcdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTcxLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NzI6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3My1cXHRcXHRcXHQgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3Ny1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgaHVnZSBwYWdlXFxcXG5cXFwiKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTc4OlxcdF9fbWFkdmlzZV9jb2xsYXBzZShtc2csIHAsIG5yX2hwYWdlcywgb3BzLCBleHBlY3QpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NzktfVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTcwMT1zdGF0aWMgc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgX19tYWR2aXNlX2NvbnRleHQgPSB7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjcwMjpcXHQuY29sbGFwc2UgPSBcXHUwMDI2bWFkdmlzZV9jb2xsYXBzZSxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNzAzLVxcdC5lbmZvcmNlX3B0ZV9zY2FuX2xpbWl0cyA9IGZhbHNlLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTExMDk9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNjYtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNjc6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMTY4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3Ny1cXHQvKiBjLVxcdTAwM2Vjb2xsYXBzZSgpIHdpbGwgZmluZCBhIGh1Z2VwYWdlIGFuZCBjb21wbGFpbiAtIGNhbGwgZGlyZWN0bHkuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNzg6XFx0X19tYWR2aXNlX2NvbGxhcHNlKFxcXCJSZS1jb2xsYXBzZSBQTUQtbWFwcGVkIGh1Z2VwYWdlXFxcIiwgcCwgMSwgb3BzLCB0cnVlKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3OS1cXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEzNDQ9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTE0NjUtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0NjY6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxNDY3OlxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0Njg6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2OTpcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xNDcwLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjozNi41NTk3NDMzNzdaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTU5ODYwNDYxMTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBDb2xsYXBzZSBFbnRyeSBQb2ludHMqKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIHRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0IGxvb2tpbmcuIGBtYWR2aXNlX2NvbGxhcHNlYCBzZWVtcyBsaWtlIGEgc29saWQgY2FuZGlkYXRlOyBpdCdzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGEga2V5IHJlcXVpcmVtZW50LiBIbW0sIEkga25vdyBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAgYWxyZWFkeTsgYmVzdCB0byBrZWVwIHRoYXQgb3V0IG9mIGNvbnNpZGVyYXRpb24gZm9yIG5vdy4gV2hhdCBhYm91dCBgbXRocF9jb2xsYXBzZWAsIGBjb2xsYXBzZV9odWdlX3BhZ2VgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlYD8gVGhvc2UgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb25zLCB1bmZvcnR1bmF0ZWx5LiBBbmQgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkYCBpcyBzdGF0aWMgaW5saW5lLCBzbyB0aGF0IGlzIG5vdCBhbiBvcHRpb24gZWl0aGVyLlxuXG5TbywgZnJvbSB3aGF0IEkndmUgc2VlbiwgYG1hZHZpc2VfY29sbGFwc2VgIHJlbWFpbnMgdGhlIG1vc3QgcHJvbWlzaW5nIG5vbi1zdGF0aWMgZW50cnkgcG9pbnQuIEkgZG8gcmVtZW1iZXIgdGhlIGBraHVnZXBhZ2VkYCB0aHJlYWQgZnVuY3Rpb24sIGJ1dCB0aGF0IGlzIGFsc28gc3RhdGljLiBIb3dldmVyLCB3YWl0IGEgbWludXRlLCBgc3RhcnRfc3RvcF9raHVnZXBhZ2VkYCBpcyBub24tc3RhdGljLiBJbnRlcmVzdGluZy4gVGhhdCB3YXJyYW50cyBhbm90aGVyIGxvb2suXG5cblRvIGJlIHRob3JvdWdoLCBsZXQncyB0YWtlIGEgZ2FuZGVyIGF0IGBtbS9raHVnZXBhZ2VkLmNgLiBJIG5lZWQgdG8gZW5zdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55IG90aGVyIGV4cG9ydGVkIG9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IGZpbGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2OTE0LCJPdXRwdXRUb2tlbnMiOjY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjUyLjU0NTc5MjgxNFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU0MDg2NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXlthLXpBLVpfXVthLXpBLVowLTlfXSogW2EtekEtWl9dW2EtekEtWjAtOV9dKlxcXFwoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9Nzc9c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1Z2VwYWdlZF90aHJlYWQgX19yZWFkX21vc3RseTtcXG5tbS9raHVnZXBhZ2VkLmM6Nzg6c3RhdGljIERFRklORV9NVVRFWChraHVnZXBhZ2VkX211dGV4KTtcXG5tbS9raHVnZXBhZ2VkLmMtNzktXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTA9c3RhdGljIHVuc2lnbmVkIGxvbmcga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmU7XFxubW0va2h1Z2VwYWdlZC5jOjkxOnN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2h1Z2VwYWdlZF9tbV9sb2NrKTtcXG5tbS9raHVnZXBhZ2VkLmM6OTI6c3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWdlcGFnZWRfd2FpdCk7XFxubW0va2h1Z2VwYWdlZC5jLTkzLS8qXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTAzPXN0YXRpYyB1bnNpZ25lZCBpbnQga2h1Z2VwYWdlZF9tYXhfcHRlc19zaGFyZWQgX19yZWFkX21vc3RseTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDUtI2RlZmluZSBNTV9TTE9UU19IQVNIX0JJVFMgMTBcXG5tbS9raHVnZXBhZ2VkLmM6MTA2OnN0YXRpYyBERUZJTkVfUkVBRF9NT1NUTFlfSEFTSFRBQkxFKG1tX3Nsb3RzX2hhc2gsIE1NX1NMT1RTX0hBU0hfQklUUyk7XFxubW0va2h1Z2VwYWdlZC5jLTEwNy1cXG4tLVxcbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00NjktXFxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNDcxLVxcdFxcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NTQwPXN0YXRpYyBib29sIGh1Z2VwYWdlX2VuYWJsZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy01NTctXFxubW0va2h1Z2VwYWdlZC5jOjU1ODp2b2lkIF9fa2h1Z2VwYWdlZF9lbnRlcihzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG5tbS9raHVnZXBhZ2VkLmMtNTU5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz02MDg9c3RhdGljIGJvb2wgY29sbGFwc2VfcG9zc2libGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNjEzLVxcbm1tL2todWdlcGFnZWQuYzo2MTQ6dm9pZCBraHVnZXBhZ2VkX2VudGVyX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNjE1LVxcdFxcdFxcdCAgdm1fZmxhZ3NfdCB2bV9mbGFncylcXG4tLVxcbm1tL2todWdlcGFnZWQuYy02MjEtXFxubW0va2h1Z2VwYWdlZC5jOjYyMjp2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbm1tL2todWdlcGFnZWQuYy02MjMte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE4Nzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjExNi0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjExNzp2b2lkIGNvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTIxMTgtXFx0XFx0Ym9vbCBpbnN0YWxsX3BtZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMDY3PXN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMwODctXFxubW0va2h1Z2VwYWdlZC5jOjMwODg6dm9pZCBzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTMwODkte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxMzgtXFxubW0va2h1Z2VwYWdlZC5jOjMxMzk6aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxcbm1tL2todWdlcGFnZWQuYy0zMTQwLXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTY1LVxcbm1tL2todWdlcGFnZWQuYzozMTY2OnZvaWQga2h1Z2VwYWdlZF9taW5fZnJlZV9rYnl0ZXNfdXBkYXRlKHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTMxNjcte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNzItXFxubW0va2h1Z2VwYWdlZC5jOjMxNzM6Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG5tbS9raHVnZXBhZ2VkLmMtMzE3NC17XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MzE3OD1zdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMDktXFxubW0va2h1Z2VwYWdlZC5jOjMyMTA6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjo1Mi41OTEyMDQzMTRaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTQ4NjU3NzQyNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgUmVsZXZhbnQgVEhQIEZ1bmN0aW9ucyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb3JlIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiB0cmFuc3BhcmVudCBodWdlIHBhZ2VzIChUSFApIG1hbmFnZW1lbnQsIHBhcnRpY3VsYXJseSB0aGUgb25lcyB0aGF0IHNlZW0gbW9zdCByZWxldmFudCB0byB0aGUgbW9kaWZpZWQgbG9naWMuIEkndmUgYmVlbiBnaXZlbiBhIGxpc3Qgb2Ygbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCBteSBleHBlcnQgaW50dWl0aW9uIGlzIGltbWVkaWF0ZWx5IGRyYXduIHRvIGEgZmV3IGtleSBwbGF5ZXJzLlxuXG5JJ20gc2VlaW5nOiBgaHVnZXBhZ2VfbWFkdmlzZWAsIGBfX2todWdlcGFnZWRfZW50ZXJgLCBga2h1Z2VwYWdlZF9lbnRlcl92bWFgLCBgX19raHVnZXBhZ2VkX2V4aXRgLCBgY29sbGFwc2VfcHRlX21hcHBlZF90aHBgLCBgc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlc2AsIGBzdGFydF9zdG9wX2todWdlcGFnZWRgLCBga2h1Z2VwYWdlZF9taW5fZnJlZV9rYnl0ZXNfdXBkYXRlYCwgYGN1cnJlbnRfaXNfa2h1Z2VwYWdlZGAsIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuXG5cblJpZ2h0IGF3YXksIEkgemVybyBpbiBvbiBgbWFkdmlzZV9jb2xsYXBzZWAgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBhcyBsaWtlbHkgcG9pbnRzIG9mIGludGVyZXN0LiBBZnRlciBhIHF1aWNrIHNjYW4sIEkgcmVjYWxsIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBvbmUgdGhhdCB1bHRpbWF0ZWx5IGNhbGxzIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiwgaGl0cyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGlzIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBmdW5jdGlvbiBJJ20gbG9va2luZyBmb3IgLSBhIGZ1bmN0aW9uIHRoYXQgZGlyZWN0bHkgbWFuYWdlcyBwYWdlIHRhYmxlIGVudHJpZXMuIEV4Y2VsbGVudC4gSSdtIGdvaW5nIHRvIGluY2x1ZGUgYG1hZHZpc2VfY29sbGFwc2VgIGluIGBGb2N1c1N5bWJvbHNgLlxuXG5UaGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpcyBhbHNvIGltbWVkaWF0ZWx5IGp1bXBpbmcgb3V0IGF0IG1lIGFzIGFub3RoZXIga2V5IHBhcnQgb2YgdGhpcyBvdmVyYWxsIFRIUCBzdG9yeS4gSXQncyBhIGJhY2tncm91bmQgdGhyZWFkLCBzbyBpdCBvcGVyYXRlcyBkaWZmZXJlbnRseSwgYnV0IGl0J3MgY2VudHJhbCB0byBtYW5hZ2luZyBUSFBzLlxuXG5Ob3csIGxldCdzIGdldCBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscy4gVGltZSB0byBjaGVjayB0aGUgYENPTkZJR19gIG9wdGlvbnMgbmVlZGVkLiBJIG5lZWQgdG8gbG9vayBpbnRvIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBmb3IgVEhQLiBJIGtub3cgdGhlIHNvdXJjZSBmaWxlIGlzIGBtbS9raHVnZXBhZ2VkLmNgLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBgbW0vTWFrZWZpbGVgIGFzIHdlbGwgdG8gc2VlIGhvdyB0aGlzIGFsbCBmaXRzIHRvZ2V0aGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODY0MCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzowNy40NTY5ODEzNzNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Njg1NjQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSArPSBtaWdyYXRlX2RldmljZS5vXFxubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgKz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MDcuNTAyNjcxNDkzWiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQyNzQzMjczNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgdGhlIHN5c3RlbSBuZWVkcyBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCdzIHRoZSBiYXNlbGluZS4gTm93LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhlIGNvZGUsIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZvciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiBUaGUgcGF0Y2ggbWVudGlvbnMgYG1USFBg4oCUbXVsdGktc2l6ZSBUSFAsIEkgYXNzdW1lLiBJIHdvbmRlciBpZiB0aGVyZSdzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIHRoYXQgYXMgd2VsbC4gQmVzdCB0byBnZXQgYSBmdWxsIHBpY3R1cmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbnZvbHZlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk0NjAsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzoxMS43NzcwMDEwOTRaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTcxODA5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtVEhQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjExLjgyMjk4MDc5NFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MzM2MjIxMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIHRoZSBLY29uZmlnIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZXMqKlxuXG5BbHJpZ2h0LCB0aGUgb2JqZWN0aXZlIGlzIHByZXR0eSBjbGVhci4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIGtub3cgdGhhdCBgbW0vS2NvbmZpZ2AgaXMgdGhlIGdvLXRvIHBsYWNlIGZvciBtZW1vcnkgbWFuYWdlbWVudCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBkZWZpbmVkIGFuZCBkb2N1bWVudGVkLiBTbywgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gY3JhY2sgb3BlbiB0aGF0IGZpbGUgYW5kIHN0YXJ0IGxvb2tpbmcuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgZGVmaW5pdGlvbiBmb3IgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aGVyZS4gSSdsbCBiZSBsb29raW5nIGZvciBpdHMgZGVwZW5kZW5jaWVzLCBkZWZhdWx0IHNldHRpbmdzLCBhbmQgYW55IHJlbGV2YW50IGhlbHAgdGV4dCB0aGF0IGNsYXJpZmllcyBpdHMgcHVycG9zZSBhbmQgaW1wbGljYXRpb25zLiBJdCdzIHRpbWUgdG8gZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyBwbGFjZSBpbiB0aGUgYnJvYWRlciBtZW1vcnkgbWFuYWdlbWVudCBsYW5kc2NhcGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NjQ2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MTYuMTU5MjA0MzI0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTM1MTYwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgzMT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMzLVxcbm1tL0tjb25maWc6ODM0Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzNS1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1Ny1cXG5tbS9LY29uZmlnOjg1ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTktXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjQtXFxubW0vS2NvbmZpZzo4NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2Ni1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzMtXFxubW0vS2NvbmZpZzo4NzQ6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzUtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg4MT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODkwLVxcbm1tL0tjb25maWc6ODkxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTItXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwMC1cXG5tbS9LY29uZmlnOjkwMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMi1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwOC1cXG5tbS9LY29uZmlnOjkwOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTEwLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTYtXFxubW0vS2NvbmZpZzo5MTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTgtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzNS1cXG5tbS9LY29uZmlnOjkzNjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM3LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDQtXFxubW0vS2NvbmZpZzo5NDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTItXFxubW0vS2NvbmZpZzo5NTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1NC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTYwLVxcbm1tL0tjb25maWc6OTYxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MTYuMjA0NTU5NTczWiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2MDQ1OTI2ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGUgY29yZSBmb2N1cyBoZXJlIGlzIHRoZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGNvbmZpZywgdGhhdCdzIHRoZSBwcmltYXJ5IGRyaXZlci4gSSdtIHdvbmRlcmluZyBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHJlbGF0ZWQgY29uZmlncywgYnV0IEknbGwgYXNzdW1lIHRoaXMgaXMgdGhlIG1haW4gZW5hYmxlciBmb3Igbm93LiBUaGlzIHBhdGNoIG1vZGlmaWVzIGBtbS9raHVnZXBhZ2VkLmNgLCB3aGljaCB0ZWxscyBtZSB3ZSdyZSBkZWFsaW5nIGRpcmVjdGx5IHdpdGggdGhlIGNvcmUga2VybmVsIGxvZ2ljIHJlbGF0ZWQgdG8gVHJhbnNwYXJlbnQgSHVnZVBhZ2VzLiBHb29kLlxuXG5UaGUgbW9kaWZpY2F0aW9ucyBhcmUgZnVuY3Rpb25hbCwgYW5kIEkgY2FuIGNvbmZpcm0gdGhleSBhcmUgcmVhY2hhYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgY29kZS4gVGhleSd2ZSByZWZhY3RvcmVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMsIHNwbGl0dGluZyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGhlbHBlciBmdW5jdGlvbi4gU21hcnQgbW92ZS4gVGhleSd2ZSBhbHNvIGludHJvZHVjZWQgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCwgd2hpY2ggaXMgYSBuZWF0IHdheSB0byBwYXNzIHRoZSByZXF1aXJlZCBzdGF0ZS4gQW5kIHRoZSBhZGRpdGlvbiBvZiB0aGUgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlciBzZWVtcyBsaWtlIGEgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHRoaXMgYXJlYS5cblxuVGhlIGNoYW5nZXMgYXJlIGNsZWFybHkgd2l0aGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLCBzbyB0aGlzIGlzIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkuIFRoaXMgY29kZSBpcyBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZS4gVGhhdCBjYW4gYmUgZG9uZSBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB3aXRoIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4gR2l2ZW4gdGhlIGNyaXRpY2FsIG5hdHVyZSBvZiBUSFAsIGFuZCB0aGlzIHBhdGNoJ3MgaW52b2x2ZW1lbnQgaW4gUFRFIGhhbmRsaW5nLCBpdCdzIGNsZWFyIHRoaXMgaXMgYFdvcnRoRnV6emluZz10cnVlYC5cblxuTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlci4gSSB3YW50IHRvIGNoZWNrIGZvciBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0va2h1Z2VwYWdlZC5jYCB0aGF0IGFyZSBhbHNvIG1vZGlmaWVkIG9yIHJlbGF0ZWQuIExldCdzIHNlZS4uLiBBaCwgYGh1Z2VwYWdlX21hZHZpc2VgIGxvb2tzIHJlbGV2YW50LCBhcyB3ZWxsLiBMZXQgbWUgdGFrZSBhIGxvb2sgYXQgaXQgaW4gYG1tL2todWdlcGFnZWQuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNjAwLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjkyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjI0LjgwOTE1NTMxNVoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNjc5NDk3MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJodWdlcGFnZV9tYWR2aXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ5OT1jaGFuZ2VfaHVnZV9wdWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTAtXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NTExOmludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTcwMj1zdGF0aWMgaW5saW5lIGJvb2wgdW5tYXBfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNzExLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjcxMjpzdGF0aWMgaW5saW5lIGludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxMy1cXHRcXHRcXHRcXHQgICB2bV9mbGFnc190ICp2bV9mbGFncywgaW50IGFkdmljZSlcXG4tLVxcbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00NjktXFxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNDcxLVxcdFxcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXFxuLS1cXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTE0MTctXFx0Y2FzZSBNQURWX05PSFVHRVBBR0U6XFxubW0vbWFkdmlzZS5jOjE0MTg6XFx0XFx0ZXJyb3IgPSBodWdlcGFnZV9tYWR2aXNlKHZtYSwgXFx1MDAyNm5ld19mbGFncywgYmVoYXZpb3IpO1xcbm1tL21hZHZpc2UuYy0xNDE5LVxcdFxcdGlmIChlcnJvcilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MjYuMjQ1OTU1MTA5WiIsIlNlcSI6MzcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNzY0NjM0MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBQYXRjaCBvbiBUcmFuc3BhcmVudCBIdWdlUGFnZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBob3cgaXQgcmVsYXRlcyB0byBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBleGFtaW5lIGhvdyBgaHVnZXBhZ2VfbWFkdmlzZWAgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCBhcmUgaW52b2x2ZWQsIGFzIHRoZXkgYXJlIGRpcmVjdCBlbnRyeSBwb2ludHMgZm9yIHJlbGF0ZWQgYG1hZHZpc2VgIGNhbGxzLiBCb3RoIGBNQURWX0hVR0VQQUdFYCBhbmQgYE1BRFZfTk9IVUdFUEFHRWAgYXJlIGhhbmRsZWQgYnkgYGh1Z2VwYWdlX21hZHZpc2VgLCBhbmQgYE1BRFZfQ09MTEFQU0VgIGJ5IGBtYWR2aXNlX2NvbGxhcHNlYC4gSSdsbCB3YW50IHRvIGluY2x1ZGUgYm90aCBpbiBteSBhbmFseXNpcy5cblxuTm93LCBhIGNydWNpYWwgcXVlc3Rpb246IGlzIGBtYWR2aXNlX2NvbGxhcHNlYCBpdHNlbGYgZGlyZWN0bHkgbW9kaWZpZWQgYnkgdGhpcyBwYXRjaD8gTGV0IG1lIGRvdWJsZS1jaGVjay4uLiBubywgaXQgaXNuJ3QuIEhvd2V2ZXIsIGBtYWR2aXNlX2NvbGxhcHNlYCAqZG9lcyogY2FsbCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGNvbGxhcHNlX3NjYW5fcG1kYC4gVGhlIHBhdGNoIGhhcyByZWZhY3RvcmVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgd2l0aGluIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBTbywgZnV6emluZyBgbWFkdmlzZV9jb2xsYXBzZWAgd2lsbCBkZWZpbml0ZWx5IHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlIGluZGlyZWN0bHkuIEkgYWxzbyBub3RlIHRoYXQgdGhlIHBhdGNoIGludHJvZHVjZXMgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCBhbmQgYSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyLlxuXG5MZXQncyBub3QgZm9yZ2V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY3kuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgdGhlIG9ubHkgcmVsZXZhbnQgY29uZmlnLlxuXG5GaW5hbGx5LCBJIHdhbnQgdG8gY29uZmlybSB0aGF0IGBtYWR2aXNlX2NvbGxhcHNlYCBhbmQgYGh1Z2VwYWdlX21hZHZpc2VgIGFyZW4ndCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpZGVseS4gQXMgZXhwZWN0ZWQsIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBleGNsdXNpdmVseSBjYWxsZWQgd2hlbiBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgaXMgdXNlZCwgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBpcyBpbnZva2VkIG9ubHkgd2hlbiBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgYG1hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKWAgaXMgZXhlY3V0ZWQuIEV4Y2VsbGVudCwgdGhleSBhcmUgbm90LiBUaGF0IG1lYW5zIEkgY2FuIGZvY3VzIG15IGFuYWx5c2lzIG9uIHRoZW0gc3BlY2lmaWNhbGx5LlxuXG5JJ20gbm93IHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE3ODIsIk91dHB1dFRva2VucyI6MTkzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjM5LjAxMDU5MTQ5M1oiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MDcwNTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIixcbiAgICBcImh1Z2VwYWdlX21hZHZpc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCIsXG4gICAgXCJodWdlcGFnZV9tYWR2aXNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzozOS4wODc2NjczNDJaIiwiU2VxIjozOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNzM2MDcxMDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MzkuMDg4MTM1OTkyWiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIxNzM1NTk5MjgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxMSAxMzowNDowNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5AQCAtMjI0LDcgKzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxuIHRvIFwiYWx3YXlzXCIgb3IgXCJtYWR2aXNlXCIpLCBhbmQgaXQnbGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKVxuK3RvcC1sZXZlbCBjb250cm9sIGFyZSBcIm5ldmVyXCIpLlxuIFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBAIC0zMDEsNyArMzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcbithbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxuK1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXG4rL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVx1MDAzY3NpemVcdTAwM2VrQi9zdGF0cy8pOjpcbiBcbiBcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXG4gXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NSw2ICs2NSwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuK1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4rXHRQVEVfQ0hFQ0tfRkFJTCxcbitcdFBURV9DSEVDS19DT05USU5VRSxcbit9O1xuK1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE5LDYgKzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XG4gXHRERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4gfTtcbiBcbitzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuK1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0aW50IG5vbmVfb3JfemVybztcbitcdGludCBzaGFyZWQ7XG4rXHRpbnQgdW5tYXBwZWQ7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xuK307XG4rXG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0XHQvKlxuIFx0XHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XG4gXHRcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxuLVx0XHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbitcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuK3tcbitcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbitcdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gXHRub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuQEAgLTY2NSw3NiArNjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBmb2xpb19wdGVfcmVmZXJlbmNlZCgpIC0gQ2hlY2sgaWYgYSBmb2xpbyBvciBpdHMgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWRcbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiByZWNlbnQgYWNjZXNzIHdhcyBvYnNlcnZlZCB0aHJvdWdoIGVpdGhlciB0aGUgZm9saW8gc3RhdGVcbisgKiBvciB0aGUgY3VycmVudCBQVEUgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fcHRlX3JlZmVyZW5jZWQoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRldmFsKVxuK3tcbitcdC8qIFRoZSBmb2xpbyB3YXMgcmVmZXJlbmNlZCBwcmV2aW91c2x5IC4uLiAqL1xuK1x0aWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogLi4uIG9yIHRoZSBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZCAqL1xuK1x0cmV0dXJuIHB0ZV95b3VuZyhwdGV2YWwpIHx8IG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuK1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4re1xuK1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4rXHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbitcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4rfVxuK1xuKy8qXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4rICovXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbitcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4re1xuK1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbitcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbit9XG4rXG4rLypcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuKyAqXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbisgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4rICpcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbit7XG4rXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4rXHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4rXHRcdH1cbitcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbitcdH1cbitcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuK1x0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbitcdFx0aWYgKCsrY3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuK1x0XHR9XG4rXHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHQvKlxuK1x0ICogRG9uJ3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbitcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcbitcdCAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGVcbitcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4rXHQgKi9cbitcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbitcbitcdGN0eC1cdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xuK1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7XG4rXG4rXHQvKlxuK1x0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuK1x0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuK1x0ICovXG4rXHRpZiAoY3R4LVx1MDAzZWNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEoY3R4LVx1MDAzZXZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbitcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cdTAwM2Vmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbitcbitcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbykpIHtcbitcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcbitcdH1cbitcbitcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC1cdTAwM2Vmb2xpbykpIHtcbitcdFx0LypcbitcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbitcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4rXHRcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcbitcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuK1x0XHQgKi9cbitcdFx0aWYgKCsrY3R4LVx1MDAzZXNoYXJlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUsXG4rXHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4rfVxuK1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuK1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBvcmRlcixcbitcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbid0IGNoZWNrIHN3YXAgUFRFcyAqL1xuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4rXHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgKyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJ2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksOCArODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbitcdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xuK1x0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xuQEAgLTc4Niw3ICs4OTIsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR9XG4gXG4gXHRcdC8qXG4tXHRcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxuK1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCArOTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuIFx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0ICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFxuQEAgLTgxOCwxMyArOTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4tXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG5AQCAtOTA0LDcgKzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuIFx0ICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGVcbiBcdCAqIGVudHJ5LiBSZXN0b3JpbmcgUE1EIG5lZWRzIHRvIGJlIGRvbmUgcHJpb3IgdG8gcmVsZWFzaW5nXG4gXHQgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSxcbi1cdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LlxuK1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgKzExNzgsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxuIFx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4gXHQvKlxuIFx0ICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuXG4tXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4rXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxuIFx0ICpcbi1cdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4rXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyArMTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiAvKlxuICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXG4tICogT25seSBkb25lIGlmIGtodWdlcGFnZWRfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuICAqXG4gICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZVxuICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdFxuQEAgLTEyMDQsNyArMTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4rXHRcdCAqIGRvX3N3YXBfcGFnZSgpIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4gXHRcdCAqIE5vdGUgd2UgdHJlYXQgVk1fRkFVTFRfUkVUUlkgYXMgVk1fRkFVTFRfRVJST1IgaGVyZSBiZWNhdXNlXG4gXHRcdCAqIHdlIGRvIG5vdCByZXRyeSBoZXJlIGFuZCBzd2FwIGVudHJ5IHdpbGwgcmVtYWluIGluIHBhZ2V0YWJsZVxuIFx0XHQgKiByZXN1bHRpbmcgaW4gbGF0ZXIgZmFpbHVyZS5cbkBAIC0xMjQ3LDE1ICsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXHUwMDI2Y2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuIFx0aWYgKCFmb2xpbykge1xuIFx0XHQqZm9saW9wID0gTlVMTDtcbi1cdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4tXHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4rXHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuK1x0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiBcdFx0cmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7XG4gXHR9XG4gXG4tXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DKTtcbi1cdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbitcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0MsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4gXG4gXHRpZiAodW5saWtlbHkobWVtX2Nncm91cF9jaGFyZ2UoZm9saW8sIG1tLCBnZnApKSkge1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuQEAgLTEyNzEsNyArMTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4rICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrXG4gICogd2hpbGUgYWxsb2NhdGluZyBhIFRIUCwgYXMgdGhhdCBjb3VsZCB0cmlnZ2VyIGRpcmVjdCByZWNsYWltL2NvbXBhY3Rpb24uXG4gICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi5cbkBAIC0xMzE4LDcgKzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0aWYgKHVubWFwcGVkKSB7XG4gXHRcdC8qXG4tXHRcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuK1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0LypcbiBcdCAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuLVx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXG4tXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cbitcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4rXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgZm9saW8gbG9jay5cbiBcdCAqXG4gXHQgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGVcbiBcdCAqIG1tYXBfbG9jay5cbkBAIC0xMzg5LDkgKzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuK1x0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCgpIHdoZW4gZXN0YWJsaXNoaW5nXG4gXHRcdCAqIGh1Z2VwbWRzIGFuZCBuZXZlciBmb3IgZXN0YWJsaXNoaW5nIHJlZ3VsYXIgcG1kcyB0aGF0XG4tXHRcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUgZm9yIHRoYXRcbitcdFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSgpIGZvciB0aGF0XG4gXHRcdCAqL1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRzcGluX3VubG9jayhwbWRfcHRsKTtcbkBAIC0xNDM5LDcgKzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbitcdFx0XHRcdFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xuIFx0XHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxuIFx0XHRcdHNwaW5fdW5sb2NrKHB0ZV9wdGwpO1xuIFx0fVxuQEAgLTE0NDksMTAgKzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbiBvdXRfdXBfd3JpdGU6XG4tXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdGlmIChwdGUpXG4gXHRcdHB0ZV91bm1hcChwdGUpO1xuK1x0aWYgKGFub25fdm1hX2xvY2tlZClcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4gb3V0X25vbG9jazpcbiBcdGlmIChmb2xpbylcbkBAIC0xNTkzLDQyICsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuIFx0XHRib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG4gXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4gXHRwbWRfdCAqcG1kO1xuIFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcbiBcdGludCBpO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuLVx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbitcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdGludCBub2RlID0gTlVNQV9OT19OT0RFLCB1bm1hcHBlZCA9IDA7XG4rXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXG4rXHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHR9O1xuK1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbitcdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuIFRoZSBiaXRtYXBcbitcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxuIFx0ICovXG4gXHRpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpXG4tXHRcdG1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuK1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgKzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRcdGNjLVx1MDAzZXByb2dyZXNzKys7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKyt1bm1hcHBlZCBcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU1dBUF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3Bcbi1cdFx0XHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcbi1cdFx0XHQgKiBjb21tZW50IGJlbG93IGZvciBwdGVfdWZmZCgpLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIERvbid0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcbi1cdFx0XHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cbi1cdFx0XHQgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhc1xuLVx0XHRcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcbi1cdFx0XHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxuLVx0XHRcdCAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2Zcbi1cdFx0XHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbitcdFx0Zm9saW8gPSBjdHguZm9saW87XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbitcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCsrc2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0LyogU2V0IGJpdCBmb3Igb2NjdXBpZWQgcGFnZXMgKi9cbiBcdFx0X19zZXRfYml0KGksIGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzKTtcbkBAIC0xNzQ5LDMxICsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKlxuIFx0XHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXG4gXHRcdCAqXG4tXHRcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OlxuLVx0XHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXHUwMDNlIGZvbGlvX3JlZl9jb3VudCgpLlxuLVx0XHQgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2Vcbi1cdFx0ICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2Vcbi1cdFx0ICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrXG4tXHRcdCAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4rXHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuK1x0XHQgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZVxuK1x0XHQgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuIFx0XHQgKi9cbiBcdFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkge1xuIFx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcbi1cdFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2Vcbi1cdFx0ICovXG4gXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4tXHRcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuLVx0XHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpKVxuK1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuK1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiArMTgwNCwxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBvdXRfdW5tYXA6XG4gXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcbiBcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XG4tXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbitcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuK1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbitcdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG4gXG5AQCAtMjY5MSw4ICsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcbiBcdFx0aWYgKHhhc19yZXRyeShcdTAwMjZ4YXMsIGZvbGlvKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjM5LjA4ODEzNjg2MloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyMTczNTU3OTc5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBraHVnZXBhZ2VkIFJlZmFjdG9yaW5nIGZvciBLTVNBTiBSZWxldmFuY2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQncyByZWZhY3RvcmluZyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBga2h1Z2VwYWdlZGAsIHNwZWNpZmljYWxseSBpbiBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludHJvZHVjdGlvbiBvZiBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIHJlZmFjdG9yaW5nIG9mIHRoZSBleGlzdGluZyBjb2RlIGludG8gaGVscGVyIGZ1bmN0aW9ucyBsaWtlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEFsc28sIHRoZXkgYXJlIGFkZGluZyBzb21lIG5ldyBmdW5jdGlvbnMgbGlrZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBwdGVfY2hlY2tfZmFpbCgpYC4gVGhlIG1haW4gZ29hbCBzZWVtcyB0byBiZSB0byBpbXByb3ZlIHRoZSBjb2RlJ3Mgc3RydWN0dXJlLCBidXQgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgS01TQU4tZGV0ZWN0YWJsZSBpc3N1ZXMuXG5cbkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0OlxuXG5gYGBjXG5zdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XG5cdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG5cdHN0cnVjdCBmb2xpbyAqZm9saW87XG5cdGludCBub25lX29yX3plcm87XG5cdGludCBzaGFyZWQ7XG5cdGludCB1bm1hcHBlZDtcblx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG5cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDtcblx0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbn07XG5gYGBcblxuQWxyaWdodCwgSSBzZWUgaG93IGl0J3MgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWA6XG5cbmBgYGNcblx0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcblx0XHQuY2MgPSBjYyxcblx0XHQudm1hID0gdm1hLFxuXHRcdC5vcmRlciA9IG9yZGVyLFxuXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cblx0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuXHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcblx0fTtcbmBgYFxuXG5JbXBvcnRhbnQgcG9pbnQgaGVyZTogIGBjdHgubm9uZV9vcl96ZXJvYCBhbmQgYGN0eC5zaGFyZWRgIGFyZSAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCdXQgd2FpdCwgSSdtIHByZXR0eSBzdXJlIGluIEMsIGlmIHlvdSBkb24ndCBpbml0aWFsaXplIGEgc3RydWN0IG1lbWJlciBpdCBnb2VzIHRvIHplcm8sIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIHJ1bGVzLiBRdWljayBjaGVjayBvbiB0aGUgQyBzdGFuZGFyZCBqdXN0IHRvIGJlIHN1cmU6IHllcCwgbWlzc2luZyBmaWVsZHMgaW4gYW4gaW5pdGlhbGl6ZXIgbGlzdCBhcmUgaW5pdGlhbGl6ZWQgYXMgaWYgdGhleSBoYWQgc3RhdGljIHN0b3JhZ2UgZHVyYXRpb24gKGkuZS4sIHplcm9lZCkuIFRoYXQgbWVhbnMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgcmVzdWx0YCwgYGZvbGlvYCwgYW5kIGBtYXhfcHRlc19zd2FwYCB3aWxsIGFsbCBiZSB6ZXJvLiAgTm8gcHJvYmxlbSB0aGVyZS4gIEknbGwgbmVlZCB0byBjaGVjayB0aGUgbG9naWMsIHRob3VnaCwgdG8gbWFrZSBzdXJlIHRoaXMgaXMgd2hhdCBpcyBleHBlY3RlZC5cblxuSSBhbHNvIGNoZWNrZWQgaG93IHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCwgd2hlcmUgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBgcmVzdWx0YCBhcmUgc2ltaWxhcmx5IGxlZnQgdW5pbml0aWFsaXplZCBhbmQgdGh1cyB3aWxsIGJlIGltcGxpY2l0bHkgemVyb2VkLlxuXG5Pa2F5LCBsZXQncyBtYWtlIHN1cmUgbm90aGluZyBpcyB1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gIFRoZSBtYWluIHJpc2sgd291bGQgYmUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYmVpbmcgcmVhZCBhbmQgdXNlZCBpbiBsb2dpYyBvciBjb21wYXJpc29ucy5cblxuSSBjaGVja2VkIGBjdHgudW5tYXBwZWRgLCB3aGljaCBpcyBpbml0aWFsbHkgemVyby1pbml0aWFsaXplZCBpbiBtb3N0IGNhc2VzLCB0aGVuIHNldCB0byBgLTFgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYC4gTm93IGxldCdzIHNlZSB3aGVyZSB0aGF0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgaXQgaXMgdXNlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgOlxuXG5gYGBjXG5cdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuXHRcdCAgICAoY3R4LnVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbmBgYFxuXG5Mb29rcyBsaWtlIGl0IGlzIGJlaW5nIHVzZWQgc2FmZWx5LiBJdCBpcyBpbmNyZW1lbnRlZCBsYXRlciBpbiBgY29sbGFwc2VfY2hlY2tfcHRlYDpcblxuYGBgY1xuXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcblx0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpO1xuXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbmBgYFxuXG5TbyBpdCBsb29rcyBsaWtlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIChvciB0aGUgLTEgaW4gdGhlIG9uZSBjYXNlKSBpcyBkZWxpYmVyYXRlLiBHb29kLlxuXG5JJ20gYWxzbyBsb29raW5nIGF0IHRoZSBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpYCBmdW5jdGlvbi4gU2VlbXMgdGhpcyBpcyBiZWluZyByZXBsYWNlZCBpbiBhIHZlcnkgc3RyYWlnaHRmb3J3YXJkIHdheSwgc28gSSBkb24ndCBzZWUgYW55IGlzc3VlLlxuXG5Ob3csIGNoZWNraW5nIHRoZSBgLTFgIGluaXRpYWxpemF0aW9uIG9mIGB1bm1hcHBlZGAgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZXZpb3VzIGxvZ2ljIGFuZCBhcHBlYXJzIHNhZmUuXG5cblNvLCBpcyB0aGVyZSBhbnkgS01TQU4gcmlzaz8gSSBkb24ndCB0aGluayBzby4gVGhpcyBwYXRjaCBpcyBtb3N0bHkgYSAqcmVmYWN0b3JpbmcqIG9mIGBraHVnZXBhZ2VkYCdzIFBURSBzY2FubmluZy4gSXQncyBub3QgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCB1c2VyIHNwYWNlXG5cbiIsIklucHV0VG9rZW5zIjoxMTE0MiwiT3V0cHV0VG9rZW5zIjoyMDQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDg6MDAuODIzNzE4ODgzWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUwNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIHNjYW5uaW5nIGxvZ2ljIGluIGBraHVnZXBhZ2VkYCBieSBpbnRyb2R1Y2luZyBhIGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGFuZCBhIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCB0byBwYXNzIHN0YXRlLiBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLCB3aGljaCBndWFyYW50ZWVzIHRoYXQgYWxsIHVubGlzdGVkIGZpZWxkcyAoc3VjaCBhcyBgbm9uZV9vcl96ZXJvYCwgYHNoYXJlZGAsIGB1bm1hcHBlZGAsIGBmb2xpb2AsIGFuZCBgcmVzdWx0YCkgYXJlIGltcGxpY2l0bHkgemVyby1pbml0aWFsaXplZCBieSB0aGUgY29tcGlsZXIuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGxlYXZlIGFueSB2YXJpYWJsZXMgdW5pbml0aWFsaXplZCB0aGF0IGNvdWxkIGFmZmVjdCBjb250cm9sIGZsb3cgb3IgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBsb2dpYyBlcnJvcnMsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHdoaWNoIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowz5fkg[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-11 13:00:24 +0000 UTC FinishedAt: 2026-08-11 13:08:03 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "005d5c898c17ecadec427819a20640e37c357997", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "005d5c898c17ecadec427819a20640e37c357997", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE" ], "series_id": "13d7292c-6e76-4e1c-b00d-700ba9e0fed5" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "madvise_collapse", "hugepage_madvise" ], "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+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICAgJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTgxODY2NzBkYTI2MzQwZWFhNWRiNGI1NDNkOWMxODJkMzYzNWY2NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDExIDEzOjA0OjA1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5AQCAtMjI0LDcgJiM0MzsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcJiMzNDthbHdheXNcJiMzNDsgb3IgXCYjMzQ7bWFkdmlzZVwmIzM0OyksIGFuZCBpdCYjMzk7bGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXCYjMzQ7bmV2ZXJcJiMzNDspXG4mIzQzO3RvcC1sZXZlbCBjb250cm9sIGFyZSBcJiMzNDtuZXZlclwmIzM0OykuXG4gXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuQEAgLTMwMSw3ICYjNDM7MzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcbiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbiYjNDM7UGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcbiYjNDM7L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVx1MDAzY3NpemVcdTAwM2VrQi9zdGF0cy8pOjpcbiBcbiBcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXG4gXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4mIzQzO2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4mIzQzO1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4mIzQzO1x0UFRFX0NIRUNLX0ZBSUwsXG4mIzQzO1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuJiM0Mzt9O1xuJiM0MztcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuJiM0MztzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuJiM0MztcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRpbnQgbm9uZV9vcl96ZXJvO1xuJiM0MztcdGludCBzaGFyZWQ7XG4mIzQzO1x0aW50IHVubWFwcGVkO1xuJiM0MztcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4mIzQzO307XG4mIzQzO1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuJiM0MztcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4mIzQzO1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICYjNDM7NjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXG4mIzQzOyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGV2YWwpXG4mIzQzO3tcbiYjNDM7XHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdC8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi9cbiYjNDM7XHRyZXR1cm4gcHRlX3lvdW5nKHB0ZXZhbCkgfHwgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXG4mIzQzO1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbiYjNDM7XHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbiYjNDM7XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxuJiM0MzsgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxuJiM0MztcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4mIzQzO3tcbiYjNDM7XHRjdHgtXHUwMDNlcmVzdWx0ID0gcmVzdWx0O1xuJiM0MztcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbiYjNDM7ICpcbiYjNDM7ICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4mIzQzOyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4mIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlXG4mIzQzOyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbiYjNDM7ICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuJiM0MzsgKlxuJiM0MzsgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuJiM0MzsgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4mIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuJiM0MztcdFx0aWYgKCYjNDM7JiM0MztjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4mIzQzO1x0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXG4mIzQzO1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbiYjNDM7XHR9XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbiYjNDM7XHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4mIzQzO1x0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxuJiM0MztcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbiYjNDM7XG4mIzQzO1x0Y3R4LVx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cdTAwM2V2bWEsIGFkZHIsIHB0ZXZhbCk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbiYjNDM7XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LVx1MDAzZWZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSkge1xuJiM0MztcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbiYjNDM7XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuJiM0MztcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuJiM0MztcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbiYjNDM7XHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4mIzQzO1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbiYjNDM7XHRcdC5jYyA9IGNjLFxuJiM0MztcdFx0LnZtYSA9IHZtYSxcbiYjNDM7XHRcdC5vcmRlciA9IG9yZGVyLFxuJiM0MztcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbiYjMzk7dCBjaGVjayBzd2FwIFBURXMgKi9cbiYjNDM7XHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4mIzQzO1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICYjNDM7IG5yX3BhZ2VzO1xuIFx0ICAgICBfcHRlJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4tXHRcdHB0ZV90IHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4mIzQzO1x0XHRwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbiYjNDM7XHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4mIzQzO1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbiYjNDM7XHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbiYjNDM7XHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuLVx0XHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuLVx0XHRcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcbi1cdFx0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseVxuIFx0XHQgKiB3YW50IHRvIGNvbGxhcHNlLlxuQEAgLTc1OSw4ICYjNDM7ODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4mIzQzO1x0XHQgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xuJiM0MztcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyAmIzQzOzg5Miw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdH1cbiBcbiBcdFx0Lypcbi1cdFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXG4mIzQzO1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCAmIzQzOzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuJiM0MztcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiYjNDM7XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4mIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4mIzQzO1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiYjNDM7XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuJiM0MztcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICYjNDM7MTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4mIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICYjNDM7MTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4mIzQzO1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4mIzQzO1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuJiM0MztcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4mIzQzO1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbiYjNDM7XHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4mIzQzO1x0aWYgKGFub25fdm1hX2xvY2tlZClcbiYjNDM7XHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiAmIzQzOzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbiYjNDM7XHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4mIzQzO1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4mIzQzO1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7dW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiYjNDM7XHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuJiM0MztcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbiYjNDM7XHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuIFx0XHQgICAoIXJlZmVyZW5jZWQgfHxcbi1cdFx0ICAgICh1bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4mIzQzO1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiAmIzQzOzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gb3V0X3VubWFwOlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XG4gXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xuLVx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4mIzQzO1x0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbiBcdFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHRcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4mIzQzO1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbiYjNDM7XHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuIFxuQEAgLTI2OTEsOCAmIzQzOzI3MTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRwcmVzZW50ID0gMDtcbiBcdHN3YXAgPSAwO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7XG4gXHRcdGlmICh4YXNfcmV0cnkoXHUwMDI2eGFzLCBmb2xpbykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7LAogICAgJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIGluIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBJdCBhbHNvIGludHJvZHVjZXMgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCB0byBwYXNzIHN0YXRlIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgdGhlIGhlbHBlci4gVGhlIHBhdGNoIGFsc28gYWRkcyBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyLiBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIGNvcmUga2VybmVsIGxvZ2ljLCBzcGVjaWZpY2FsbHkgaW4gdGhlIFRyYW5zcGFyZW50IEh1Z2VQYWdlcyAoVEhQKSBzdWJzeXN0ZW0uIFRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZSwgZWl0aGVyIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gb3IgbWFudWFsbHkgdmlhIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAxMSAxMzowNDowNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAppbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CkBAIC0yMjQsNyAmIzQzOzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZAogKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0CiB0byAmIzM0O2Fsd2F5cyYjMzQ7IG9yICYjMzQ7bWFkdmlzZSYjMzQ7KSwgYW5kIGl0JiMzOTtsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW4KIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlCi10b3AtbGV2ZWwgY29udHJvbCBhcmUgJiMzNDtuZXZlciYjMzQ7KQomIzQzO3RvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspLgogCiBwcm9jZXNzIFRIUCBjb250cm9scwogLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMSw3ICYjNDM7MzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZQogaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSwKIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci4KIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLAotYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OgomIzQzO2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuCiYjNDM7UGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXIKJiM0Mzsvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtJmx0O3NpemUmZ3Q7a0Ivc3RhdHMvKTo6CiAKIAkvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZAogCmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmMKaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDQKLS0tIGEvbW0va2h1Z2VwYWdlZC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2todWdlcGFnZWQuYwpAQCAtNjUsNiAmIzQzOzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQgewogCVNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssCiB9OwogCiYjNDM7ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHsKJiM0MzsJUFRFX0NIRUNLX1NVQ0NFRUQsCiYjNDM7CVBURV9DSEVDS19GQUlMLAomIzQzOwlQVEVfQ0hFQ0tfQ09OVElOVUUsCiYjNDM7fTsKJiM0MzsKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgJmx0O3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oJmd0OwogCkBAIC0xMTksNiAmIzQzOzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7CiAJREVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwogfTsKIAomIzQzO3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7CiYjNDM7CXN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYzsKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiYjNDM7CXVuc2lnbmVkIGludCBvcmRlcjsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJaW50IG5vbmVfb3JfemVybzsKJiM0MzsJaW50IHNoYXJlZDsKJiM0MzsJaW50IHVubWFwcGVkOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkOwomIzQzO307CiYjNDM7CiAvKioKICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nCiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhbgpAQCAtNjIwLDcgJiM0Mzs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogCQkvKgogCQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0CiAJCSAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1bgotCQkgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGwKJiM0MzsJCSAqIHVuZGVyIG1tYXBfbG9jayByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGwKIAkJICogcGFnZXRhYmxlcyB3aWxsIGJlIGRlc3Ryb3llZCkgdW50aWwga2h1Z2VwYWdlZCBoYXMgZmluaXNoZWQKIAkJICogd29ya2luZyBvbiB0aGUgcGFnZXRhYmxlcyB1bmRlciB0aGUgbW1hcF9sb2NrLgogCQkgKi8KQEAgLTYyOSw2ICYjNDM7NjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJfQogfQogCiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKQomIzQzO3sKJiM0MzsJbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7CiYjNDM7CW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbykKIHsKIAlub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLApAQCAtNjY1LDc2ICYjNDM7NjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSwKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIHJlY2VudCBhY2Nlc3Mgd2FzIG9ic2VydmVkIHRocm91Z2ggZWl0aGVyIHRoZSBmb2xpbyBzdGF0ZQomIzQzOyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19wdGVfcmVmZXJlbmNlZChzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRldmFsKQomIzQzO3sKJiM0MzsJLyogVGhlIGZvbGlvIHdhcyByZWZlcmVuY2VkIHByZXZpb3VzbHkgLi4uICovCiYjNDM7CWlmIChmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fCBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CS8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi8KJiM0MzsJcmV0dXJuIHB0ZV95b3VuZyhwdGV2YWwpIHx8IG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCwKJiM0MzsJCWVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudCkKJiM0Mzt7CiYjNDM7CWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQomIzQzOwkJY291bnRfdm1fZXZlbnQodm1fZXZlbnQpOwomIzQzOwljb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kCiYjNDM7ICogcmV0dXJuIFBURV9DSEVDS19GQUlMLgomIzQzOyAqLwomIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsCiYjNDM7CQllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCkKJiM0Mzt7CiYjNDM7CWN0eC0mZ3Q7cmVzdWx0ID0gcmVzdWx0OwomIzQzOwlyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UKJiM0MzsgKgomIzQzOyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgomIzQzOyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkCiYjNDM7ICogLSB1ZmZkIGlzIG5vdCBhY3RpdmUKJiM0MzsgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50CiYjNDM7ICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudAomIzQzOyAqCiYjNDM7ICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnQKJiM0MzsgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsCiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsCiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsCiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KQomIzQzO3sKJiM0MzsJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O25vbmVfb3JfemVybyAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfbm9uZSkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewomIzQzOwkJaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpOwomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O3VubWFwcGVkICZndDsgY3R4LSZndDttYXhfcHRlc19zd2FwKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpCiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CQlyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZAomIzQzOwkgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkCiYjNDM7CSAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGUKJiM0MzsJICogcmVnaXN0ZXJlZCByYW5nZS4KJiM0MzsJICovCiYjNDM7CWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7CiYjNDM7CiYjNDM7CWN0eC0mZ3Q7Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LSZndDt2bWEsIGFkZHIsIHB0ZXZhbCk7CiYjNDM7CWlmICh1bmxpa2VseSghY3R4LSZndDtmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LSZndDtmb2xpbykpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCiYjNDM7CSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KJiM0MzsJICovCiYjNDM7CWlmIChjdHgtJmd0O2NjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgIShjdHgtJmd0O3ZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7CiYjNDM7CSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC0mZ3Q7Zm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKQomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSwgY3R4LSZndDtmb2xpbyk7CiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LSZndDtmb2xpbykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgomIzQzOwkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCiYjNDM7CQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCiYjNDM7CQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtzaGFyZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3NoYXJlZCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU0hBUkVEX1BURSk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19TVUNDRUVEOwomIzQzO30KJiM0MzsKIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLAogCQl1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KQogewotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7Ci0JcHRlX3QgKl9wdGU7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwomIzQzOwlwdGVfdCAqX3B0ZSwgcHRldmFsOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiAJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBvcmRlciwKJiM0MzsJCS51bm1hcHBlZCA9IC0xLCAvKiBkb24mIzM5O3QgY2hlY2sgc3dhcCBQVEVzICovCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLAomIzQzOwl9OwogCiAJZm9yIChfcHRlID0gcHRlOyBfcHRlICZsdDsgcHRlICYjNDM7IG5yX3BhZ2VzOwogCSAgICAgX3B0ZSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewotCQlwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTsKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChwdGVfdWZmZChwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQkJVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7Ci0KLQkJLyoKLQkJICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbAotCQkgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSAmYW1wOyZhbXA7Ci0JCSAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSAmYW1wOyZhbXA7ICFwdGVfZGlydHkocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFOwomIzQzOwkJcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHsKJiM0MzsJCQlyZXN1bHQgPSBjdHgucmVzdWx0OwogCQkJZ290byBvdXQ7CiAJCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCi0JCS8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqLwotCQlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHsKLQkJCS8qCi0JCQkgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlcgotCQkJICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhCi0JCQkgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhCi0JCQkgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuCi0JCQkgKi8KLQkJCWlmICgmIzQzOyYjNDM7c2hhcmVkICZndDsgbWF4X3B0ZXNfc2hhcmVkKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTsKLQkJCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9CiAJCS8qCiAJCSAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJiMzOTtkIGFjdHVhbGx5CiAJCSAqIHdhbnQgdG8gY29sbGFwc2UuCkBAIC03NTksOCAmIzQzOzg2NSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAkJLyoKIAkJICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZQotCQkgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9jawotCQkgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlCiYjNDM7CQkgKiBmb2xpbyBjYW4mIzM5O3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9jawomIzQzOwkJICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpCiAJCSAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS4KIAkJICovCiAJCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHsKQEAgLTc4Niw3ICYjNDM7ODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJfQogCiAJCS8qCi0JCSAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZQomIzQzOwkJICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlCiAJCSAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHsKQEAgLTgwMywxNCAmIzQzOzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKIAkJCWxpc3RfYWRkX3RhaWwoJmFtcDtmb2xpby0mZ3Q7bHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7CiBuZXh0OgotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCiAJCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAKQEAgLTgxOCwxMyAmIzQzOzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOwogCX0gZWxzZSB7CiAJCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKLQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybywKJiM0MzsJCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIG91dDoKIAlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKLQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybywKIAkJCQkJICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC05MDQsNyAmIzQzOzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLAogCSAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlCiAJICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmcKIAkgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSwKLQkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS4KJiM0MzsJICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS4KIAkgKi8KIAlwbWRfcHRsID0gcG1kX2xvY2sodm1hLSZndDt2bV9tbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUodm1hLSZndDt2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpOwpAQCAtMTA3OCw5ICYjNDM7MTE3OCw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsCiAJCXJldHVybiBTQ0FOX1ZNQV9DSEVDSzsKIAkvKgogCSAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlbgotCSAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFxdWlyZWQgdGhlIG1tYXBfbG9jay4KJiM0MzsJICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay4KIAkgKgotCSAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlCiYjNDM7CSAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKIAkgKiB2bWFzLgogCSAqLwogCWlmIChleHBlY3RfYW5vbiAmYW1wOyZhbXA7ICghKCp2bWFwKS0mZ3Q7YW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSkKQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIC8qCiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLgotICogT25seSBkb25lIGlmIGtodWdlcGFnZWRfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS4KJiM0MzsgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgogICoKICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2UKICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdApAQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJcHRlID0gTlVMTDsKIAogCQkvKgotCQkgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KJiM0MzsJCSAqIGRvX3N3YXBfcGFnZSgpIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suCiAJCSAqIE5vdGUgd2UgdHJlYXQgVk1fRkFVTFRfUkVUUlkgYXMgVk1fRkFVTFRfRVJST1IgaGVyZSBiZWNhdXNlCiAJCSAqIHdlIGRvIG5vdCByZXRyeSBoZXJlIGFuZCBzd2FwIGVudHJ5IHdpbGwgcmVtYWluIGluIHBhZ2V0YWJsZQogCQkgKiByZXN1bHRpbmcgaW4gbGF0ZXIgZmFpbHVyZS4KQEAgLTEyNDcsMTUgJiM0MzsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1CiAJZm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsICZhbXA7Y2MtJmd0O2FsbG9jX25tYXNrKTsKIAlpZiAoIWZvbGlvKSB7CiAJCSpmb2xpb3AgPSBOVUxMOwotCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpOwotCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpOwomIzQzOwkJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsCiYjNDM7CQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiAJCXJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOwogCX0KIAotCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpOwotCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKJiM0MzsJY291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTsKIAogCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7CiAJCWZvbGlvX3B1dChmb2xpbyk7CkBAIC0xMjcxLDcgJiM0MzsxMzY4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIH0KIAogLyoKLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZAomIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrCiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi4KICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uCkBAIC0xMzE4LDcgJiM0MzsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCWlmICh1bm1hcHBlZCkgewogCQkvKgotCQkgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKJiM0MzsJCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbigpIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrCiAJCSAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpbgogCQkgKiB0aGF0IGNhc2UuICBDb250aW51aW5nIHRvIGNvbGxhcHNlIGNhdXNlcyBpbmNvbnNpc3RlbmN5LgogCQkgKi8KQEAgLTEzMzEsOCAmIzQzOzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCS8qCiAJICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0JICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNCi0JICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLgomIzQzOwkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTQomIzQzOwkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IGZvbGlvIGxvY2suCiAJICoKIAkgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGUKIAkgKiBtbWFwX2xvY2suCkBAIC0xMzg5LDkgJiM0MzsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAkJc3Bpbl9sb2NrKHBtZF9wdGwpOwogCQlWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTsKIAkJLyoKLQkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmcKJiM0MzsJCSAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmcKIAkJICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXQKLQkJICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdAomIzQzOwkJICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSgpIGZvciB0aGF0CiAJCSAqLwogCQlwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpOwogCQlzcGluX3VubG9jayhwbWRfcHRsKTsKQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQkJc3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCW1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkciwKLQkJCQkJICAvKnVmZmRfd3A9Ki8gZmFsc2UpOwomIzQzOwkJCQkJICAvKnVmZmQ9Ki8gZmFsc2UpOwogCQlpZiAocHRlX3B0bCAhPSBwbWRfcHRsKQogCQkJc3Bpbl91bmxvY2socHRlX3B0bCk7CiAJfQpAQCAtMTQ0OSwxMCAmIzQzOzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHMKIAogCXJlc3VsdCA9IFNDQU5fU1VDQ0VFRDsKIG91dF91cF93cml0ZToKLQlpZiAoYW5vbl92bWFfbG9ja2VkKQotCQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJaWYgKHB0ZSkKIAkJcHRlX3VubWFwKHB0ZSk7CiYjNDM7CWlmIChhbm9uX3ZtYV9sb2NrZWQpCiYjNDM7CQlhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLSZndDthbm9uX3ZtYSk7CiAJbW1hcF93cml0ZV91bmxvY2sobW0pOwogb3V0X25vbG9jazoKIAlpZiAoZm9saW8pCkBAIC0xNTkzLDQyICYjNDM7MTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKIAkJYm9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7Ci0JdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7CiAJZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7CiAJaW50IGk7Ci0JaW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwOwotCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwomIzQzOwllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVyczsKIAlzcGlubG9ja190ICpwdGw7Ci0JaW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDsKJiM0MzsJaW50IG5vZGUgPSBOVU1BX05PX05PREU7CiYjNDM7CWVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7CiAKIAlWTV9CVUdfT04oc3RhcnRfYWRkciAmYW1wOyB+SFBBR0VfUE1EX01BU0spOwogCiYjNDM7CXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CiYjNDM7CQkuY2MgPSBjYywKJiM0MzsJCS52bWEgPSB2bWEsCiYjNDM7CQkub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsCiYjNDM7CQkubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksCiYjNDM7CX07CiYjNDM7CiAJcmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsICZhbXA7cG1kKTsKIAlpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkgewogCQljYy0mZ3Q7cHJvZ3Jlc3MmIzQzOyYjNDM7OwogCQlnb3RvIG91dDsKIAl9CiAKLQliaXRtYXBfemVybyhjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpOwotCW1lbXNldChjYy0mZ3Q7bm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtJmd0O25vZGVfbG9hZCkpOwotCW5vZGVzX2NsZWFyKGNjLSZndDthbGxvY19ubWFzayk7CiYjNDM7CWNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTsKIAogCWVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLSZndDt2bV9mbGFncywgdHZhX2ZsYWdzKTsKIAogCS8qCiAJICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlCi0JICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4KJiM0MzsJICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcAomIzQzOwkgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci4KIAkgKi8KIAlpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpCi0JCW1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwomIzQzOwkJY3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCAmYW1wO3B0bCk7CiAJaWYgKCFwdGUpIHsKQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAKLQkJaWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mztub25lX29yX3plcm8gJmd0OyBtYXhfcHRlc19ub25lKSB7Ci0JCQkJcmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJaWYgKCYjNDM7JiM0Mzt1bm1hcHBlZCAmZ3Q7IG1heF9wdGVzX3N3YXApIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJLyoKLQkJCSAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwCi0JCQkgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWUKLQkJCSAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuCi0JCQkgKi8KLQkJCWlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCS8qCi0JCQkgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbAotCQkJICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uCi0JCQkgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhcwotCQkJICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpcwotCQkJICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd24KLQkJCSAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2YKLQkJCSAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLgotCQkJICovCi0JCQlyZXN1bHQgPSBTQ0FOX1BURV9VRkZEOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0X3VubWFwOwotCQl9Ci0JCWZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCAmYW1wO2N0eCk7CiYjNDM7CQlmb2xpbyA9IGN0eC5mb2xpbzsKJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHsKJiM0MzsJCQlyZXN1bHQgPSBjdHgucmVzdWx0OwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KLQotCQlpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQCi0JCSAqIGlzIHNoYXJlZC4KLQkJICovCi0JCWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkgewotCQkJaWYgKCYjNDM7JiM0MztzaGFyZWQgJmd0OyBtYXhfcHRlc19zaGFyZWQpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLAotCQkJCQkJTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAogCQkvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqLwogCQlfX3NldF9iaXQoaSwgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzKTsKQEAgLTE3NDksMzEgJiM0MzsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuCiAJCSAqCi0JCSAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OgotCQkgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgJmd0OyBmb2xpb19yZWZfY291bnQoKS4KLQkJICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlCi0JCSAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlCi0JCSAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVjawotCQkgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgomIzQzOwkJICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kCiYjNDM7CQkgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZQomIzQzOwkJICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy4KIAkJICovCiAJCWlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHsKIAkJCXJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9CiAKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwogCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCSAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4MSwxNiAmIzQzOzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiBvdXRfdW5tYXA6CiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJaWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHsKLQkJLyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqLwomIzQzOwkJLyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiAJCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCQlyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLAotCQkJCSAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKJiM0MzsJCQkJICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKIAkJLyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqLwogCQkqbG9ja19kcm9wcGVkID0gdHJ1ZTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsCi0JCQkJICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpOwomIzQzOwkJCQkgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjkxLDggJiM0MzsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJcHJlc2VudCA9IDA7CiAJc3dhcCA9IDA7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCXJjdV9yZWFkX2xvY2soKTsKIAl4YXNfZm9yX2VhY2goJmFtcDt4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7CiAJCWlmICh4YXNfcmV0cnkoJmFtcDt4YXMsIGZvbGlvKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTExNDUKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLaHVnZXBhZ2VkIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbW0va2h1Z2VwYWdlZC5jYC4gSXQgc2VlbXMgdGhleSYjMzk7dmUgcmVvcmdhbml6ZWQgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAuIFRoZXkmIzM5O3ZlIGNsZXZlcmx5IGV4dHJhY3RlZCB0aGlzIGxvZ2ljIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBHb29kIG1vdmUg4oCTIGtlZXBzIHRoaW5ncyBjbGVhbmVyIGFuZCBtb3JlIG1vZHVsYXIuIFRoZXkmIzM5O3ZlIGFsc28gaW50cm9kdWNlZCBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYXJvdW5kLiBUaGF0IG1ha2VzIGEgbG90IG9mIHNlbnNlLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHRoaXMga2luZCBvZiBpbnRyaWNhdGUgUFRFIG1hbmlwdWxhdGlvbi4KCkFuZCBhaCwgdGhlcmUmIzM5O3MgYSBuZXcgaGVscGVyLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcsIHByb2JhYmx5IHNpbXBsaWZpZXMgc29tZSBjaGVja3MuIE5vdywgdGhlIG1lYXQgb2YgaXQ6IHRoZXkmIzM5O3ZlIHN3aXRjaGVkIGZyb20gYHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSgpYCB0byBgZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oKWAgd2l0aGluIHRoYXQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBmdW5jdGlvbi4gV2FpdCBhIHNlY29uZC4uLiBgdm1fbm9ybWFsX2ZvbGlvKClgPyBJIHRob3VnaHQgd2Ugd2VyZSBzdGlsbCB1c2luZyBgdm1fbm9ybWFsX3BhZ2UoKWAgaW4gc29tZSBwbGFjZXMuIExldCYjMzk7cyBtYWtlIHN1cmUgdGhhdCBmdW5jdGlvbiBhY3R1YWxseSAqZXhpc3RzKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFRpbWUgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgY29uZmlybS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIGlzIHRydWx5IGEgc3RyYWlnaHRmb3J3YXJkIHJlZmFjdG9yLCBvciBpZiB0aGVyZSYjMzk7cyBzb21ldGhpbmcgZWxzZSBnb2luZyBvbiBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtX25vcm1hbF9mb2xpbyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9wcm9jL3Rhc2tfbW11LmM9MTY5MD1zdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3Bpbm5lZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGUpXG4tLVxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXHRcdHJldHVybiBmYWxzZTtcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGUpO1xuZnMvcHJvYy90YXNrX21tdS5jLTE3MDEtXHRpZiAoIWZvbGlvKVxuLS1cbmZzL3Byb2MvdGFza19tbXUuYz0xNzcwPXN0YXRpYyBpbnQgY2xlYXJfcmVmc19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbmZzL3Byb2MvdGFza19tbXUuYy0xODE1LVxuZnMvcHJvYy90YXNrX21tdS5jOjE4MTY6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xuZnMvcHJvYy90YXNrX21tdS5jLTE4MTctXHRcdGlmICghZm9saW8pXG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNC1cbmluY2x1ZGUvbGludXgvbW0uaDozMjA1OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNi1cdFx0XHQgICAgIHB0ZV90IHB0ZSk7XG5pbmNsdWRlL2xpbnV4L21tLmg9MzIwNz1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbmluY2x1ZGUvbGludXgvbW0uaC0zMjA4LVx0XHRcdCAgICAgcHRlX3QgcHRlKTtcbmluY2x1ZGUvbGludXgvbW0uaDozMjA5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvbW0uaC0zMjEwLVx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZCk7XG4tLVxubW0vZGFtb24vdmFkZHIuYz0zODk9c3RhdGljIGludCBkYW1vbl95b3VuZ19wbWRfZW50cnkocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVx0XHRcdGdvdG8gaHVnZV9vdXQ7XG5tbS9kYW1vbi92YWRkci5jOjQwNTpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXHUwMDNldm1hLCBhZGRyLCBwbWRlKTtcbm1tL2RhbW9uL3ZhZGRyLmMtNDA2LVx0XHRpZiAoIWZvbGlvKVxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVx0XHRnb3RvIG91dDtcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9kYW1vbi92YWRkci5jLTY1My1cdFx0XHRnb3RvIGh1Z2Vfb3V0O1xubW0vZGFtb24vdmFkZHIuYzo2NTQ6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTY1NS1cdFx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jLTY3Ni1cdFx0XHRjb250aW51ZTtcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xubW0vZGFtb24vdmFkZHIuYy02NzgtXHRcdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYz03OTU9c3RhdGljIGludCBkYW1vc192YV9zdGF0X3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZGFtb24vdmFkZHIuYy04MTQtXG5tbS9kYW1vbi92YWRkci5jOjgxNTpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTgxNi1cbi0tXG5tbS9kYW1vbi92YWRkci5jLTgzOS1cbm1tL2RhbW9uL3ZhZGRyLmM6ODQwOlx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtODQxLVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MjI3OD12bV9mYXVsdF90IGRvX2h1Z2VfcG1kX251bWFfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXG5tbS9odWdlX21lbW9yeS5jOjIzMDg6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpb19wbWQodm1hLCBoYWRkciwgcG1kKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cdGlmICghZm9saW8pXG4tLVxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0yNDY1LVx0aWYgKGlzX3ByZXNlbnQpXG5tbS9odWdlX21lbW9yeS5jOjI0NjY6XHRcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjQ2Ny1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNzc3LVxubW0va2h1Z2VwYWdlZC5jOjc3ODpcdGN0eC1cdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xubW0va2h1Z2VwYWdlZC5jLTc3OS1cdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbi0tXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxuLS1cbm1tL2tzbS5jLTYzOC1cdFx0aWYgKHB0ZV9wcmVzZW50KHB0ZSkpIHtcbm1tL2tzbS5jOjYzOTpcdFx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcHRlKTtcbm1tL2tzbS5jLTY0MC1cdFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xuLS1cbm1tL21hZHZpc2UuYz0zNTM9c3RhdGljIGludCBtYWR2aXNlX2NvbGRfb3JfcGFnZW91dF9wdGVfcmFuZ2UocG1kX3QgKnBtZCxcbi0tXG5tbS9tYWR2aXNlLmMtNDc1LVxubW0vbWFkdmlzZS5jOjQ3NjpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XG5tbS9tYWR2aXNlLmMtNDc3LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWFkdmlzZS5jLTcwNC1cbm1tL21hZHZpc2UuYzo3MDU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWFkdmlzZS5jLTcwNi1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtb3J5LmM9ODI0PXN0cnVjdCBwYWdlICp2bV9ub3JtYWxfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTgzMy0vKipcbm1tL21lbW9yeS5jOjgzNDogKiB2bV9ub3JtYWxfZm9saW8oKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IGZvbGlvXCYjMzQ7IGFzc29jaWF0ZWQgd2l0aCBhIFBURVxubW0vbWVtb3J5LmMtODM1LSAqIEB2bWE6IFRoZSBWTUEgbWFwcGluZyB0aGUgQHB0ZS5cbi0tXG5tbS9tZW1vcnkuYy04NDQtICovXG5tbS9tZW1vcnkuYzo4NDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL21lbW9yeS5jLTg0Ni1cdFx0XHQgICAgcHRlX3QgcHRlKVxuLS1cbm1tL21lbW9yeS5jPTg2OD1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtODc3LS8qKlxubW0vbWVtb3J5LmM6ODc4OiAqIHZtX25vcm1hbF9mb2xpb19wbWQoKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IGZvbGlvXCYjMzQ7IGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxubW0vbWVtb3J5LmMtODc5LSAqIEB2bWE6IFRoZSBWTUEgbWFwcGluZyB0aGUgQHBtZC5cbi0tXG5tbS9tZW1vcnkuYy04ODgtICovXG5tbS9tZW1vcnkuYzo4ODk6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW9fcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0vbWVtb3J5LmMtODkwLVx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcbi0tXG5tbS9tZW1vcnkuYz02Mjg5PXN0YXRpYyB2bV9mYXVsdF90IGRvX251bWFfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy02MzI0LVxubW0vbWVtb3J5LmM6NjMyNTpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVx1MDAzZWFkZHJlc3MsIHB0ZSk7XG5tbS9tZW1vcnkuYy02MzI2LVx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtcG9saWN5LmM9Njg3PXN0YXRpYyBpbnQgcXVldWVfZm9saW9zX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtcG9saWN5LmMtNzIzLVx0XHR9XG5tbS9tZW1wb2xpY3kuYzo3MjQ6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWVtcG9saWN5LmMtNzI1LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tZW1wb2xpY3kuYy03MjktXHRcdC8qXG5tbS9tZW1wb2xpY3kuYzo3MzA6XHRcdCAqIHZtX25vcm1hbF9mb2xpbygpIGZpbHRlcnMgb3V0IHplcm8gcGFnZXMsIGJ1dCB0aGVyZSBtaWdodFxubW0vbWVtcG9saWN5LmMtNzMxLVx0XHQgKiBzdGlsbCBiZSByZXNlcnZlZCBmb2xpb3MgdG8gc2tpcCwgcGVyaGFwcyBpbiBhIFZEU08uXG4tLVxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21sb2NrLmMtMzg3LVx0XHRcdGNvbnRpbnVlO1xubW0vbWxvY2suYzozODg6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWxvY2suYy0zODktXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21yZW1hcC5jPTE3OD1zdGF0aWMgaW50IG1yZW1hcF9mb2xpb19wdGVfYmF0Y2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tcmVtYXAuYy0xODktXG5tbS9tcmVtYXAuYzoxOTA6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZSk7XG5tbS9tcmVtYXAuYy0xOTEtXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTEyOTQtXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcbm1tL3VzZXJmYXVsdGZkLmMtMTI5Ni1cdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MTUwMT1zdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE2MTctXG5tbS91c2VyZmF1bHRmZC5jOjE2MTg6XHRcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XG5tbS91c2VyZmF1bHRmZC5jLTE2MTktXHRcdFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDQ3MwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDIyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFByb3Bvc2VkIEtIVUdFUEFHRUQgUmVmYWN0b3JpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgdGhpcyBwYXRjaCBpbnZvbHZlcyBhIHN0YW5kYXJkIGZ1bmN0aW9uLCBgdm1fbm9ybWFsX2ZvbGlvKClgLCB3aGljaCwgaWYgSSByZWNhbGwgY29ycmVjdGx5LCByZXNpZGVzIGluIGBtbS9tZW1vcnkuY2AuIEl0IGxvb2tzIGxpa2UgdGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2UgbGllcyBpbiByZWZhY3RvcmluZyBga2h1Z2VwYWdlZC5jYC4gVGhlIGdvYWwgaXMgdG8gY29uc29saWRhdGUgUFRFIChQYWdlIFRhYmxlIEVudHJ5KSBjaGVja2luZyBsb2dpYywgc3BlY2lmaWNhbGx5IGJldHdlZW4gdGhlIGZ1bmN0aW9ucyBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZGAuIEEgbmV3IGZ1bmN0aW9uLCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLCBpcyBiZWluZyBpbnRyb2R1Y2VkLiBUaGlzIGlzIGludGVyZXN0aW5nLCBhcyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RhdHVzLCBvbmUgb2Y6IGBQVEVfQ0hFQ0tfU1VDQ0VFRGAsIGBQVEVfQ0hFQ0tfRkFJTGAsIG9yIGBQVEVfQ0hFQ0tfQ09OVElOVUVgLCBhcyB3ZWxsIGFzIGEgZnVuY3Rpb24sIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYC4KClRoZSBpbXBsaWNhdGlvbnMgYXJlIGNsZWFyOiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0b3VjaGluZyBjcml0aWNhbCBrZXJuZWwgbG9naWMgd2l0aGluIGBtbS9raHVnZXBhZ2VkLmNgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMsIGlzIHRoaXMgZnVuY3Rpb25hbGl0eSBldmVuICpyZWFjaGFibGUqPyBZZXMsIG9mIGNvdXJzZS4gYGtodWdlcGFnZWRgIGlzIHRoZSBiYWNrYm9uZSBvZiBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIEl0JiMzOTtzIHRoZSBiYWNrZ3JvdW5kIGRhZW1vbiB0aGF0IGFjdGl2ZWx5IHNjYW5zIG1lbW9yeSBhbmQgY29uc29saWRhdGVzIHNtYWxsZXIgcGFnZXMgaW50byBodWdlIHBhZ2VzLiBUaGlzIGlzIHRyaWdnZXJlZCBieSBhIGNhbGwgdG8gYG1hZHZpc2UoTUFEVl9IVUdFUEFHRSlgIG9yIGNhbiBydW4gYXV0b21hdGljYWxseSBpZiBUSFAgaXMgZW5hYmxlZC4gSXQmIzM5O3Mgc2FmZSB0byBzYXkgdGhlc2UgY2hhbmdlcyBkZWZpbml0ZWx5IGhhdmUgYSBmdW5jdGlvbmFsIGltcGFjdC4gSSBuZWVkIHRvIGRpdmUgaW50byBga2h1Z2VwYWdlZC5jYCBpdHNlbGYuIEkgbmVlZCB0byBpZGVudGlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIG1vc3QgcmVsZXZhbnQgdG8gbXkgcmV2aWV3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX2NoZWNrX3B0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzIzPXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTczMC0vKlxubW0va2h1Z2VwYWdlZC5jOjczMTogKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxubW0va2h1Z2VwYWdlZC5jLTczMi0gKlxuLS1cbm1tL2todWdlcGFnZWQuYy03MzktICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbm1tL2todWdlcGFnZWQuYzo3NDA6ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXG5tbS9raHVnZXBhZ2VkLmMtNzQxLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc0NS0gKi9cbm1tL2todWdlcGFnZWQuYzo3NDY6c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxubW0va2h1Z2VwYWdlZC5jLTc0Ny1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbi0tXG5tbS9raHVnZXBhZ2VkLmM9ODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTgzNC1cdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG5tbS9raHVnZXBhZ2VkLmM6ODM1Olx0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xubW0va2h1Z2VwYWdlZC5jLTgzNi1cdFx0Zm9saW8gPSBjdHguZm9saW87XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE3NDgtXG5tbS9raHVnZXBhZ2VkLmM6MTc0OTpcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbm1tL2todWdlcGFnZWQuYy0xNzUwLVx0XHRmb2xpbyA9IGN0eC5mb2xpbztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU1OAoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDE3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIENvcmUgTG9naWMgQ2hhbmdlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoZXNlIG1vZGlmaWNhdGlvbnMuIExvb2tzIGxpa2UgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIHNlZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5JiMzOTtyZSBub3cgZW1wbG95aW5nIGBjb2xsYXBzZV9jaGVja19wdGVgLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gSSYjMzk7bGwgZGVmaW5pdGVseSB3YW50IHRvIGtlZXAgYSBjbG9zZSBleWUgb24gaG93IGBjb2xsYXBzZV9jaGVja19wdGVgIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRob3NlLiAKCkkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gaW5jbHVkZSBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfaHVnZV9wYWdlYCBpbiBteSBgRm9jdXNTeW1ib2xzYCBsaXN0OyB0aGVzZSBhcmUgY2xlYXJseSBjZW50cmFsIHRvIHRoZSB1cGRhdGVkIGJlaGF2aW9yLiBIbW0sIHdhaXQgYSBtb21lbnTigKYgSSBzZWUgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGlzIGRlY2xhcmVkIGFzIHN0YXRpYy4gVGhhdCB0aHJvd3MgYSBwb3RlbnRpYWwgd3JlbmNoIGluIHRoZSB3b3Jrcy4gSXMgaXQgaW5saW5lZD8gSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoYXQuIEl0IGNvdWxkIGFmZmVjdCBob3cgZWFzaWx5IEkgY2FuIHRyYWNlIGl0cyBleGVjdXRpb24gZmxvdyBhbmQgdW5kZXJzdGFuZCBpdHMgaW1wYWN0LiBBc2lkZSBmcm9tIHRob3NlLCB0aGUgcmVtYWluaW5nIGNoYW5nZXMgc2VlbSByZWxhdGl2ZWx5IG1pbm9yIOKAkyBzb21lIGFkanVzdG1lbnRzIHRvIGBjb2xsYXBzZV9zY2FuX2ZpbGVgIGZvciBpbml0aWFsaXphdGlvbiwgc29tZSBzdGF0IGNvdW50aW5nIGFkZGVkIHRvIGBhbGxvY19jaGFyZ2VfZm9saW9gLCBhbmQganVzdCBhIGNvbW1lbnQgdXBkYXRlIHRvIGBfX2todWdlcGFnZWRfZXhpdGAuIFRoZXNlIGFyZSBtdWNoIGxlc3MgY29uY2VybmluZywgZ2l2ZW4gdGhlIGNvcmUgbG9naWMgcmVzaWRlcyB3aXRoaW4gdGhlIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBmdW5jdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7X19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODExLVxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxMy1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTk5Nj1zdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDEzLVx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcbm1tL2todWdlcGFnZWQuYzoxMDE0Olx0ICogaW4gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZS5cbm1tL2todWdlcGFnZWQuYy0xMDE1LVx0ICovXG4tLVxubW0va2h1Z2VwYWdlZC5jPTEzNzY9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDE4CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqQW5hbHl6aW5nIGBjb2xsYXBzZV9odWdlX3BhZ2VgIEZ1bmN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gbG9va2luZyBhdCB0aGlzIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBmdW5jdGlvbiwgaXQmIzM5O3MgZGVjbGFyZWQgYHN0YXRpY2AsIGFuZCBpdCYjMzk7cyBvbmx5IGNhbGxlZCBvbmNlIGluIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiBIbW0sIHRoYXQgbWFrZXMgbWUgdGhpbmsgaXQmIzM5O3MgcHJvYmFibHkgYmVlbiBpbmxpbmVkIGJ5IHRoZSBjb21waWxlci4gTm8gcmVhbCBuZWVkIHRvIHNwZW5kIG11Y2ggdGltZSBvbiB0aGF0IG9uZS4KCk5vdywgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXRzZWxmIGlzIGFsc28gYHN0YXRpY2AuIFRoYXQmIzM5O3MgaW50ZXJlc3RpbmcuIEhvd2V2ZXIsIGl0JiMzOTtzIGEgKm11Y2gqIGxhcmdlciBmdW5jdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgKnRoYXQqIG9uZSBpcyBhY3R1YWxseSBnZXR0aW5nIGNhbGxlZCBmcm9tIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlIG9mIGl0cyByb2xlIGluIHRoZSBzeXN0ZW0uIExldCBtZSBjaGVjayB0aGUgY2FsbCBzaXRlcyBmb3IgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX2h1Z2VfcGFnZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtEb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3Q9OTQ9bW1hcF9sb2NrIGluIHJlYWQgKG9yIHdyaXRlKSBtb2RlIHRvIGJlIHN1cmUgYSBodWdlIHBtZCBjYW5ub3QgYmVcbkRvY3VtZW50YXRpb24vbW0vdHJhbnNodWdlLnJzdDo5NTpjcmVhdGVkIGZyb20gdW5kZXIgeW91IGJ5IGtodWdlcGFnZWQgKGtodWdlcGFnZWQgY29sbGFwc2VfaHVnZV9wYWdlXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtOTYtdGFrZXMgdGhlIG1tYXBfbG9jayBpbiB3cml0ZSBtb2RlIGluIGFkZGl0aW9uIHRvIHRoZSBhbm9uX3ZtYSBsb2NrKS4gSWZcbi0tXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmM9MjQ1PXBtZF90IGhhc2hfX3BtZHBfY29sbGFwc2VfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbi0tXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmMtMjc5LVx0ICogaGVuY2Ugd2FpdCBmb3IgY29sbGFwc2UgdG8gY29tcGxldGUuIFdpdGhvdXQgdGhpc1xuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jOjI4MDpcdCAqIHRoZSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IGNhbiByZXN1bHQgaW4gY29weWluZ1xuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jLTI4MS1cdCAqIHRoZSBvbGQgY29udGVudC5cbi0tXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYz0xMzg9cG1kX3QgcG1kcF9jb2xsYXBzZV9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYy0xNDktXHQgKiBmb3JtcyB0aGF0IHNwZWNpZnkgYW4gYWRkcmVzcyBvbmx5IGFwcGx5IHRvIGxlYWYgUFRFcywgd2UgbmVlZCBhXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYzoxNTA6XHQgKiBnbG9iYWwgZmx1c2ggaGVyZS4gIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGFzc3VtZXMgdGhlc2UgZmx1c2hlcyBhcmVcbmFyY2gvcmlzY3YvbW0vcGd0YWJsZS5jLTE1MS1cdCAqIGVhZ2VyLCBzbyBqdXN0IGRvIHRoZSBmZW5jZSBoZXJlLlxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NTY9VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTg5LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo5MDpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2UsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTkxLVxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTE2LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0Ny1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6MTQ4OlRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4sXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0OS1cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY2NTY9c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfcmF3X3RwX251bGxfYXJncyByYXdfdHBfbnVsbF9hcmdzW10gPSB7XG4tLVxua2VybmVsL2JwZi9idGYuYy02NzA2LVx0eyBcJiMzNDttbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCYjMzQ7LCAweDEwIH0sXG5rZXJuZWwvYnBmL2J0Zi5jOjY3MDc6XHR7IFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCYjMzQ7LCAweDEgfSxcbmtlcm5lbC9icGYvYnRmLmMtNjcwOC1cdHsgXCYjMzQ7bW1fa2h1Z2VwYWdlZF9zY2FuX2ZpbGVcJiMzNDssIDB4MTAgfSxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtODExLVxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxubW0va2h1Z2VwYWdlZC5jLTgxMy1cdFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTkyMC1cdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xubW0va2h1Z2VwYWdlZC5jOjkyMTpcdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG5tbS9raHVnZXBhZ2VkLmMtOTIyLVx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtOTI2LVx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XG5tbS9raHVnZXBhZ2VkLmM6OTI3Olx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG5tbS9raHVnZXBhZ2VkLmMtOTI4LVx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTkzMS1cbm1tL2todWdlcGFnZWQuYzo5MzI6c3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9zdWNjZWVkZWQocHRlX3QgKnB0ZSxcbm1tL2todWdlcGFnZWQuYy05MzMtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTk5NS1cbm1tL2todWdlcGFnZWQuYzo5OTY6c3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlX3QgKnB0ZSxcbm1tL2todWdlcGFnZWQuYy05OTctXHRcdHBtZF90ICpwbWQsIHBtZF90IG9yaWdfcG1kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cdCAqIFJlbGVhc2UgYm90aCByYXcgYW5kIGNvbXBvdW5kIHBhZ2VzIGlzb2xhdGVkXG5tbS9raHVnZXBhZ2VkLmM6MTAxNDpcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXG5tbS9raHVnZXBhZ2VkLmMtMTAxNS1cdCAqL1xuLS1cbm1tL2todWdlcGFnZWQuYy0xMDE5LS8qXG5tbS9raHVnZXBhZ2VkLmM6MTAyMDogKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IC0gYXR0ZW1wdHMgdG8gY29weSBtZW1vcnkgY29udGVudHMgZnJvbSByYXdcbm1tL2todWdlcGFnZWQuYy0xMDIxLSAqIHBhZ2VzIHRvIGEgaHVnZXBhZ2UuIENsZWFucyB1cCB0aGUgcmF3IHBhZ2VzIGlmIGNvcHlpbmcgc3VjY2VlZHM7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTEwMzMtICovXG5tbS9raHVnZXBhZ2VkLmM6MTAzNDpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZV90ICpwdGUsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9raHVnZXBhZ2VkLmMtMTAzNS1cdFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMDYzLVx0aWYgKGxpa2VseShyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSlcbm1tL2todWdlcGFnZWQuYzoxMDY0Olx0XHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGUsIHZtYSwgYWRkcmVzcywgcHRsLFxubW0va2h1Z2VwYWdlZC5jLTEwNjUtXHRcdFx0XHRcdFx0ICAgIG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XG5tbS9raHVnZXBhZ2VkLmMtMTA2Ni1cdGVsc2Vcbm1tL2todWdlcGFnZWQuYzoxMDY3Olx0XHRfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGUsIHBtZCwgb3JpZ19wbWQsIHZtYSxcbm1tL2todWdlcGFnZWQuYy0xMDY4LVx0XHRcdFx0XHRcdCBvcmRlciwgY29tcG91bmRfcGFnZWxpc3QpO1xuLS1cbm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTI0Ny0gKi9cbm1tL2todWdlcGFnZWQuYzoxMjQ4OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2todWdlcGFnZWQuYy0xMjQ5LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMzMzLW91dDpcbm1tL2todWdlcGFnZWQuYzoxMzM0Olx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgc3dhcHBlZF9pbiwgcmVmZXJlbmNlZCwgcmVzdWx0LFxubW0va2h1Z2VwYWdlZC5jLTEzMzUtXHRcdFx0XHRcdCAgIG9yZGVyKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTMzOT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3MC0vKlxubW0va2h1Z2VwYWdlZC5jOjEzNzE6ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbm1tL2todWdlcGFnZWQuYy0xMzcyLSAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTM3NS0gKi9cbm1tL2todWdlcGFnZWQuYzoxMzc2OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXHRcdGludCByZWZlcmVuY2VkLCBpbnQgdW5tYXBwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTQxNy1cdFx0Lypcbm1tL2todWdlcGFnZWQuYzoxNDE4Olx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xubW0va2h1Z2VwYWdlZC5jLTE0MTktXHRcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxuLS1cbm1tL2todWdlcGFnZWQuYy0xNDIxLVx0XHQgKi9cbm1tL2todWdlcGFnZWQuYzoxNDIyOlx0XHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4obW0sIHZtYSwgc3RhcnRfYWRkciwgcG1kLFxubW0va2h1Z2VwYWdlZC5jLTE0MjMtXHRcdFx0XHRcdFx0ICAgICByZWZlcmVuY2VkLCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jLTE0NzctXHRpZiAocHRlKSB7XG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcdFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSh2bWEsIHN0YXJ0X2FkZHIsIHB0ZSwgY2MsXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cdFx0XHRcdFx0XHQgICAgICBvcmRlciwgXHUwMDI2Y29tcG91bmRfcGFnZWxpc3QpO1xuLS1cbm1tL2todWdlcGFnZWQuYy0xNTA5LVxubW0va2h1Z2VwYWdlZC5jOjE1MTA6XHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZSwgZm9saW8sIHBtZCwgX3BtZCxcbm1tL2todWdlcGFnZWQuYy0xNTExLVx0XHRcdFx0XHQgICB2bWEsIHN0YXJ0X2FkZHIsIHB0ZV9wdGwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1NTYtXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6MTU1NzpcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZShtbSwgcmVzdWx0ID09IFNDQU5fU1VDQ0VFRCwgcmVzdWx0LCBvcmRlcik7XG5tbS9raHVnZXBhZ2VkLmMtMTU1OC1cdHJldHVybiByZXN1bHQ7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTYyMC1cdFx0XHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyAmIzQzOyBvZmZzZXQgKiBQQUdFX1NJWkU7XG5tbS9raHVnZXBhZ2VkLmM6MTYyMTpcdFx0XHRyZXQgPSBjb2xsYXBzZV9odWdlX3BhZ2UobW0sIGNvbGxhcHNlX2FkZHJlc3MsIHJlZmVyZW5jZWQsXG5tbS9raHVnZXBhZ2VkLmMtMTYyMi1cdFx0XHRcdFx0XHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE4MDYtXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xubW0va2h1Z2VwYWdlZC5jOjE4MDc6XHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xubW0va2h1Z2VwYWdlZC5jLTE4MDgtXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTQ0MAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipUcmFjaW5nIHRoZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbSoqCgpSaWdodCwgc28gYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXMgdGhlIGtleSBmdW5jdGlvbiBoZXJlLCBidXQgaXQmIzM5O3MgKnN0YXRpYyogd2hpY2ggbWVhbnMgd2UgZG9uJiMzOTt0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byBpdC4gSXQmIzM5O3MgY2FsbGVkIGJ5IGBtdGhwX2NvbGxhcHNlYCwgd2hpY2gsIGluIHR1cm4sIGlzIHRyaWdnZXJlZCBieSBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBTbywgdGhlIGNvbGxhcHNlIHVsdGltYXRlbHkgaGFwcGVucyB0aHJvdWdoIGEgY2hhaW4gb2YgZnVuY3Rpb24gY2FsbHMuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYWxzbyBzdGF0aWMsIG1lYW5pbmcgaXQmIzM5O3MgY29uZmluZWQgdG8gaXRzIHNvdXJjZSBmaWxlIGFuZCBub3QgZXhwb3NlZCB0byB0aGUgb3V0c2lkZS4gVGhhdCBsZWF2ZXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGFzIHRoZSBlbnRyeSBwb2ludCB0aGF0JiMzOTtzIGFjY2Vzc2libGUuIFRoaXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGlzIHRoZSBsaWtlbHkgY2FuZGlkYXRlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB3aG9sZSBwYWdlIGNvbGxhcHNlIHByb2Nlc3MgaXMgaW5pdGlhdGVkLiBJIG5lZWQgdG8gZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiBvbiB0aGF0IGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtraHVnZXBhZ2VkX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTY2NTY9c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfcmF3X3RwX251bGxfYXJncyByYXdfdHBfbnVsbF9hcmdzW10gPSB7XG4tLVxua2VybmVsL2JwZi9idGYuYy02NzA1LVx0LyogaHVnZV9tZW1vcnkgKi9cbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcdHsgXCYjMzQ7bW1fa2h1Z2VwYWdlZF9zY2FuX3BtZFwmIzM0OywgMHgxMCB9LFxua2VybmVsL2JwZi9idGYuYy02NzA3LVx0eyBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwmIzM0OywgMHgxIH0sXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE4MTQtb3V0OlxubW0va2h1Z2VwYWdlZC5jOjE4MTU6XHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbm1tL2todWdlcGFnZWQuYy0xODE2LVx0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMDc3CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTmF2aWdhdGluZyB0aGUgS2VybmVsJiMzOTtzIFBhZ2UgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyBJIHdhcyBsb29raW5nIGZvciBga2h1Z2VwYWdlZF9zY2FuX3BtZGAsIGJ1dCB3YWl0IGEgbWludXRl4oCmIHRoYXQgZnVuY3Rpb24gZG9lc24mIzM5O3Qgc2VlbSB0byBiZSBkZWZpbmVkLiBIbW0sIEkgbXVzdCBoYXZlIGdvdHRlbiB0aGUgbmFtZSB3cm9uZy4gUmlnaHQsIHRoZSBhY3R1YWwgZnVuY3Rpb24gaXMgYGNvbGxhcHNlX3NjYW5fcG1kYC4gVGhhdCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UuIE5vdyB0aGF0IEkgaGF2ZSB0aGUgY29ycmVjdCBmdW5jdGlvbiBuYW1lLCBsZXQmIzM5O3MgdHJhY2Ugd2hlcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIHdpbGwgYmUgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0aGUgbGFyZ2VyIHBhZ2UgbWFuYWdlbWVudCBzY2hlbWUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsYXBzZV9zY2FuX3BtZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTEyMzgtICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbm1tL2todWdlcGFnZWQuYzoxMjM5OiAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxuLS1cbm1tL2todWdlcGFnZWQuYz0xNTYyPXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X29yZGVyX2Zyb21fb2Zmc2V0KHVuc2lnbmVkIGludCBvZmZzZXQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1NzEtICogbXRocF9jb2xsYXBzZSgpIGNvbnN1bWVzIHRoZSBiaXRtYXAgdGhhdCBpcyBnZW5lcmF0ZWQgZHVyaW5nXG5tbS9raHVnZXBhZ2VkLmM6MTU3MjogKiBjb2xsYXBzZV9zY2FuX3BtZCgpIHRvIGRldGVybWluZSB3aGF0IHJlZ2lvbnMgYW5kIG1USFAgb3JkZXJzIGZpdCBiZXN0LlxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTU4Nz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xNjg4LVxubW0va2h1Z2VwYWdlZC5jOjE2ODk6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MjgxMj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgyNC1cdGlmICh2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcbm1tL2todWdlcGFnZWQuYzoyODI1Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zY2FuX3BtZChtbSwgdm1hLCBhZGRyLCBsb2NrX2Ryb3BwZWQsIGNjKTtcbm1tL2todWdlcGFnZWQuYy0yODI2LVx0XHRnb3RvIGVuZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA3NTMKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBQTUQgQ29sbGFwc2UgRnVuY3Rpb25zKioKCk9rYXksIHNvIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYmVpbmcgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gVGhhdCYjMzk7cyBhIGNydWNpYWwgbGluayB0byB1bmRlcnN0YW5kLiBUbyByZWFsbHkgZ3Jhc3Agd2hhdCYjMzk7cyBoYXBwZW5pbmcsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYGNvbGxhcHNlX3NpbmdsZV9wbWRgICpkb2VzKi4gU28sIGZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBJJiMzOTtsbCBzdGFydCB0aGVyZSBhbmQgc2VlIHdoZXJlIGl0IGxlYWRzLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIG9mdGVuIHRoZSBrZXkgdG8gdW5yYXZlbGluZyB0aGUgcHVycG9zZSBvZiBhbnkgY2FsbGVkIGZ1bmN0aW9uLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgdG8gZGV0ZXJtaW5lIGhvdyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGZpdHMgaW50byB0aGUgYnJvYWRlciBwaWN0dXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb2xsYXBzZV9zaW5nbGVfcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0yNzAyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgxMS0gKi9cbm1tL2todWdlcGFnZWQuYzoyODEyOnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxubW0va2h1Z2VwYWdlZC5jLTI4MTMtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBib29sICpsb2NrX2Ryb3BwZWQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTI4Njk9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI5MzktXG5tbS9raHVnZXBhZ2VkLmM6Mjk0MDpcdFx0XHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcbm1tL2todWdlcGFnZWQuYy0yOTQxLVx0XHRcdFx0XHRcdCAgICAgIHZtYSwgXHUwMDI2bG9ja19kcm9wcGVkLCBjYyk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMyMTA9aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyNTgtXG5tbS9raHVnZXBhZ2VkLmM6MzI1OTpcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFx1MDAyNm1tYXBfdW5sb2NrZWQsIGNjKTtcbm1tL2todWdlcGFnZWQuYy0zMjYwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTMxMQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDEyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbml0aWFsIFRob3VnaHRzIG9uIGBtYWR2aXNlX2NvbGxhcHNlYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKgoKT2theSwgc28gYG1hZHZpc2VfY29sbGFwc2VgIGlzIGEgZGlyZWN0IEFQSSBlbnRyeSBwb2ludCwgc3BlY2lmaWNhbGx5IGNhbGxlZCB3aGVuIHRoZSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhhdCBtYWtlcyBpdCBhIGNyaXRpY2FsIHBvaW50IG9mIGludGVyZXN0LiBJdCYjMzk7cyB0aGUgcGVyZmVjdCBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBBbHNvLCB0aGUgYGNvbGxhcHNlX3NjYW5fbW1fc2xvdGAgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGxvb3Agd2l0aGluIGtodWdlcGFnZWQuIFRoaXMgaXMgZ29vZCB0byBrbm93LCBhbmQgSSBzaG91bGQgbWFrZSBzdXJlIHRvIGFkZCBgbWFkdmlzZV9jb2xsYXBzZWAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGRvbiYjMzk7dCBtaXNzIGFueXRoaW5nIHRoYXQgbWF5IGJlIG92ZXJsb29rZWQuIEFyZSB0aGVyZSBhbnkgb3RoZXIgbm9uLXN0YXRpYyBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzIHByb2Nlc3MgdGhhdCBJIGFtIG5vdCBzZWVpbmc/CgpOb3csIGxldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgJiMzOTtzIHNpZ25hdHVyZS4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaXRzIGlucHV0cyBhbmQgb3V0cHV0cyBiZWZvcmUgcHJvY2VlZGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aW50IG1hZHZpc2VfY29sbGFwc2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OS17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDktXG5tbS9raHVnZXBhZ2VkLmM6MzIxMDppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjExLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTI1Nj1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjcwOnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIyMTAKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUaGlua2luZyBBYm91dCBNZW1vcnkgTWFuYWdlbWVudCBhbmQgYGtodWdlcGFnZWRgKioKCk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIG5vbi1zdGF0aWMgZnVuY3Rpb24g4oCTIHRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBJIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gbWVtb3J5IGNvbGxhcHNpbmcsIGJ1dCBpdCBpbW1lZGlhdGVseSBtYWtlcyBtZSBjb25zaWRlciB0aGUgYmlnZ2VyIHBpY3R1cmUsIHBhcnRpY3VsYXJseSB0aGUgaW50ZXJhY3Rpb24gd2l0aCBga2h1Z2VwYWdlZGAuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGh1Z2VwYWdlIG1hbmFnZW1lbnQgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIG1lbW9yeSBmcmFnbWVudGF0aW9uIG9yIGluZWZmaWNpZW50IGFsbG9jYXRpb24uIFNpbmNlIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBwYXJ0IG9mIHRoZSB0b29sIHNldCBmb3IgZGVhbGluZyB3aXRoIHRoaXMsIGl0IG1ha2VzIG1lIHRoaW5rIGFib3V0IGhvdyB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpdHNlbGYgaXMgKmludm9sdmVkKiBhbmQgaG93IGl0cyBiZWhhdmlvciBtaWdodCBpbmZsdWVuY2UgdGhlIGVmZmljYWN5IG9mIGBtYWR2aXNlX2NvbGxhcHNlYC4gV2hhdCBhcmUgdGhlIHRyaWdnZXJpbmcgY29uZGl0aW9ucyBmb3IgYGtodWdlcGFnZWRgIHRvIHN3ZWVwIGluLCBhbmQgaG93IGRvZXMgaXQgZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gdGhhdCAqbWFkdmlzZV9jb2xsYXBzZSogaXMgZGVzaWduZWQgdG8gYWxsZXZpYXRlPyBJcyB0aGVyZSBjb250ZW50aW9uPyBBcmUgdGhlcmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpbiB0aGF0IGludGVyYWN0aW9uIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUga25vYnMgSSBjYW4gdHVybiBpbiBlaXRoZXIgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2U/IEkgbmVlZCB0byB0aGluayB0aGlzIHRocm91Z2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfc2Nhbl9tbV9zbG90JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3Q9OTk9TG9vayBhdCB0aGUgY3VycmVudCBsb2NrIHN0YXRpc3RpY3M6OlxuLS1cbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTEzLSAgMDggICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0OjExNDogIDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDI2bW0tXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgIDEgICAgICAgICAgW1x1MDAzY2ZmZmZmZmZmODExNTAyYTdcdTAwM2VdIGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90JiM0MzsweDU3LzB4MjgwXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0LTExNS0gIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDI2bW0tXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgOTYgICAgICAgICAgW1x1MDAzY2ZmZmZmZmZmODE1MzUxYzRcdTAwM2VdIF9fZG9fcGFnZV9mYXVsdCYjNDM7MHgxZDQvMHg1MTBcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdD0xMjA9UGVyIHZlZGVyZSBsZSBzdGF0aXN0aWNoZSBjb3JyZW50aSBzdWkgYmxvY2NoaTo6XG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTM0LSAgMDggICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdDoxMzU6ICAwOSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAyNm1tLVx1MDAzZW1tYXBfc2VtICAgICAgICAgICAgICAxICAgICAgICAgIFtcdTAwM2NmZmZmZmZmZjgxMTUwMmE3XHUwMDNlXSBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCYjNDM7MHg1Ny8weDI4MFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2Nrc3RhdC5yc3QtMTM2LSAgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwMjZtbS1cdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICA5NiAgICAgICAgICBbXHUwMDNjZmZmZmZmZmY4MTUzNTFjNFx1MDAzZV0gX19kb19wYWdlX2ZhdWx0JiM0MzsweDFkNC8weDUxMFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjg1OQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRlYnVnZ2luZyBhIE1pc3NpbmcgYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCoqCgpIbW0sIHRoYXQmIzM5O3Mgb2RkLiBJIHdhcyBleHBlY3RpbmcgdG8gc2VlIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaW4gdGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlLCBidXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHRocm93aW5nIGFuIGVycm9yLiBBIHF1aWNrIGNoZWNrIHJldmVhbHMgaXQmIzM5O3Mgbm93aGVyZSB0byBiZSBmb3VuZC4gT2theSwgdGltZSB0byBzdGVwIGJhY2sgYW5kIHJlLWV2YWx1YXRlIHRoZSBzZWFyY2ggc3RyYXRlZ3kuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIEkmIzM5O20gbG9va2luZyBmb3IgbWF5IGhhdmUgYmVlbiByZW5hbWVkLCBvciBpcyBjYWxsZWQgaW5kaXJlY3RseS4gTGV0JiMzOTtzIHdpZGVuIHRoZSBuZXQuIEkmIzM5O2xsIGdyZXAgdGhlIGNvZGViYXNlIGZvciBhbnkgYW5kIGFsbCBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBIb3BlZnVsbHkgdGhpcyB3aWxsIHJldmVhbCB0aGUgZGVwZW5kZW5jeSB0cmVlIGFuZCBsZXQgbWUgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eS4gR290dGEga2VlcCBkaWdnaW5nIGFuZCBob3BlZnVsbHkgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcHJlc2VudCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfdGhyZWFkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz02OD1lbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy03Ni1cbm1tL2todWdlcGFnZWQuYzo3NzpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpraHVnZXBhZ2VkX3RocmVhZCBfX3JlYWRfbW9zdGx5O1xubW0va2h1Z2VwYWdlZC5jLTc4LXN0YXRpYyBERUZJTkVfTVVURVgoa2h1Z2VwYWdlZF9tdXRleCk7XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxMzk9aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTQyLVx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSkge1xubW0va2h1Z2VwYWdlZC5jOjMxNDM6XHRcdGlmICgha2h1Z2VwYWdlZF90aHJlYWQpIHtcbm1tL2todWdlcGFnZWQuYy0zMTQ0LVx0XHRcdHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3X3RocmVhZCA9IGt0aHJlYWRfcnVuKGtodWdlcGFnZWQsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMxNTItXG5tbS9raHVnZXBhZ2VkLmM6MzE1MzpcdFx0XHRraHVnZXBhZ2VkX3RocmVhZCA9IG5ld190aHJlYWQ7XG5tbS9raHVnZXBhZ2VkLmMtMzE1NC1cdFx0fVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTU3LVx0XHRcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcdTAwMjZraHVnZXBhZ2VkX3dhaXQpO1xubW0va2h1Z2VwYWdlZC5jOjMxNTg6XHR9IGVsc2UgaWYgKGtodWdlcGFnZWRfdGhyZWFkKSB7XG5tbS9raHVnZXBhZ2VkLmM6MzE1OTpcdFx0a3RocmVhZF9zdG9wKGtodWdlcGFnZWRfdGhyZWFkKTtcbm1tL2todWdlcGFnZWQuYzozMTYwOlx0XHRraHVnZXBhZ2VkX3RocmVhZCA9IE5VTEw7XG5tbS9raHVnZXBhZ2VkLmMtMzE2MS1cdH1cbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzE2Nj12b2lkIGtodWdlcGFnZWRfbWluX2ZyZWVfa2J5dGVzX3VwZGF0ZSh2b2lkKVxuLS1cbm1tL2todWdlcGFnZWQuYy0zMTY4LVx0Z3VhcmQobXV0ZXgpKFx1MDAyNmtodWdlcGFnZWRfbXV0ZXgpO1xubW0va2h1Z2VwYWdlZC5jOjMxNjk6XHRpZiAoaHVnZXBhZ2VfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiBraHVnZXBhZ2VkX3RocmVhZClcbm1tL2todWdlcGFnZWQuYy0zMTcwLVx0XHRzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNjMyCgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipVbmRlcnN0YW5kaW5nIHRoZSBLZXJuZWwmIzM5O3MgSHVnZSBQYWdlIE1hbmFnZW1lbnQqKgoKUmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gdGhlIHRvcGljIGhlcmUgaXMgdGhlIGtlcm5lbCYjMzk7cyBodWdlIHBhZ2UgbWFuYWdlbWVudCwgYW5kIHNwZWNpZmljYWxseSwgdGhlIGBraHVnZXBhZ2VkYCB0aHJlYWQuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGlzIHRocmVhZCBpcyB0aGUgaGVhcnQgb2YgdGhlIGF1dG9tYXRlZCBodWdlIHBhZ2UgbWFuYWdlbWVudCBwcm9jZXNzLiBJdHMgY29yZSBmdW5jdGlvbiBpcyB0byBhbmFseXplIHRoZSBtZW1vcnkgdXNhZ2UgcGF0dGVybnMgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHByb2FjdGl2ZWx5IGFsbG9jYXRlIG9yIGRlYWxsb2NhdGUgaHVnZSBwYWdlcyAodHlwaWNhbGx5IDJNQiBvciAxR0IsIGRlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBjb25maWd1cmF0aW9uKSB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4KCk15IHRoaW5raW5nIHRoZW4gZ29lcyB0bzogd2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gY3JpdGVyaWEgdGhhdCBga2h1Z2VwYWdlZGAgaXMgdHJ5aW5nIHRvIGFjaGlldmU/IElzIGl0IHByaW1hcmlseSBmb2N1c2VkIG9uIG1pbmltaXppbmcgVExCIG1pc3Nlcz8gSXMgdGhlcmUgYSBkeW5hbWljIHRocmVzaG9sZCByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3Igb3ZlcmFsbCBtZW1vcnkgdXRpbGl6YXRpb24gdGhhdCB0cmlnZ2VycyB0aGVzZSBhbGxvY2F0aW9ucz8gSSBuZWVkIHRvIGNvbnNpZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLCBzdWNoIGFzIHRoZSBOVU1BIGJhbGFuY2luZyBjb2RlLCB0aGUgcGFnZSByZWNsYWltIGNvZGUsIGFuZCB0aGUgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIChUSFApIG1lY2hhbmlzbS4gSSYjMzk7bSB3b25kZXJpbmcgaWYgaXQmIzM5O3MgYWN0aXZlbHkgc2Vla2luZyB0byBjb25zb2xpZGF0ZSBzbWFsbGVyIGFsbG9jYXRpb25zIGludG8gbGFyZ2VyIFRIUC1lbGlnaWJsZSByZWdpb25zLCBvciBpZiBpdCBwcmlvcml0aXplcyBzcGVjaWZpYyBwcm9jZXNzZXMgYmFzZWQgb24gc29tZSBtZXRyaWNzIGxpa2Ugd29ya2luZyBzZXQgc2l6ZSBvciBwYWdlIGZhdWx0IHJhdGUuCgpUaGlua2luZyBmdXJ0aGVyLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIGBraHVnZXBhZ2VkYCBhcmUgY3J1Y2lhbC4gSXMgaXQgZWZmaWNpZW50PyBIb3cgbXVjaCBvdmVyaGVhZCBkb2VzIGl0IGludHJvZHVjZSwgaW4gdGVybXMgb2YgQ1BVIGN5Y2xlcyBhbmQgbWVtb3J5IGJhbmR3aWR0aCBjb25zdW1wdGlvbj8gV2hhdCBhcmUgdGhlIHR1bmluZyBrbm9icyBhdmFpbGFibGU/IEkgbmVlZCB0byByZW1lbWJlciB0aGUgdmFyaW91cyBzeXNjdGwgcGFyYW1ldGVycywgc3VjaCBhcyBga2h1Z2VwYWdlZF9zY2FuX3BhZ2VzYCwgYGtodWdlcGFnZWRfYWxsb2NfcGFnZXNgLCBhbmQgdGhlIHJlbGF0ZWQgZmxhZ3MgdGhhdCBjb250cm9sIGl0cyBiZWhhdmlvciwgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHByb2FjdGl2ZSBhbGxvY2F0aW9uIGFuZCB0aGUgcmlzayBvZiBpbnRyb2R1Y2luZyBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbiBvciB3YXN0aW5nIHJlc291cmNlcy4gRmluYWxseSwgSSYjMzk7bSBnb2luZyB0byBjb25zaWRlciBlZGdlIGNhc2VzOiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgc3lzdGVtIGlzIHVuZGVyIGV4dHJlbWUgbWVtb3J5IHByZXNzdXJlIG9yIHdoZW4gZGVhbGluZyB3aXRoIGhpZ2hseSBmcmFnbWVudGVkIGFkZHJlc3Mgc3BhY2VzPyBIb3cgZG9lcyBga2h1Z2VwYWdlZGAgZ3JhY2VmdWxseSBoYW5kbGUgdGhvc2Ugc2NlbmFyaW9zPwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdGF0aWMgaW50IGtodWdlcGFnZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTI4Njk9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI5ODctXG5tbS9raHVnZXBhZ2VkLmM6Mjk4ODpzdGF0aWMgaW50IGtodWdlcGFnZWRfaGFzX3dvcmsodm9pZClcbm1tL2todWdlcGFnZWQuYy0yOTg5LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjk5Mi1cbm1tL2todWdlcGFnZWQuYzoyOTkzOnN0YXRpYyBpbnQga2h1Z2VwYWdlZF93YWl0X2V2ZW50KHZvaWQpXG5tbS9raHVnZXBhZ2VkLmMtMjk5NC17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMwNDc9c3RhdGljIHZvaWQga2h1Z2VwYWdlZF93YWl0X3dvcmsodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzA2Ni1cbm1tL2todWdlcGFnZWQuYzozMDY3OnN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxubW0va2h1Z2VwYWdlZC5jLTMwNjgte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDMyMgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIHRoZSBIdWdlIFBhZ2UgQ29sbGFwc2luZyBNZWNoYW5pc20qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYGtodWdlcGFnZWRgIHRocmVhZC4gU2VlbXMgbGlrZSB0aGUgaGVhcnQgb2YgdGhlIGh1Z2UgcGFnZSBtYW5hZ2VtZW50LiBUaGUgcGF0Y2ggSSYjMzk7bSBleGFtaW5pbmcgdHdlYWtzIGBjb2xsYXBzZV9jaGVja19wdGVgLiBUaGF0JiMzOTtzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQmIzM5O3MgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXRzZWxmIGlzIGNhbGxlZCBieSBgY29sbGFwc2Vfc2luZ2xlX3BtZGAuIEdvdCBpdC4gYGNvbGxhcHNlX3NpbmdsZV9wbWRgIGlzIGNhbGxlZCBpbiB0d28gcGxhY2VzOiB0aHJvdWdoIHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIGFuZCB2aWEgYG1hZHZpc2VfY29sbGFwc2VgLiBBaGEhIFRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIHBhdGggbG9va3MgbGlrZSBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gSXQmIzM5O3MgYSBkaXJlY3QgZW50cnkgcG9pbnQsIHdoaWNoIG1ha2VzIGl0IGZhciBtb3JlIGludGVyZXN0aW5nLgoKQW5kIGBraHVnZXBhZ2VkYCBpdHNlbGYgaXMgYSBkZWNlbnQgZW50cnkgcG9pbnQgZm9yIGZ1enppbmcsIG9mIGNvdXJzZS4KCldhaXQgYSBzZWNvbmTigKYgYG1hZHZpc2VfY29sbGFwc2VgIGlzIG5vbi1zdGF0aWMuIFRoYXQmIzM5O3MgYSBodWdlIGFkdmFudGFnZSwgYSBnb29kIHRhcmdldCB0byBzdGFydCB3aXRoLiBMZXQgbWUgc2VlLi4uIGFyZSB0aGVyZSBhbnkgb3RoZXIgbm9uLXN0YXRpYyBmdW5jdGlvbnMgaW4gdGhpcyBhcmVhIHRoYXQgbWlnaHQgYmUgZXhwb3NlZD8gSSBzaG91bGQgZG91YmxlLWNoZWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxuLS1cbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTMtXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OS17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDktXG5tbS9raHVnZXBhZ2VkLmM6MzIxMDppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjExLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyOTctXHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxubW0va2h1Z2VwYWdlZC5jOjMyOTg6XHRcdFx0OiBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGxhc3RfZmFpbCk7XG5tbS9raHVnZXBhZ2VkLmMtMzI5OS19XG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTM2Mi1cdGNhc2UgTUFEVl9DT0xMQVBTRTpcbm1tL21hZHZpc2UuYzoxMzYzOlx0XHRyZXR1cm4gbWFkdmlzZV9jb2xsYXBzZSh2bWEsIHJhbmdlLVx1MDAzZXN0YXJ0LCByYW5nZS1cdTAwM2VlbmQsXG5tbS9tYWR2aXNlLmMtMTM2NC1cdFx0XHRcdTAwMjZtYWR2X2JlaGF2aW9yLVx1MDAzZWxvY2tfZHJvcHBlZCk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTI1Nj1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjcwOnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9Mjg4PXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0zMDEtXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cJiMzNDspO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjMwMjpcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0zMDMtXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfQ09MTEFQU0UpXCYjMzQ7KTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9NTMyPXN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM2LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUzNzpzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzOC1cdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU2MC1cdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU2MTpcdHJldCA9IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU2Mi1cdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3MS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NzI6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTczLVx0XHRcdCAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3Ny1cdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgaHVnZSBwYWdlXFxuXCYjMzQ7KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1Nzg6XHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NzktfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz03MDE9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjcwMjpcdC5jb2xsYXBzZSA9IFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNzAzLVx0LmVuZm9yY2VfcHRlX3NjYW5fbGltaXRzID0gZmFsc2UsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTExMDk9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMTY2LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNjc6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNjgtXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNzctXHQvKiBjLVx1MDAzZWNvbGxhcHNlKCkgd2lsbCBmaW5kIGEgaHVnZXBhZ2UgYW5kIGNvbXBsYWluIC0gY2FsbCBkaXJlY3RseS4gKi9cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMTc4Olx0X19tYWR2aXNlX2NvbGxhcHNlKFwmIzM0O1JlLWNvbGxhcHNlIFBNRC1tYXBwZWQgaHVnZXBhZ2VcJiMzNDssIHAsIDEsIG9wcywgdHJ1ZSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3OS1cdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEzNDQ9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xNDY1LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0NjY6XHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2NzpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2ODpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2OTpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTQ3MC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjY5MTQKCQkJCQkJCW91dHB1dDogNjUKCQkJCQkJCXRob3VnaHRzOiAyMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBDb2xsYXBzZSBFbnRyeSBQb2ludHMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHplcm8gaW4gb24gdGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQgbG9va2luZy4gYG1hZHZpc2VfY29sbGFwc2VgIHNlZW1zIGxpa2UgYSBzb2xpZCBjYW5kaWRhdGU7IGl0JiMzOTtzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGEga2V5IHJlcXVpcmVtZW50LiBIbW0sIEkga25vdyBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAgYWxyZWFkeTsgYmVzdCB0byBrZWVwIHRoYXQgb3V0IG9mIGNvbnNpZGVyYXRpb24gZm9yIG5vdy4gV2hhdCBhYm91dCBgbXRocF9jb2xsYXBzZWAsIGBjb2xsYXBzZV9odWdlX3BhZ2VgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlYD8gVGhvc2UgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb25zLCB1bmZvcnR1bmF0ZWx5LiBBbmQgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkYCBpcyBzdGF0aWMgaW5saW5lLCBzbyB0aGF0IGlzIG5vdCBhbiBvcHRpb24gZWl0aGVyLgoKU28sIGZyb20gd2hhdCBJJiMzOTt2ZSBzZWVuLCBgbWFkdmlzZV9jb2xsYXBzZWAgcmVtYWlucyB0aGUgbW9zdCBwcm9taXNpbmcgbm9uLXN0YXRpYyBlbnRyeSBwb2ludC4gSSBkbyByZW1lbWJlciB0aGUgYGtodWdlcGFnZWRgIHRocmVhZCBmdW5jdGlvbiwgYnV0IHRoYXQgaXMgYWxzbyBzdGF0aWMuIEhvd2V2ZXIsIHdhaXQgYSBtaW51dGUsIGBzdGFydF9zdG9wX2todWdlcGFnZWRgIGlzIG5vbi1zdGF0aWMuIEludGVyZXN0aW5nLiBUaGF0IHdhcnJhbnRzIGFub3RoZXIgbG9vay4KClRvIGJlIHRob3JvdWdoLCBsZXQmIzM5O3MgdGFrZSBhIGdhbmRlciBhdCBgbW0va2h1Z2VwYWdlZC5jYC4gSSBuZWVkIHRvIGVuc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnkgb3RoZXIgZXhwb3J0ZWQgb3Igbm9uLXN0YXRpYyBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XlthLXpBLVpfXVthLXpBLVowLTlfXSogW2EtekEtWl9dW2EtekEtWjAtOV9dKlxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9Nzc9c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1Z2VwYWdlZF90aHJlYWQgX19yZWFkX21vc3RseTtcbm1tL2todWdlcGFnZWQuYzo3ODpzdGF0aWMgREVGSU5FX01VVEVYKGtodWdlcGFnZWRfbXV0ZXgpO1xubW0va2h1Z2VwYWdlZC5jLTc5LVxuLS1cbm1tL2todWdlcGFnZWQuYz05MD1zdGF0aWMgdW5zaWduZWQgbG9uZyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZTtcbm1tL2todWdlcGFnZWQuYzo5MTpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtodWdlcGFnZWRfbW1fbG9jayk7XG5tbS9raHVnZXBhZ2VkLmM6OTI6c3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWdlcGFnZWRfd2FpdCk7XG5tbS9raHVnZXBhZ2VkLmMtOTMtLypcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTAzPXN0YXRpYyB1bnNpZ25lZCBpbnQga2h1Z2VwYWdlZF9tYXhfcHRlc19zaGFyZWQgX19yZWFkX21vc3RseTtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTA1LSNkZWZpbmUgTU1fU0xPVFNfSEFTSF9CSVRTIDEwXG5tbS9raHVnZXBhZ2VkLmM6MTA2OnN0YXRpYyBERUZJTkVfUkVBRF9NT1NUTFlfSEFTSFRBQkxFKG1tX3Nsb3RzX2hhc2gsIE1NX1NMT1RTX0hBU0hfQklUUyk7XG5tbS9raHVnZXBhZ2VkLmMtMTA3LVxuLS1cbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNDY5LVxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2todWdlcGFnZWQuYy00NzEtXHRcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXG4tLVxubW0va2h1Z2VwYWdlZC5jPTU0MD1zdGF0aWMgYm9vbCBodWdlcGFnZV9lbmFibGVkKHZvaWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTU1Ny1cbm1tL2todWdlcGFnZWQuYzo1NTg6dm9pZCBfX2todWdlcGFnZWRfZW50ZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG5tbS9raHVnZXBhZ2VkLmMtNTU5LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9NjA4PXN0YXRpYyBib29sIGNvbGxhcHNlX3Bvc3NpYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2todWdlcGFnZWQuYy02MTMtXG5tbS9raHVnZXBhZ2VkLmM6NjE0OnZvaWQga2h1Z2VwYWdlZF9lbnRlcl92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9raHVnZXBhZ2VkLmMtNjE1LVx0XHRcdCAgdm1fZmxhZ3NfdCB2bV9mbGFncylcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNjIxLVxubW0va2h1Z2VwYWdlZC5jOjYyMjp2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxubW0va2h1Z2VwYWdlZC5jLTYyMy17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTE4Nzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTIxMTYtICovXG5tbS9raHVnZXBhZ2VkLmM6MjExNzp2b2lkIGNvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9raHVnZXBhZ2VkLmMtMjExOC1cdFx0Ym9vbCBpbnN0YWxsX3BtZClcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzA2Nz1zdGF0aWMgaW50IGtodWdlcGFnZWQodm9pZCAqbm9uZSlcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzA4Ny1cbm1tL2todWdlcGFnZWQuYzozMDg4OnZvaWQgc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlcyh2b2lkKVxubW0va2h1Z2VwYWdlZC5jLTMwODkte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMTM4LVxubW0va2h1Z2VwYWdlZC5jOjMxMzk6aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxubW0va2h1Z2VwYWdlZC5jLTMxNDAte1xuLS1cbm1tL2todWdlcGFnZWQuYy0zMTY1LVxubW0va2h1Z2VwYWdlZC5jOjMxNjY6dm9pZCBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGUodm9pZClcbm1tL2todWdlcGFnZWQuYy0zMTY3LXtcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Mi1cbm1tL2todWdlcGFnZWQuYzozMTczOmJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXG5tbS9raHVnZXBhZ2VkLmMtMzE3NC17XG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzg9c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGVudW0gc2Nhbl9yZXN1bHQgcilcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzIwOS1cbm1tL2todWdlcGFnZWQuYzozMjEwOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXHRcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg2NDAKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAyNzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgUmVsZXZhbnQgVEhQIEZ1bmN0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgbWFuYWdlbWVudCwgcGFydGljdWxhcmx5IHRoZSBvbmVzIHRoYXQgc2VlbSBtb3N0IHJlbGV2YW50IHRvIHRoZSBtb2RpZmllZCBsb2dpYy4gSSYjMzk7dmUgYmVlbiBnaXZlbiBhIGxpc3Qgb2Ygbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCBteSBleHBlcnQgaW50dWl0aW9uIGlzIGltbWVkaWF0ZWx5IGRyYXduIHRvIGEgZmV3IGtleSBwbGF5ZXJzLgoKSSYjMzk7bSBzZWVpbmc6IGBodWdlcGFnZV9tYWR2aXNlYCwgYF9fa2h1Z2VwYWdlZF9lbnRlcmAsIGBraHVnZXBhZ2VkX2VudGVyX3ZtYWAsIGBfX2todWdlcGFnZWRfZXhpdGAsIGBjb2xsYXBzZV9wdGVfbWFwcGVkX3RocGAsIGBzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzYCwgYHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZGAsIGBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGVgLCBgY3VycmVudF9pc19raHVnZXBhZ2VkYCwgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYC4KClJpZ2h0IGF3YXksIEkgemVybyBpbiBvbiBgbWFkdmlzZV9jb2xsYXBzZWAgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBhcyBsaWtlbHkgcG9pbnRzIG9mIGludGVyZXN0LiBBZnRlciBhIHF1aWNrIHNjYW4sIEkgcmVjYWxsIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBvbmUgdGhhdCB1bHRpbWF0ZWx5IGNhbGxzIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiwgaGl0cyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGlzIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBmdW5jdGlvbiBJJiMzOTttIGxvb2tpbmcgZm9yIC0gYSBmdW5jdGlvbiB0aGF0IGRpcmVjdGx5IG1hbmFnZXMgcGFnZSB0YWJsZSBlbnRyaWVzLiBFeGNlbGxlbnQuIEkmIzM5O20gZ29pbmcgdG8gaW5jbHVkZSBgbWFkdmlzZV9jb2xsYXBzZWAgaW4gYEZvY3VzU3ltYm9sc2AuCgpUaGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpcyBhbHNvIGltbWVkaWF0ZWx5IGp1bXBpbmcgb3V0IGF0IG1lIGFzIGFub3RoZXIga2V5IHBhcnQgb2YgdGhpcyBvdmVyYWxsIFRIUCBzdG9yeS4gSXQmIzM5O3MgYSBiYWNrZ3JvdW5kIHRocmVhZCwgc28gaXQgb3BlcmF0ZXMgZGlmZmVyZW50bHksIGJ1dCBpdCYjMzk7cyBjZW50cmFsIHRvIG1hbmFnaW5nIFRIUHMuCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbG93LWxldmVsIGRldGFpbHMuIFRpbWUgdG8gY2hlY2sgdGhlIGBDT05GSUdfYCBvcHRpb25zIG5lZWRlZC4gSSBuZWVkIHRvIGxvb2sgaW50byB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgZm9yIFRIUC4gSSBrbm93IHRoZSBzb3VyY2UgZmlsZSBpcyBgbW0va2h1Z2VwYWdlZC5jYC4gSSBzaG91bGQgcHJvYmFibHkgY2hlY2sgYG1tL01ha2VmaWxlYCBhcyB3ZWxsIHRvIHNlZSBob3cgdGhpcyBhbGwgZml0cyB0b2dldGhlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTEwMD1vYmotJChDT05GSUdfREVWSUNFX01JR1JBVElPTikgJiM0Mzs9IG1pZ3JhdGVfZGV2aWNlLm9cbm1tL01ha2VmaWxlOjEwMTpvYmotJChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYjNDM7PSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xubW0vTWFrZWZpbGUtMTAyLW9iai0kKENPTkZJR19QQUdFX0NPVU5URVIpICYjNDM7PSBwYWdlX2NvdW50ZXIub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTQ2MAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLCB0aGUgc3lzdGVtIG5lZWRzIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZS4gTm93LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhlIGNvZGUsIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZvciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiBUaGUgcGF0Y2ggbWVudGlvbnMgYG1USFBg4oCUbXVsdGktc2l6ZSBUSFAsIEkgYXNzdW1lLiBJIHdvbmRlciBpZiB0aGVyZSYjMzk7cyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGZvciB0aGF0IGFzIHdlbGwuIEJlc3QgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlIG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW52b2x2ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bVRIUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTY0NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipDaGVja2luZyB0aGUgS2NvbmZpZyBmb3IgVHJhbnNwYXJlbnQgSHVnZXBhZ2VzKioKCkFscmlnaHQsIHRoZSBvYmplY3RpdmUgaXMgcHJldHR5IGNsZWFyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEkga25vdyB0aGF0IGBtbS9LY29uZmlnYCBpcyB0aGUgZ28tdG8gcGxhY2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBpbiB0aGUgTGludXgga2VybmVsLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBkZWZpbmVkIGFuZCBkb2N1bWVudGVkLiBTbywgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gY3JhY2sgb3BlbiB0aGF0IGZpbGUgYW5kIHN0YXJ0IGxvb2tpbmcuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gZm9yIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgdGhlcmUuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGl0cyBkZXBlbmRlbmNpZXMsIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBhbnkgcmVsZXZhbnQgaGVscCB0ZXh0IHRoYXQgY2xhcmlmaWVzIGl0cyBwdXJwb3NlIGFuZCBpbXBsaWNhdGlvbnMuIEl0JiMzOTtzIHRpbWUgdG8gZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyBwbGFjZSBpbiB0aGUgYnJvYWRlciBtZW1vcnkgbWFuYWdlbWVudCBsYW5kc2NhcGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04MzE9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04MzMtXG5tbS9LY29uZmlnOjgzNDptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzNS1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODUyPWNob2ljZVxuLS1cbm1tL0tjb25maWctODU3LVxubW0vS2NvbmZpZzo4NTg6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg1OS1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg2NC1cbm1tL0tjb25maWc6ODY1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODY2LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3My1cbm1tL0tjb25maWc6ODc0Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg3NS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODgxPWNob2ljZVxuLS1cbm1tL0tjb25maWctODkwLVxubW0vS2NvbmZpZzo4OTE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy04OTItXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwMC1cbm1tL0tjb25maWc6OTAxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkwMi1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwOC1cbm1tL0tjb25maWc6OTA5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTEwLVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTYtXG5tbS9LY29uZmlnOjkxNzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MTgtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05MzUtXG5tbS9LY29uZmlnOjkzNjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTkzNy1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQ0LVxubW0vS2NvbmZpZzo5NDU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTQ2LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTUyLVxubW0vS2NvbmZpZzo5NTM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NTQtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk2MC1cbm1tL0tjb25maWc6OTYxOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk2Mi1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA2MDAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgUGF0Y2gqKgoKT2theSwgc28gdGhlIGNvcmUgZm9jdXMgaGVyZSBpcyB0aGUgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBjb25maWcsIHRoYXQmIzM5O3MgdGhlIHByaW1hcnkgZHJpdmVyLiBJJiMzOTttIHdvbmRlcmluZyBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHJlbGF0ZWQgY29uZmlncywgYnV0IEkmIzM5O2xsIGFzc3VtZSB0aGlzIGlzIHRoZSBtYWluIGVuYWJsZXIgZm9yIG5vdy4gVGhpcyBwYXRjaCBtb2RpZmllcyBgbW0va2h1Z2VwYWdlZC5jYCwgd2hpY2ggdGVsbHMgbWUgd2UmIzM5O3JlIGRlYWxpbmcgZGlyZWN0bHkgd2l0aCB0aGUgY29yZSBrZXJuZWwgbG9naWMgcmVsYXRlZCB0byBUcmFuc3BhcmVudCBIdWdlUGFnZXMuIEdvb2QuCgpUaGUgbW9kaWZpY2F0aW9ucyBhcmUgZnVuY3Rpb25hbCwgYW5kIEkgY2FuIGNvbmZpcm0gdGhleSBhcmUgcmVhY2hhYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgY29kZS4gVGhleSYjMzk7dmUgcmVmYWN0b3JlZCB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljLCBzcGxpdHRpbmcgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBoZWxwZXIgZnVuY3Rpb24uIFNtYXJ0IG1vdmUuIFRoZXkmIzM5O3ZlIGFsc28gaW50cm9kdWNlZCBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgLCB3aGljaCBpcyBhIG5lYXQgd2F5IHRvIHBhc3MgdGhlIHJlcXVpcmVkIHN0YXRlLiBBbmQgdGhlIGFkZGl0aW9uIG9mIHRoZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyIHNlZW1zIGxpa2UgYSB1c2VmdWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgdGhpcyBhcmVhLgoKVGhlIGNoYW5nZXMgYXJlIGNsZWFybHkgd2l0aGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLCBzbyB0aGlzIGlzIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkuIFRoaXMgY29kZSBpcyBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZS4gVGhhdCBjYW4gYmUgZG9uZSBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB3aXRoIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4gR2l2ZW4gdGhlIGNyaXRpY2FsIG5hdHVyZSBvZiBUSFAsIGFuZCB0aGlzIHBhdGNoJiMzOTtzIGludm9sdmVtZW50IGluIFBURSBoYW5kbGluZywgaXQmIzM5O3MgY2xlYXIgdGhpcyBpcyBgV29ydGhGdXp6aW5nPXRydWVgLgoKTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlci4gSSB3YW50IHRvIGNoZWNrIGZvciBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0va2h1Z2VwYWdlZC5jYCB0aGF0IGFyZSBhbHNvIG1vZGlmaWVkIG9yIHJlbGF0ZWQuIExldCYjMzk7cyBzZWUuLi4gQWgsIGBodWdlcGFnZV9tYWR2aXNlYCBsb29rcyByZWxldmFudCwgYXMgd2VsbC4gTGV0IG1lIHRha2UgYSBsb29rIGF0IGl0IGluIGBtbS9raHVnZXBhZ2VkLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlcGFnZV9tYWR2aXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ5OT1jaGFuZ2VfaHVnZV9wdWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTEwLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NTExOmludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MDI9c3RhdGljIGlubGluZSBib29sIHVubWFwX2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTEtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTI6c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxMy1cdFx0XHRcdCAgIHZtX2ZsYWdzX3QgKnZtX2ZsYWdzLCBpbnQgYWR2aWNlKVxuLS1cbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtNDY5LVxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL2todWdlcGFnZWQuYy00NzEtXHRcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTQxNy1cdGNhc2UgTUFEVl9OT0hVR0VQQUdFOlxubW0vbWFkdmlzZS5jOjE0MTg6XHRcdGVycm9yID0gaHVnZXBhZ2VfbWFkdmlzZSh2bWEsIFx1MDAyNm5ld19mbGFncywgYmVoYXZpb3IpO1xubW0vbWFkdmlzZS5jLTE0MTktXHRcdGlmIChlcnJvcilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE3ODIKCQkJCQkJCW91dHB1dDogMTkzCgkJCQkJCQl0aG91Z2h0czogNTI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBQYXRjaCBvbiBUcmFuc3BhcmVudCBIdWdlUGFnZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGhvdyBpdCByZWxhdGVzIHRvIFRyYW5zcGFyZW50IEh1Z2VQYWdlcyAoVEhQKS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGV4YW1pbmUgaG93IGBodWdlcGFnZV9tYWR2aXNlYCBhbmQgYG1hZHZpc2VfY29sbGFwc2VgIGFyZSBpbnZvbHZlZCwgYXMgdGhleSBhcmUgZGlyZWN0IGVudHJ5IHBvaW50cyBmb3IgcmVsYXRlZCBgbWFkdmlzZWAgY2FsbHMuIEJvdGggYE1BRFZfSFVHRVBBR0VgIGFuZCBgTUFEVl9OT0hVR0VQQUdFYCBhcmUgaGFuZGxlZCBieSBgaHVnZXBhZ2VfbWFkdmlzZWAsIGFuZCBgTUFEVl9DT0xMQVBTRWAgYnkgYG1hZHZpc2VfY29sbGFwc2VgLiBJJiMzOTtsbCB3YW50IHRvIGluY2x1ZGUgYm90aCBpbiBteSBhbmFseXNpcy4KCk5vdywgYSBjcnVjaWFsIHF1ZXN0aW9uOiBpcyBgbWFkdmlzZV9jb2xsYXBzZWAgaXRzZWxmIGRpcmVjdGx5IG1vZGlmaWVkIGJ5IHRoaXMgcGF0Y2g/IExldCBtZSBkb3VibGUtY2hlY2suLi4gbm8sIGl0IGlzbiYjMzk7dC4gSG93ZXZlciwgYG1hZHZpc2VfY29sbGFwc2VgICpkb2VzKiBjYWxsIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGUgcGF0Y2ggaGFzIHJlZmFjdG9yZWQgdGhlIFBURSBjaGVja2luZyBsb2dpYyB3aXRoaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIFNvLCBmdXp6aW5nIGBtYWR2aXNlX2NvbGxhcHNlYCB3aWxsIGRlZmluaXRlbHkgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGUgaW5kaXJlY3RseS4gSSBhbHNvIG5vdGUgdGhhdCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuCgpMZXQmIzM5O3Mgbm90IGZvcmdldCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmN5LiBJdCBzZWVtcyBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBvbmx5IHJlbGV2YW50IGNvbmZpZy4KCkZpbmFsbHksIEkgd2FudCB0byBjb25maXJtIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBgaHVnZXBhZ2VfbWFkdmlzZWAgYXJlbiYjMzk7dCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpZGVseS4gQXMgZXhwZWN0ZWQsIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBleGNsdXNpdmVseSBjYWxsZWQgd2hlbiBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgaXMgdXNlZCwgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBpcyBpbnZva2VkIG9ubHkgd2hlbiBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgYG1hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKWAgaXMgZXhlY3V0ZWQuIEV4Y2VsbGVudCwgdGhleSBhcmUgbm90LiBUaGF0IG1lYW5zIEkgY2FuIGZvY3VzIG15IGFuYWx5c2lzIG9uIHRoZW0gc3BlY2lmaWNhbGx5LgoKSSYjMzk7bSBub3cgcmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDssCiAgICAmIzM0O2h1Z2VwYWdlX21hZHZpc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OywKICAgICYjMzQ7aHVnZXBhZ2VfbWFkdmlzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzExIDEzOjA3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYTgxODY2NzBkYTI2MzQwZWFhNWRiNGI1NDNkOWMxODJkMzYzNWY2NQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDExIDEzOjA0OjA1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NAotLS0gYS9tbS9raHVnZXBhZ2VkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va2h1Z2VwYWdlZC5jCkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7CiAJU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSywKIH07CiAKJiM0MztlbnVtIHB0ZV9jaGVja19yZXN1bHQgewomIzQzOwlQVEVfQ0hFQ0tfU1VDQ0VFRCwKJiM0MzsJUFRFX0NIRUNLX0ZBSUwsCiYjNDM7CVBURV9DSEVDS19DT05USU5VRSwKJiM0Mzt9OwomIzQzOwogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAmbHQ7dHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmZ3Q7CiAKQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHsKIAlERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiB9OwogCiYjNDM7c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHsKJiM0MzsJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwomIzQzOwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwlpbnQgbm9uZV9vcl96ZXJvOwomIzQzOwlpbnQgc2hhcmVkOwomIzQzOwlpbnQgdW5tYXBwZWQ7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0OwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7CiYjNDM7fTsKJiM0MzsKIC8qKgogICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmcKICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuCkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJCS8qCiAJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3QKIAkJICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuCi0JCSAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAomIzQzOwkJICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAogCQkgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZAogCQkgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suCiAJCSAqLwpAQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiYjNDM7ewomIzQzOwltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKJiM0MzsJbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJYml0bWFwX3plcm8oY2MtJmd0O210aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogCW5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sCkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU1IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLAogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogZm9saW9fcHRlX3JlZmVyZW5jZWQoKSAtIENoZWNrIGlmIGEgZm9saW8gb3IgaXRzIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlCiYjNDM7ICogb3IgdGhlIGN1cnJlbnQgUFRFIG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGV2YWwpCiYjNDM7ewomIzQzOwkvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi8KJiM0MzsJaWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJLyogLi4uIG9yIHRoZSBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZCAqLwomIzQzOwlyZXR1cm4gcHRlX3lvdW5nKHB0ZXZhbCkgfHwgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LAomIzQzOwkJZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KQomIzQzO3sKJiM0MzsJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCiYjNDM7CQljb3VudF92bV9ldmVudCh2bV9ldmVudCk7CiYjNDM7CWNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmQKJiM0MzsgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCwKJiM0MzsJCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KQomIzQzO3sKJiM0MzsJY3R4LSZndDtyZXN1bHQgPSByZXN1bHQ7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfRkFJTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZQomIzQzOyAqCiYjNDM7ICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiYjNDM7ICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWQKJiM0MzsgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZQomIzQzOyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnQKJiM0MzsgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50CiYjNDM7ICoKJiM0MzsgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudAomIzQzOyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSwKJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSwKJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLgomIzQzOyAqLwomIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpCiYjNDM7ewomIzQzOwlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7bm9uZV9vcl96ZXJvICZndDsgY3R4LSZndDttYXhfcHRlc19ub25lKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLAomIzQzOwkJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX05PTkVfUFRFKTsKJiM0MzsJCX0KJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CiYjNDM7CQlpZiAoY3R4LSZndDt1bm1hcHBlZCA9PSAtMSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7CiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpOwomIzQzOwkJfQomIzQzOwkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTsKJiM0MzsJCXJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7CiYjNDM7CX0KJiM0MzsJLyoKJiM0MzsJICogRG9uJiMzOTt0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkCiYjNDM7CSAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWQKJiM0MzsJICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZQomIzQzOwkgKiByZWdpc3RlcmVkIHJhbmdlLgomIzQzOwkgKi8KJiM0MzsJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTsKJiM0MzsKJiM0MzsJY3R4LSZndDtmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtJmd0O3ZtYSwgYWRkciwgcHRldmFsKTsKJiM0MzsJaWYgKHVubGlrZWx5KCFjdHgtJmd0O2ZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtJmd0O2ZvbGlvKSkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKJiM0MzsJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgomIzQzOwkgKi8KJiM0MzsJaWYgKGN0eC0mZ3Q7Y2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOyAhKGN0eC0mZ3Q7dm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKJiM0MzsJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoY3R4LSZndDtmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpOwomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtJmd0O2ZvbGlvKSkgewomIzQzOwkJVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTsKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtJmd0O2ZvbGlvKSkgewomIzQzOwkJLyoKJiM0MzsJCSAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyCiYjNDM7CQkgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWEKJiM0MzsJCSAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGEKJiM0MzsJCSAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCYjNDM7JiM0MztjdHgtJmd0O3NoYXJlZCAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKSB7CiYjNDM7CQkJY291bnRfY29sbGFwc2VfZXZlbnQoY3R4LSZndDtvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7CiYjNDM7fQomIzQzOwogc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsCiAJCXVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjsKLQlwdGVfdCAqX3B0ZTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CXB0ZV90ICpfcHRlLCBwdGV2YWw7CiYjNDM7CWludCByZWZlcmVuY2VkID0gMDsKIAllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IG9yZGVyLAomIzQzOwkJLnVubWFwcGVkID0gLTEsIC8qIGRvbiYjMzk7dCBjaGVjayBzd2FwIFBURXMgKi8KJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksCiYjNDM7CQkubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksCiYjNDM7CX07CiAKIAlmb3IgKF9wdGUgPSBwdGU7IF9wdGUgJmx0OyBwdGUgJiM0MzsgbnJfcGFnZXM7CiAJICAgICBfcHRlJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCXB0ZV90IHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKLQkJCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUFRFX05PTl9QUkVTRU5UOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQlWTV9CVUdfT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsCi0JCSAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC4KLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9EUk9QUEFCTEUpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pICZhbXA7JmFtcDsgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7Ci0JCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7CiYjNDM7CQlwdGV2YWwgPSBwdGVwX2dldChfcHRlKTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dDsKIAkJfQomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpCiYjNDM7CQkJY29udGludWU7CiAKLQkJLyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovCi0JCWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkgewotCQkJLyoKLQkJCSAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyCi0JCQkgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWEKLQkJCSAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGEKLQkJCSAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS4KLQkJCSAqLwotCQkJaWYgKCYjNDM7JiM0MztzaGFyZWQgJmd0OyBtYXhfcHRlc19zaGFyZWQpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KIAkJLyoKIAkJICogVE9ETzogSW4gc29tZSBjYXNlcyBvZiBwYXJ0aWFsbHktbWFwcGVkIGZvbGlvcywgd2UmIzM5O2QgYWN0dWFsbHkKIAkJICogd2FudCB0byBjb2xsYXBzZS4KQEAgLTc1OSw4ICYjNDM7ODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAogCQkvKgogCQkgKiBXZSBjYW4gZG8gaXQgYmVmb3JlIGZvbGlvX2lzb2xhdGVfbHJ1IGJlY2F1c2UgdGhlCi0JCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrCi0JCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UKJiM0MzsJCSAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrCiYjNDM7CQkgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKCkKIAkJICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLgogCQkgKi8KIAkJaWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkgewpAQCAtNzg2LDcgJiM0Mzs4OTIsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl9CiAKIAkJLyoKLQkJICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlCiYjNDM7CQkgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2UKIAkJICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uCiAJCSAqLwogCQlpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkgewpAQCAtODAzLDE0ICYjNDM7OTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQogCQkJbGlzdF9hZGRfdGFpbCgmYW1wO2ZvbGlvLSZndDtscnUsIGNvbXBvdW5kX3BhZ2VsaXN0KTsKIG5leHQ6Ci0JCS8qCi0JCSAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpcwotCQkgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZQotCQkgKi8KIAkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsKLQkJICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fAotCQkgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKLQkJICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtJmd0O3ZtX21tLCBhZGRyKSkpCiYjNDM7CQkgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSkKIAkJCXJlZmVyZW5jZWQmIzQzOyYjNDM7OwogCX0KIApAQCAtODE4LDEzICYjNDM7OTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwotCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sCiAJCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogb3V0OgogCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpOwotCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sCiYjNDM7CXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsCiAJICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUKIAkgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZwogCSAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLAotCSAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LgomIzQzOwkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LgogCSAqLwogCXBtZF9wdGwgPSBwbWRfbG9jayh2bWEtJmd0O3ZtX21tLCBwbWQpOwogCXBtZF9wb3B1bGF0ZSh2bWEtJmd0O3ZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7CkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCi0JICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKJiM0MzsJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZQogCSAqIHZtYXMuCiAJICovCiAJaWYgKGV4cGVjdF9hbm9uICZhbXA7JmFtcDsgKCEoKnZtYXApLSZndDthbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKQpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuCiAgKgogICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZQogICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0CkBAIC0xMjA0LDcgJiM0MzsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlwdGUgPSBOVUxMOwogCiAJCS8qCi0JCSAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLgomIzQzOwkJICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KIAkJICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2UKIAkJICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlCiAJCSAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLgpAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKIAkJcmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7CiAJfQogCi0JaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7Ci0JY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwomIzQzOwljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwogCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHsKIAkJZm9saW9fcHV0KGZvbGlvKTsKQEAgLTEyNzEsNyAmIzQzOzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydQogfQogCiAvKgotICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiYjNDM7ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmQKICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2sKICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLgogICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi4KQEAgLTEzMTgsNyAmIzQzOzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJaWYgKHVubWFwcGVkKSB7CiAJCS8qCi0JCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9jawomIzQzOwkJICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKIAkJICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluCiAJCSAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuCiAJCSAqLwpAQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJLyoKIAkgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKLQkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk0KLQkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IFBHX2xvY2suCiYjNDM7CSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQlzcGluX2xvY2socG1kX3B0bCk7CiAJCVZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpOwogCQkvKgotCQkgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZwomIzQzOwkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZwogCQkgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdAotCQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0CiYjNDM7CQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXQKIAkJICovCiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCXNwaW5fdW5sb2NrKHBtZF9wdGwpOwpAQCAtMTQzOSw3ICYjNDM7MTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJCQlzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAkJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTsKIAkJbWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLAotCQkJCQkgIC8qdWZmZF93cD0qLyBmYWxzZSk7CiYjNDM7CQkJCQkgIC8qdWZmZD0qLyBmYWxzZSk7CiAJCWlmIChwdGVfcHRsICE9IHBtZF9wdGwpCiAJCQlzcGluX3VubG9jayhwdGVfcHRsKTsKIAl9CkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwogb3V0X3VwX3dyaXRlOgotCWlmIChhbm9uX3ZtYV9sb2NrZWQpCi0JCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAlpZiAocHRlKQogCQlwdGVfdW5tYXAocHRlKTsKJiM0MzsJaWYgKGFub25fdm1hX2xvY2tlZCkKJiM0MzsJCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAltbWFwX3dyaXRlX3VubG9jayhtbSk7CiBvdXRfbm9sb2NrOgogCWlmIChmb2xpbykKQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAogCQlib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTsKLQl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTsKIAllbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLSZndDtpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDsKIAlpbnQgaTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7Ci0JZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKIAogCVZNX0JVR19PTihzdGFydF9hZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiAKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUiwKJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJfTsKJiM0MzsKIAlyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgJmFtcDtwbWQpOwogCWlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7CiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAJCWdvdG8gb3V0OwogCX0KIAotCWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCiAJZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtJmd0O3ZtX2ZsYWdzLCB0dmFfZmxhZ3MpOwogCiAJLyoKIAkgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2UKLQkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLgomIzQzOwkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwCiYjNDM7CSAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLgogCSAqLwogCWlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSkKLQkJbWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiYjNDM7CQljdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiAKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsICZhbXA7cHRsKTsKIAlpZiAoIXB0ZSkgewpAQCAtMTY0NCw4NCAmIzQzOzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAkJY2MtJmd0O3Byb2dyZXNzJiM0MzsmIzQzOzsKIAotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3VubWFwcGVkICZndDsgbWF4X3B0ZXNfc3dhcCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQkvKgotCQkJICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3AKLQkJCSAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZQotCQkJICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS4KLQkJCSAqLwotCQkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkgewotCQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJLyoKLQkJCSAqIERvbiYjMzk7dCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsCi0JCQkgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi4KLQkJCSAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzCi0JCQkgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzCi0JCQkgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93bgotCQkJICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZgotCQkJICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuCi0JCQkgKi8KLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dF91bm1hcDsKIAkJfQotCi0JCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0FOT047Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFAKLQkJICogaXMgc2hhcmVkLgotCQkgKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCS8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovCiAJCV9fc2V0X2JpdChpLCBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMpOwpAQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qCiAJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy4KIAkJICoKLQkJICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6Ci0JCSAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSAmZ3Q7IGZvbGlvX3JlZl9jb3VudCgpLgotCQkgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UKLQkJICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2UKLQkJICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrCi0JCSAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuCiYjNDM7CQkgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmQKJiM0MzsJCSAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lCiYjNDM7CQkgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgogCQkgKi8KIAkJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkgewogCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UOwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KIAotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCiAJCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpCiAJCQlyZWZlcmVuY2VkJiM0MzsmIzQzOzsKIAl9CiAJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsKIAkJICAgKCFyZWZlcmVuY2VkIHx8Ci0JCSAgICAodW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiYjNDM7CQkgICAgKGN0eC51bm1hcHBlZCAmYW1wOyZhbXA7IHJlZmVyZW5jZWQgJmx0OyBIUEFHRV9QTURfTlIgLyAyKSkpIHsKIAkJcmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTsKIAl9IGVsc2UgewogCQlyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7CkBAIC0xNzgxLDE2ICYjNDM7MTgwNCwxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIG91dF91bm1hcDoKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKIAlpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkgewotCQkvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiYjNDM7CQkvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi8KIAkJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJCXJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsCi0JCQkJICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwomIzQzOwkJCQkgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpOwogCQkvKiBtbWFwX2xvY2sgd2FzIHJlbGVhc2VkIGFib3ZlLCBzZXQgbG9ja19kcm9wcGVkICovCiAJCSpsb2NrX2Ryb3BwZWQgPSB0cnVlOwogCX0KIG91dDoKIAl0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwKLQkJCQkgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7CiYjNDM7CQkJCSAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI2OTEsOCAmIzQzOzI3MTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAlwcmVzZW50ID0gMDsKIAlzd2FwID0gMDsKLQltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKLQlub2Rlc19jbGVhcihjYy0mZ3Q7YWxsb2Nfbm1hc2spOwomIzQzOwljb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7CiAJcmN1X3JlYWRfbG9jaygpOwogCXhhc19mb3JfZWFjaCgmYW1wO3hhcywgZm9saW8sIHN0YXJ0ICYjNDM7IEhQQUdFX1BNRF9OUiAtIDEpIHsKIAkJaWYgKHhhc19yZXRyeSgmYW1wO3hhcywgZm9saW8pKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTEgMTM6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTExNDIKCQkJCQkJCW91dHB1dDogMjA0CgkJCQkJCQl0aG91Z2h0czogMTYxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBraHVnZXBhZ2VkIFJlZmFjdG9yaW5nIGZvciBLTVNBTiBSZWxldmFuY2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyByZWZhY3RvcmluZyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBga2h1Z2VwYWdlZGAsIHNwZWNpZmljYWxseSBpbiBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludHJvZHVjdGlvbiBvZiBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIHJlZmFjdG9yaW5nIG9mIHRoZSBleGlzdGluZyBjb2RlIGludG8gaGVscGVyIGZ1bmN0aW9ucyBsaWtlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEFsc28sIHRoZXkgYXJlIGFkZGluZyBzb21lIG5ldyBmdW5jdGlvbnMgbGlrZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBwdGVfY2hlY2tfZmFpbCgpYC4gVGhlIG1haW4gZ29hbCBzZWVtcyB0byBiZSB0byBpbXByb3ZlIHRoZSBjb2RlJiMzOTtzIHN0cnVjdHVyZSwgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBLTVNBTi1kZXRlY3RhYmxlIGlzc3Vlcy4KCkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0OgoKYGBgYwpzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgewoJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwoJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Cgl1bnNpZ25lZCBpbnQgb3JkZXI7CglzdHJ1Y3QgZm9saW8gKmZvbGlvOwoJaW50IG5vbmVfb3JfemVybzsKCWludCBzaGFyZWQ7CglpbnQgdW5tYXBwZWQ7CgllbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDsKCXVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lOwoJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7Cgl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkOwp9OwpgYGAKCkFscmlnaHQsIEkgc2VlIGhvdyBpdCYjMzk7cyB1c2VkIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYDoKCmBgYGMKCXN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7CgkJLmNjID0gY2MsCgkJLnZtYSA9IHZtYSwKCQkub3JkZXIgPSBvcmRlciwKCQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwoJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlciksCgkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLAoJfTsKYGBgCgpJbXBvcnRhbnQgcG9pbnQgaGVyZTogIGBjdHgubm9uZV9vcl96ZXJvYCBhbmQgYGN0eC5zaGFyZWRgIGFyZSAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCdXQgd2FpdCwgSSYjMzk7bSBwcmV0dHkgc3VyZSBpbiBDLCBpZiB5b3UgZG9uJiMzOTt0IGluaXRpYWxpemUgYSBzdHJ1Y3QgbWVtYmVyIGl0IGdvZXMgdG8gemVybywgdGhlIHplcm8taW5pdGlhbGl6YXRpb24gcnVsZXMuIFF1aWNrIGNoZWNrIG9uIHRoZSBDIHN0YW5kYXJkIGp1c3QgdG8gYmUgc3VyZTogeWVwLCBtaXNzaW5nIGZpZWxkcyBpbiBhbiBpbml0aWFsaXplciBsaXN0IGFyZSBpbml0aWFsaXplZCBhcyBpZiB0aGV5IGhhZCBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbiAoaS5lLiwgemVyb2VkKS4gVGhhdCBtZWFucyBgbm9uZV9vcl96ZXJvYCwgYHNoYXJlZGAsIGByZXN1bHRgLCBgZm9saW9gLCBhbmQgYG1heF9wdGVzX3N3YXBgIHdpbGwgYWxsIGJlIHplcm8uICBObyBwcm9ibGVtIHRoZXJlLiAgSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgbG9naWMsIHRob3VnaCwgdG8gbWFrZSBzdXJlIHRoaXMgaXMgd2hhdCBpcyBleHBlY3RlZC4KCkkgYWxzbyBjaGVja2VkIGhvdyB0aGlzIHN0cnVjdCBpcyB1c2VkIGluIGBjb2xsYXBzZV9zY2FuX3BtZGAsIHdoZXJlIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYHJlc3VsdGAgYXJlIHNpbWlsYXJseSBsZWZ0IHVuaW5pdGlhbGl6ZWQgYW5kIHRodXMgd2lsbCBiZSBpbXBsaWNpdGx5IHplcm9lZC4KCk9rYXksIGxldCYjMzk7cyBtYWtlIHN1cmUgbm90aGluZyBpcyB1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gIFRoZSBtYWluIHJpc2sgd291bGQgYmUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYmVpbmcgcmVhZCBhbmQgdXNlZCBpbiBsb2dpYyBvciBjb21wYXJpc29ucy4KCkkgY2hlY2tlZCBgY3R4LnVubWFwcGVkYCwgd2hpY2ggaXMgaW5pdGlhbGx5IHplcm8taW5pdGlhbGl6ZWQgaW4gbW9zdCBjYXNlcywgdGhlbiBzZXQgdG8gYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAuIE5vdyBsZXQmIzM5O3Mgc2VlIHdoZXJlIHRoYXQgaXMgdXNlZC4gSXQgbG9va3MgbGlrZSBpdCBpcyB1c2VkIGluIGBjb2xsYXBzZV9zY2FuX3BtZGA6CgpgYGBjCglpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwoJCSAgICghcmVmZXJlbmNlZCB8fAoJCSAgICAoY3R4LnVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewpgYGAKCkxvb2tzIGxpa2UgaXQgaXMgYmVpbmcgdXNlZCBzYWZlbHkuIEl0IGlzIGluY3JlbWVudGVkIGxhdGVyIGluIGBjb2xsYXBzZV9jaGVja19wdGVgOgoKYGBgYwoJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CgkJaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCgkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKCQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7dW5tYXBwZWQgJmd0OyBjdHgtJmd0O21heF9wdGVzX3N3YXApIHsKYGBgCgpTbyBpdCBsb29rcyBsaWtlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIChvciB0aGUgLTEgaW4gdGhlIG9uZSBjYXNlKSBpcyBkZWxpYmVyYXRlLiBHb29kLgoKSSYjMzk7bSBhbHNvIGxvb2tpbmcgYXQgdGhlIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYylgIGZ1bmN0aW9uLiBTZWVtcyB0aGlzIGlzIGJlaW5nIHJlcGxhY2VkIGluIGEgdmVyeSBzdHJhaWdodGZvcndhcmQgd2F5LCBzbyBJIGRvbiYjMzk7dCBzZWUgYW55IGlzc3VlLgoKTm93LCBjaGVja2luZyB0aGUgYC0xYCBpbml0aWFsaXphdGlvbiBvZiBgdW5tYXBwZWRgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgaXQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBwcmV2aW91cyBsb2dpYyBhbmQgYXBwZWFycyBzYWZlLgoKU28sIGlzIHRoZXJlIGFueSBLTVNBTiByaXNrPyBJIGRvbiYjMzk7dCB0aGluayBzby4gVGhpcyBwYXRjaCBpcyBtb3N0bHkgYSAqcmVmYWN0b3JpbmcqIG9mIGBraHVnZXBhZ2VkYCYjMzk7cyBQVEUgc2Nhbm5pbmcuIEl0JiMzOTtzIG5vdCBkaXJlY3RseSBpbnRlcmFjdGluZyB3aXRoIHVzZXIgc3BhY2UKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMSAxMzowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDQ6MDcuNzU4ODQxNzQ4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMzMDY0OTA2NDQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiLFxuICAgIFwiaHVnZXBhZ2VfbWFkdmlzZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgc2Nhbm5pbmcgbG9naWMgaW4gYGtodWdlcGFnZWRgIGJ5IGludHJvZHVjaW5nIGEgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYW5kIGEgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUuIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCB1c2luZyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCBhbGwgdW5saXN0ZWQgZmllbGRzIChzdWNoIGFzIGBub25lX29yX3plcm9gLCBgc2hhcmVkYCwgYHVubWFwcGVkYCwgYGZvbGlvYCwgYW5kIGByZXN1bHRgKSBhcmUgaW1wbGljaXRseSB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21waWxlci4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBhbnkgc3RydWN0dXJlcyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgbGVhdmUgYW55IHZhcmlhYmxlcyB1bmluaXRpYWxpemVkIHRoYXQgY291bGQgYWZmZWN0IGNvbnRyb2wgZmxvdyBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGlzIHJlZmFjdG9yaW5nIHdvdWxkIGJlIGxvZ2ljIGVycm9ycywgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgd2hpY2ggYXJlIGFkZXF1YXRlbHkgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIHRlc3RpbmcuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA0OjA3Ljc1ODg0NzA5OFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyMjkxNjc3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBBdWcgMTEgMTM6MDQ6MDUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcXG5AQCAtMjI0LDcgKzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcXG4gdG8gXFxcImFsd2F5c1xcXCIgb3IgXFxcIm1hZHZpc2VcXFwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxcbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXFxcIm5ldmVyXFxcIilcXG4rdG9wLWxldmVsIGNvbnRyb2wgYXJlIFxcXCJuZXZlclxcXCIpLlxcbiBcXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxcbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxcbithbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxcbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxcbisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXFx1MDAzY3NpemVcXHUwMDNla0Ivc3RhdHMvKTo6XFxuIFxcbiBcXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxcbiBcXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXFxuaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDRcXG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcXG5AQCAtNjUsNiArNjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XFxuIFxcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXFxuIH07XFxuIFxcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xcbitcXHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcXG4rXFx0UFRFX0NIRUNLX0ZBSUwsXFxuK1xcdFBURV9DSEVDS19DT05USU5VRSxcXG4rfTtcXG4rXFxuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xcbiAjaW5jbHVkZSBcXHUwMDNjdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcXHUwMDNlXFxuIFxcbkBAIC0xMTksNiArMTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcXG4gXFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbiB9O1xcbiBcXG4rc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHtcXG4rXFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xcbitcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcXG4rXFx0dW5zaWduZWQgaW50IG9yZGVyO1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRpbnQgbm9uZV9vcl96ZXJvO1xcbitcXHRpbnQgc2hhcmVkO1xcbitcXHRpbnQgdW5tYXBwZWQ7XFxuK1xcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XFxuK307XFxuK1xcbiAvKipcXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cXG5AQCAtNjIwLDcgKzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcXG4gXFx0XFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXFxuLVxcdFxcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbitcXHRcXHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXFxuIFxcdFxcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXFxuIFxcdFxcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cXG4gXFx0XFx0ICovXFxuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4gXFx0fVxcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuK3tcXG4rXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuK1xcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGJpdG1hcF96ZXJvKGNjLVxcdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuIHtcXG4gXFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcXG5AQCAtNjY1LDc2ICs2OTIsMTU1IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKCkgLSBDaGVjayBpZiBhIGZvbGlvIG9yIGl0cyBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXFxuKyAqIG9yIHRoZSBjdXJyZW50IFBURSBtYXBwaW5nLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90IHB0ZXZhbClcXG4re1xcbitcXHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cXG4rXFx0aWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHQvKiAuLi4gb3IgdGhlIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkICovXFxuK1xcdHJldHVybiBwdGVfeW91bmcocHRldmFsKSB8fCBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXFxuK1xcdFxcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcXG4re1xcbitcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4rXFx0XFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xcbitcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxcbitcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcXG4re1xcbitcXHRjdHgtXFx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcXG4rXFx0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xcbit9XFxuK1xcbisvKlxcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxcbisgKlxcbisgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcXG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcXG4rICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XFxuKyAqXFxuKyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cXG4rICovXFxuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcXG4re1xcbitcXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XFxuK1xcdFxcdGlmICgrK2N0eC1cXHUwMDNlbm9uZV9vcl96ZXJvIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19ub25lKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcXG4rXFx0fVxcbitcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNldW5tYXBwZWQgPT0gLTEpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2V1bm1hcHBlZCBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcXG4rfVxcbitcXG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xcbi1cXHRwdGVfdCAqX3B0ZTtcXG4tXFx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xcbitcXHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuIFxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbitcXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gb3JkZXIsXFxuK1xcdFxcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cXG4rXFx0XFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxcbitcXHR9O1xcbiBcXG4gXFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFxcdTAwM2MgcHRlICsgbnJfcGFnZXM7XFxuIFxcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxcbi1cXHRcXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXFx1MDAyNlxcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXFxuLVxcdFxcdFxcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxcbi1cXHRcXHRcXHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXFxuLVxcdFxcdFxcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XFxuIFxcdFxcdCAqIHdhbnQgdG8gY29sbGFwc2UuXFxuQEAgLTc1OSw4ICs4NjUsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXFxuLVxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4rXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xcbkBAIC03ODYsNyArODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXFxuK1xcdFxcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxcbiBcXHRcXHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XFxuQEAgLTgwMywxNCArOTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZmb2xpby1cXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuIG5leHQ6XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4gXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcXG4gXFx0XFx0XFx0cmVmZXJlbmNlZCsrO1xcbiBcXHR9XFxuIFxcbkBAIC04MTgsMTMgKzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuLVxcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdFxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdFxcdHJldHVybiByZXN1bHQ7XFxuIFxcdH1cXG4gb3V0OlxcbiBcXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tXFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcXG4rXFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXFxuIFxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4gXFx0cmV0dXJuIHJlc3VsdDtcXG4gfVxcbkBAIC05MDQsNyArMTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuIFxcdCAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlXFxuIFxcdCAqIGVudHJ5LiBSZXN0b3JpbmcgUE1EIG5lZWRzIHRvIGJlIGRvbmUgcHJpb3IgdG8gcmVsZWFzaW5nXFxuIFxcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxcbi1cXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS5cXG4rXFx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cXG4gXFx0ICovXFxuIFxcdHBtZF9wdGwgPSBwbWRfbG9jayh2bWEtXFx1MDAzZXZtX21tLCBwbWQpO1xcbiBcXHRwbWRfcG9wdWxhdGUodm1hLVxcdTAwM2V2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpO1xcbkBAIC0xMDc4LDkgKzExNzgsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxcbiBcXHRcXHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XFxuIFxcdC8qXFxuIFxcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxcbi1cXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXFxuK1xcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXFxuIFxcdCAqXFxuLVxcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXFxuK1xcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcXG4gXFx0ICogdm1hcy5cXG4gXFx0ICovXFxuIFxcdGlmIChleHBlY3RfYW5vbiBcXHUwMDI2XFx1MDAyNiAoISgqdm1hcCktXFx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXFxuQEAgLTExMzYsNyArMTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIC8qXFxuICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxuKyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxuICAqXFxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XFxuQEAgLTEyMDQsNyArMTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0cHRlID0gTlVMTDtcXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxcbitcXHRcXHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxcbiBcXHRcXHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxcbiBcXHRcXHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcXG4gXFx0XFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXFxuQEAgLTEyNDcsMTUgKzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcXG4gXFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFxcdTAwMjZjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbiBcXHRpZiAoIWZvbGlvKSB7XFxuIFxcdFxcdCpmb2xpb3AgPSBOVUxMO1xcbi1cXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XFxuLVxcdFxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XFxuK1xcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxcbitcXHRcXHRcXHRcXHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbiBcXHRcXHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XFxuLVxcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4rXFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuQEAgLTEyNzEsNyArMTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XFxuIH1cXG4gXFxuIC8qXFxuLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxcbisgKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxcbiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrXFxuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxcbiAgKiBOb3RlIHRoYXQgdGhlIFZNQSBtdXN0IGJlIHJlY2hlY2tlZCBhZnRlciBncmFiYmluZyB0aGUgbW1hcF9sb2NrIGFnYWluLlxcbkBAIC0xMzE4LDcgKzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXG4gXFx0aWYgKHVubWFwcGVkKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbitcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbiBcXHRcXHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cXG4gXFx0XFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cXG4gXFx0XFx0ICovXFxuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2ZcXG4tXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXFxuLVxcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxcbitcXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTVxcbitcXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgZm9saW8gbG9jay5cXG4gXFx0ICpcXG4gXFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXFxuIFxcdCAqIG1tYXBfbG9jay5cXG5AQCAtMTM4OSw5ICsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcXG4gXFx0XFx0c3Bpbl9sb2NrKHBtZF9wdGwpO1xcbiBcXHRcXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmdcXG4rXFx0XFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xcbiBcXHRcXHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxcbi1cXHRcXHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XFxuK1xcdFxcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUoKSBmb3IgdGhhdFxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcXG4gXFx0XFx0c3Bpbl91bmxvY2socG1kX3B0bCk7XFxuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdFxcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xcbiBcXHRcXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xcbiBcXHRcXHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXFxuLVxcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xcbiBcXHRcXHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxcbiBcXHRcXHRcXHRzcGluX3VubG9jayhwdGVfcHRsKTtcXG4gXFx0fVxcbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcbiBcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuIG91dF91cF93cml0ZTpcXG4tXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4tXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRpZiAocHRlKVxcbiBcXHRcXHRwdGVfdW5tYXAocHRlKTtcXG4rXFx0aWYgKGFub25fdm1hX2xvY2tlZClcXG4rXFx0XFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cXHUwMDNlYW5vbl92bWEpO1xcbiBcXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XFxuIG91dF9ub2xvY2s6XFxuIFxcdGlmIChmb2xpbylcXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4gXFx0XFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbi1cXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcXG4gXFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcXG4gXFx0cG1kX3QgKnBtZDtcXG4gXFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcXG4gXFx0aW50IGk7XFxuLVxcdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcXG4tXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuLVxcdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuK1xcdGludCByZWZlcmVuY2VkID0gMDtcXG4rXFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XFxuIFxcdHVuc2lnbmVkIGxvbmcgYWRkcjtcXG4gXFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcXG4gXFx0c3BpbmxvY2tfdCAqcHRsO1xcbi1cXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xcbitcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4rXFx0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcXG4gXFxuIFxcdFZNX0JVR19PTihzdGFydF9hZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4gXFxuK1xcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XFxuK1xcdFxcdC5jYyA9IGNjLFxcbitcXHRcXHQudm1hID0gdm1hLFxcbitcXHRcXHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXFxuK1xcdFxcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdFxcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXFxuK1xcdH07XFxuK1xcbiBcXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXFx1MDAyNnBtZCk7XFxuIFxcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0Yml0bWFwX3plcm8oY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4tXFx0bWVtc2V0KGNjLVxcdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cXHUwMDNlbm9kZV9sb2FkKSk7XFxuLVxcdG5vZGVzX2NsZWFyKGNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4gXFxuIFxcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVxcdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxcbi1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxcbitcXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxuK1xcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxcbi1cXHRcXHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4rXFx0XFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xcbiBcXG4gXFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcXHUwMDI2cHRsKTtcXG4gXFx0aWYgKCFwdGUpIHtcXG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFxuIFxcdFxcdGNjLVxcdTAwM2Vwcm9ncmVzcysrO1xcbiBcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrdW5tYXBwZWQgXFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxcbi1cXHRcXHRcXHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcXG4tXFx0XFx0XFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxcbi1cXHRcXHRcXHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cXG4tXFx0XFx0XFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcXG4tXFx0XFx0XFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xcbi1cXHRcXHRcXHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxcbi1cXHRcXHRcXHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXFxuLVxcdFxcdFxcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4tXFx0XFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbi1cXG4tXFx0XFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xcbi1cXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxcbi1cXHRcXHQgKiBpcyBzaGFyZWQuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0aWYgKCsrc2hhcmVkIFxcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XFxuLVxcdFxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXFxuIFxcdFxcdF9fc2V0X2JpdChpLCBjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xcbkBAIC0xNzQ5LDMxICsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXFxuIFxcdFxcdCAqXFxuLVxcdFxcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5Olxcbi1cXHRcXHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cXG4tXFx0XFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXFxuLVxcdFxcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXFxuLVxcdFxcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xcbi1cXHRcXHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxcbitcXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcXG4rXFx0XFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcXG4rXFx0XFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcXG4gXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXFxuLVxcdFxcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXFxuLVxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbi1cXHRcXHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXFx1MDAzZXZtX21tLCBhZGRyKSkpXFxuK1xcdFxcdCAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKVxcbiBcXHRcXHRcXHRyZWZlcmVuY2VkKys7XFxuIFxcdH1cXG4gXFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICghcmVmZXJlbmNlZCB8fFxcbi1cXHRcXHQgICAgKHVubWFwcGVkIFxcdTAwMjZcXHUwMDI2IHJlZmVyZW5jZWQgXFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcXG4rXFx0XFx0ICAgIChjdHgudW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxuQEAgLTE3ODEsMTYgKzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIG91dF91bm1hcDpcXG4gXFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XFxuIFxcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XFxuLVxcdFxcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4rXFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXFxuIFxcdFxcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xcbiBcXHRcXHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgICAgdW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuK1xcdFxcdFxcdFxcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuIFxcdFxcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cXG4gXFx0XFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XFxuIFxcdH1cXG4gb3V0OlxcbiBcXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcXG4tXFx0XFx0XFx0XFx0ICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpO1xcbitcXHRcXHRcXHRcXHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcXG4gXFx0cmV0dXJuIHJlc3VsdDtcXG4gfVxcbiBcXG5AQCAtMjY5MSw4ICsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXG4gXFx0cHJlc2VudCA9IDA7XFxuIFxcdHN3YXAgPSAwO1xcbi1cXHRtZW1zZXQoY2MtXFx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVxcdTAwM2Vub2RlX2xvYWQpKTtcXG4tXFx0bm9kZXNfY2xlYXIoY2MtXFx1MDAzZWFsbG9jX25tYXNrKTtcXG4rXFx0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xcbiBcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdHhhc19mb3JfZWFjaChcXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XFxuIFxcdFxcdGlmICh4YXNfcmV0cnkoXFx1MDAyNnhhcywgZm9saW8pKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDowOS4xODI0OTc0OTFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyMDk5MDUxNjY4OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCIsXG4gICAgXCJodWdlcGFnZV9tYWR2aXNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhODE4NjY3MGRhMjYzNDBlYWE1ZGI0YjU0M2Q5YzE4MmQzNjM1ZjY1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTEgMTM6MDQ6MDUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcbiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXRcbiB0byBcImFsd2F5c1wiIG9yIFwibWFkdmlzZVwiKSwgYW5kIGl0J2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlblxuIGFsbCBUSFAgc2l6ZXMgYXJlIGRpc2FibGVkICh3aGVuIGJvdGggdGhlIHBlci1zaXplIGFub24gY29udHJvbCBhbmQgdGhlXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIilcbit0b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgKzMwMSw5IEBAIGJlaW5nIHJlcGxhY2VkIGJ5IGEgUE1EIG1hcHBpbmcsIG9yICgyKSBwaHlzaWNhbCBwYWdlcyByZXBsYWNlZCBieSBvbmVcbiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cbiBBcyBzdWNoLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCByb3VnaGx5IGFzIGEgc2lnbiBvZiBwcm9ncmVzcyxcbi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6XG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cbitQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy1cdTAwM2NzaXplXHUwMDNla0Ivc3RhdHMvKTo6XG4gXG4gXHQvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZFxuIFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xuaW5kZXggYjIzN2Y2ZTc2NjJhNS4uMGJhNjM3ZGY5YzQ4NCAxMDA2NDRcbi0tLSBhL21tL2todWdlcGFnZWQuY1xuKysrIGIvbW0va2h1Z2VwYWdlZC5jXG5AQCAtNjUsNiArNjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7XG4gXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxuIH07XG4gXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcbitcdFBURV9DSEVDS19TVUNDRUVELFxuK1x0UFRFX0NIRUNLX0ZBSUwsXG4rXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXG4rfTtcbitcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcbiAjaW5jbHVkZSBcdTAwM2N0cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFx1MDAzZVxuIFxuQEAgLTExOSw2ICsxMjUsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wge1xuIFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuIH07XG4gXG4rc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHtcbitcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcbitcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuK1x0dW5zaWduZWQgaW50IG9yZGVyO1xuK1x0c3RydWN0IGZvbGlvICpmb2xpbztcbitcdGludCBub25lX29yX3plcm87XG4rXHRpbnQgc2hhcmVkO1xuK1x0aW50IHVubWFwcGVkO1xuK1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbit9O1xuK1xuIC8qKlxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXG4gICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW5cbkBAIC02MjAsNyArNjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdFx0LypcbiBcdFx0ICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdFxuIFx0XHQgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW5cbi1cdFx0ICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4rXHRcdCAqIHVuZGVyIG1tYXBfbG9jayByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbiBcdFx0ICogcGFnZXRhYmxlcyB3aWxsIGJlIGRlc3Ryb3llZCkgdW50aWwga2h1Z2VwYWdlZCBoYXMgZmluaXNoZWRcbiBcdFx0ICogd29ya2luZyBvbiB0aGUgcGFnZXRhYmxlcyB1bmRlciB0aGUgbW1hcF9sb2NrLlxuIFx0XHQgKi9cbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHR9XG4gfVxuIFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbit7XG4rXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4rXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcbkBAIC02NjUsNzYgKzY5MiwxNTUgQEAgc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfcGFnZXMocHRlX3QgKnB0ZSwgcHRlX3QgKl9wdGUsXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogZm9saW9fcHRlX3JlZmVyZW5jZWQoKSAtIENoZWNrIGlmIGEgZm9saW8gb3IgaXRzIFBURSBtYXBwaW5nIHdhcyByZWNlbnRseSB1c2VkXG4rICpcbisgKiBSZXR1cm46IHRydWUgaWYgcmVjZW50IGFjY2VzcyB3YXMgb2JzZXJ2ZWQgdGhyb3VnaCBlaXRoZXIgdGhlIGZvbGlvIHN0YXRlXG4rICogb3IgdGhlIGN1cnJlbnQgUFRFIG1hcHBpbmcuXG4rICovXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90IHB0ZXZhbClcbit7XG4rXHQvKiBUaGUgZm9saW8gd2FzIHJlZmVyZW5jZWQgcHJldmlvdXNseSAuLi4gKi9cbitcdGlmIChmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fCBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdC8qIC4uLiBvciB0aGUgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWQgKi9cbitcdHJldHVybiBwdGVfeW91bmcocHRldmFsKSB8fCBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbitcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuK3tcbitcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuK1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4rXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuK31cbitcbisvKlxuKyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4rXHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuK3tcbitcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4rXHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4rfVxuK1xuKy8qXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbisgKlxuKyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbisgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuKyAqXG4rICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbisgKi9cbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4re1xuK1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbitcdFx0fVxuK1x0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuK1x0fVxuK1x0LypcbitcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXG4rXHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4rXHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4rXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxuK1x0ICovXG4rXHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXG4rXHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbitcdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuK1xuK1x0LypcbitcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbitcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbitcdCAqL1xuK1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO1xuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4rXHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuK1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4rXHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbitcdFx0ICovXG4rXHRcdGlmICgrK2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuK31cbitcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbitcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gb3JkZXIsXG4rXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuK1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggKzg2NSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbitcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyArODkyLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbitcdFx0ICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlXG4gXHRcdCAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHtcbkBAIC04MDMsMTQgKzkwOSw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbiBcdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdCAgICBmb2xpb19wdGVfcmVmZXJlbmNlZChmb2xpbywgdm1hLCBhZGRyLCBwdGV2YWwpKVxuIFx0XHRcdHJlZmVyZW5jZWQrKztcbiBcdH1cbiBcbkBAIC04MTgsMTMgKzkxOCwxMyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuLVx0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxuK1x0XHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG4gb3V0OlxuIFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XG4tXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxuK1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICsxMDA0LDcgQEAgc3RhdGljIHZvaWQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlX3QgKnB0ZSxcbiBcdCAqIFJlLWVzdGFibGlzaCB0aGUgUE1EIHRvIHBvaW50IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlXG4gXHQgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZ1xuIFx0ICogcGFnZXMuIFNpbmNlIHBhZ2VzIGFyZSBzdGlsbCBpc29sYXRlZCBhbmQgbG9ja2VkIGhlcmUsXG4tXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSBpcyB1bm5lY2Vzc2FyeS5cbitcdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlKCkgaXMgdW5uZWNlc3NhcnkuXG4gXHQgKi9cbiBcdHBtZF9wdGwgPSBwbWRfbG9jayh2bWEtXHUwMDNldm1fbW0sIHBtZCk7XG4gXHRwbWRfcG9wdWxhdGUodm1hLVx1MDAzZXZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7XG5AQCAtMTA3OCw5ICsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuK1x0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYWNxdWlyZWQgdGhlIG1tYXBfbG9jay5cbiBcdCAqXG4tXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuK1x0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxuIFx0ICogdm1hcy5cbiBcdCAqL1xuIFx0aWYgKGV4cGVjdF9hbm9uIFx1MDAyNlx1MDAyNiAoISgqdm1hcCktXHUwMDNlYW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSlcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4rICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbiAgKlxuICAqIEZvciBtVEhQIG9yZGVycyB0aGUgZnVuY3Rpb24gYmFpbHMgb24gdGhlIGZpcnN0IHN3YXAgZW50cnksIGJlY2F1c2VcbiAgKiBmYXVsdGluZyBwYWdlcyBiYWNrIGluIGR1cmluZyBjb2xsYXBzZSBjb3VsZCByZS1wb3B1bGF0ZSBQVEVzIHRoYXRcbkBAIC0xMjA0LDcgKzEzMDQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHB0ZSA9IE5VTEw7XG4gXG4gXHRcdC8qXG4tXHRcdCAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuK1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSArMTM0NywxMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiBcdGlmICghZm9saW8pIHtcbiBcdFx0KmZvbGlvcCA9IE5VTEw7XG4tXHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuLVx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuK1x0XHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcbitcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4rXHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuIFxuIFx0aWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbkBAIC0xMjcxLDcgKzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIH1cbiBcbiAvKlxuLSAqIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxuKyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdGlmICh1bm1hcHBlZCkge1xuIFx0XHQvKlxuLVx0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbitcdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcbiBcdFx0ICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluXG4gXHRcdCAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuXG4gXHRcdCAqL1xuQEAgLTEzMzEsOCArMTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIFBHX2xvY2suXG4rXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwbWRwX2NvbGxhcHNlX2ZsdXNoKCkgYW5kIHRoZSBWTVxuK1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXG4gXHQgKlxuIFx0ICogVUZGRElPX01PVkUgaXMgcHJldmVudGVkIHRvIHJhY2UgYXMgd2VsbCB0aGFua3MgdG8gdGhlXG4gXHQgKiBtbWFwX2xvY2suXG5AQCAtMTM4OSw5ICsxNDg2LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0c3Bpbl9sb2NrKHBtZF9wdGwpO1xuIFx0XHRWTV9XQVJOX09OX09OQ0UoIXBtZF9ub25lKCpwbWQpKTtcbiBcdFx0Lypcbi1cdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQgd2hlbiBlc3RhYmxpc2hpbmdcbitcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4rXHRcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUoKSBmb3IgdGhhdFxuIFx0XHQgKi9cbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0c3Bpbl91bmxvY2socG1kX3B0bCk7XG5AQCAtMTQzOSw3ICsxNTM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdFx0XHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcbiBcdFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcbiBcdFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxuLVx0XHRcdFx0XHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XG4rXHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICsxNTQ2LDEwIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4gb3V0X3VwX3dyaXRlOlxuLVx0aWYgKGFub25fdm1hX2xvY2tlZClcbi1cdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRpZiAocHRlKVxuIFx0XHRwdGVfdW5tYXAocHRlKTtcbitcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4rXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiArMTY5MCw0NyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcbiBcdFx0Ym9vbCAqbG9ja19kcm9wcGVkLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4ge1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcbi1cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpO1xuIFx0ZW51bSB0dmFfdHlwZSB0dmFfZmxhZ3MgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFO1xuIFx0cG1kX3QgKnBtZDtcbiBcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XG4gXHRpbnQgaTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbi1cdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuLVx0c3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMO1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuK1x0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4rXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xuIFxuIFx0Vk1fQlVHX09OKHN0YXJ0X2FkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4gXG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0fTtcbitcbiBcdHJlc3VsdCA9IGZpbmRfcG1kX29yX3RocF9vcl9ub25lKG1tLCBzdGFydF9hZGRyLCBcdTAwMjZwbWQpO1xuIFx0aWYgKHJlc3VsdCAhPSBTQ0FOX1NVQ0NFRUQpIHtcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRiaXRtYXBfemVybyhjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXG4gXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cdTAwM2V2bV9mbGFncywgdHZhX2ZsYWdzKTtcbiBcbiBcdC8qXG4gXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2Vcbi1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuXG4rXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4rXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cbiBcdCAqL1xuIFx0aWYgKGVuYWJsZWRfb3JkZXJzICE9IEJJVChIUEFHRV9QTURfT1JERVIpKVxuLVx0XHRtYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbitcdFx0Y3R4Lm1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuIFxuIFx0cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBzdGFydF9hZGRyLCBcdTAwMjZwdGwpO1xuIFx0aWYgKCFwdGUpIHtcbkBAIC0xNjQ0LDg0ICsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFxuLVx0XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrbm9uZV9vcl96ZXJvIFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0aWYgKCsrdW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24ndCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsXG4tXHRcdFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXG4tXHRcdFx0ICogSGVyZSB3ZSBjYW4gYWxzbyBtYXJrIHRoZSBuZXcgaHVnZSBwbWQgYXNcbi1cdFx0XHQgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzXG4tXHRcdFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cbi1cdFx0XHQgKiB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxscyBvdXRzaWRlIG9mXG4tXHRcdFx0ICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuLVxuLVx0XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSB0cmVhdCBhIHNpbmdsZSBwYWdlIGFzIHNoYXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgVEhQXG4tXHRcdCAqIGlzIHNoYXJlZC5cbi1cdFx0ICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSArMTc4MSwyMiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0LypcbiBcdFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxuIFx0XHQgKlxuLVx0XHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcbi1cdFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFx1MDAzZSBmb2xpb19yZWZfY291bnQoKS5cbi1cdFx0ICogQnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlXG4tXHRcdCAqIGxhdGVyLiAgSG93ZXZlciBpdCBtYXkgcmVwb3J0IGZhbHNlIHBvc2l0aXZlIGlmIHRoZSBwYWdlXG4tXHRcdCAqIGhhcyBleGNlc3NpdmUgR1VQIHBpbnMgKGkuZS4gNTEyKS4gIEFueXdheSB0aGUgc2FtZSBjaGVja1xuLVx0XHQgKiB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuK1x0XHQgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmRcbitcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbitcdFx0ICogY2hlY2sgd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiBcdFx0ICovXG4gXHRcdGlmIChmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbykpIHtcbiBcdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfQ09VTlQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuIFx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0ICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuLVx0XHQgICAgKHVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbitcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODEsMTYgKzE4MDQsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gb3V0X3VubWFwOlxuIFx0cHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7XG4gXHRpZiAocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkge1xuLVx0XHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4rXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xuIFx0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdFx0cmVzdWx0ID0gbXRocF9jb2xsYXBzZShtbSwgc3RhcnRfYWRkciwgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbitcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4rXHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuIFxuQEAgLTI2OTEsOCArMjcxNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fZmlsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdHByZXNlbnQgPSAwO1xuIFx0c3dhcCA9IDA7XG4tXHRtZW1zZXQoY2MtXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXHUwMDNlbm9kZV9sb2FkKSk7XG4tXHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XG4gXHRcdGlmICh4YXNfcmV0cnkoXHUwMDI2eGFzLCBmb2xpbykpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDowOS4xODI0OTg2NDJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTY5NTYzNTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS9raHVnZXBhZ2VkLmNgLiBJdCBzZWVtcyB0aGV5J3ZlIHJlb3JnYW5pemVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5J3ZlIGNsZXZlcmx5IGV4dHJhY3RlZCB0aGlzIGxvZ2ljIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBHb29kIG1vdmUg4oCTIGtlZXBzIHRoaW5ncyBjbGVhbmVyIGFuZCBtb3JlIG1vZHVsYXIuIFRoZXkndmUgYWxzbyBpbnRyb2R1Y2VkIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBhcm91bmQuIFRoYXQgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhpcyBraW5kIG9mIGludHJpY2F0ZSBQVEUgbWFuaXB1bGF0aW9uLlxuXG5BbmQgYWgsIHRoZXJlJ3MgYSBuZXcgaGVscGVyLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuIFRoYXQncyBpbnRlcmVzdGluZywgcHJvYmFibHkgc2ltcGxpZmllcyBzb21lIGNoZWNrcy4gTm93LCB0aGUgbWVhdCBvZiBpdDogdGhleSd2ZSBzd2l0Y2hlZCBmcm9tIGBwYWdlID0gdm1fbm9ybWFsX3BhZ2UoKWAgdG8gYGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKClgIHdpdGhpbiB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGUoKWAgZnVuY3Rpb24uIFdhaXQgYSBzZWNvbmQuLi4gYHZtX25vcm1hbF9mb2xpbygpYD8gSSB0aG91Z2h0IHdlIHdlcmUgc3RpbGwgdXNpbmcgYHZtX25vcm1hbF9wYWdlKClgIGluIHNvbWUgcGxhY2VzLiBMZXQncyBtYWtlIHN1cmUgdGhhdCBmdW5jdGlvbiBhY3R1YWxseSAqZXhpc3RzKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFRpbWUgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgY29uZmlybS4gTGV0J3Mgc2VlIGlmIHRoaXMgaXMgdHJ1bHkgYSBzdHJhaWdodGZvcndhcmQgcmVmYWN0b3IsIG9yIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGVsc2UgZ29pbmcgb24gaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExNDUsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDoxNC4zNTIwNjQ4NTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5ODA4NzQ3MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9ub3JtYWxfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTcwMS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jPTE3NzA9c3RhdGljIGludCBjbGVhcl9yZWZzX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTgxNjpcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNy1cXHRcXHRpZiAoIWZvbGlvKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XFxuaW5jbHVkZS9saW51eC9tbS5oLTMyMDQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjMyMDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIwNi1cXHRcXHRcXHQgICAgIHB0ZV90IHB0ZSk7XFxuaW5jbHVkZS9saW51eC9tbS5oPTMyMDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMyMDgtXFx0XFx0XFx0ICAgICBwdGVfdCBwdGUpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMjA5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzIxMC1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgcG1kKTtcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo0MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy00MDYtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVxcdFxcdGdvdG8gb3V0O1xcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjUzLVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo2NTQ6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy02NTUtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjc2LVxcdFxcdFxcdGNvbnRpbnVlO1xcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVxcdFxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTc5NT1zdGF0aWMgaW50IGRhbW9zX3ZhX3N0YXRfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxcbm1tL2RhbW9uL3ZhZGRyLmM6ODE1OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtODE2LVxcbi0tXFxubW0vZGFtb24vdmFkZHIuYy04MzktXFxubW0vZGFtb24vdmFkZHIuYzo4NDA6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vZGFtb24vdmFkZHIuYy04NDEtXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXFxubW0vaHVnZV9tZW1vcnkuYzoyMzA4OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTI0NjUtXFx0aWYgKGlzX3ByZXNlbnQpXFxubW0vaHVnZV9tZW1vcnkuYzoyNDY2OlxcdFxcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcXG5tbS9odWdlX21lbW9yeS5jLTI0NjctXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03NzctXFxubW0va2h1Z2VwYWdlZC5jOjc3ODpcXHRjdHgtXFx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xcbm1tL2todWdlcGFnZWQuYy03NzktXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuLS1cXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbi0tXFxubW0va3NtLmMtNjM4LVxcdFxcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XFxubW0va3NtLmM6NjM5OlxcdFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlKTtcXG5tbS9rc20uYy02NDAtXFx0XFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xcbi0tXFxubW0vbWFkdmlzZS5jPTM1Mz1zdGF0aWMgaW50IG1hZHZpc2VfY29sZF9vcl9wYWdlb3V0X3B0ZV9yYW5nZShwbWRfdCAqcG1kLFxcbi0tXFxubW0vbWFkdmlzZS5jLTQ3NS1cXG5tbS9tYWR2aXNlLmM6NDc2OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21hZHZpc2UuYy00NzctXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tYWR2aXNlLmMtNzA0LVxcbm1tL21hZHZpc2UuYzo3MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWFkdmlzZS5jLTcwNi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbW9yeS5jPTgyND1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTgzMy0vKipcXG5tbS9tZW1vcnkuYzo4MzQ6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURVxcbm1tL21lbW9yeS5jLTgzNS0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXFxuLS1cXG5tbS9tZW1vcnkuYy04NDQtICovXFxubW0vbWVtb3J5LmM6ODQ1OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vbWVtb3J5LmMtODQ2LVxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuLS1cXG5tbS9tZW1vcnkuYz04Njg9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtODc3LS8qKlxcbm1tL21lbW9yeS5jOjg3ODogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbm1tL21lbW9yeS5jLTg3OS0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXFxuLS1cXG5tbS9tZW1vcnkuYy04ODgtICovXFxubW0vbWVtb3J5LmM6ODg5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9tZW1vcnkuYy04OTAtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcXG4tLVxcbm1tL21lbW9yeS5jPTYyODk9c3RhdGljIHZtX2ZhdWx0X3QgZG9fbnVtYV9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjMyNC1cXG5tbS9tZW1vcnkuYzo2MzI1OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVxcdTAwM2VhZGRyZXNzLCBwdGUpO1xcbm1tL21lbW9yeS5jLTYzMjYtXFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz02ODc9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyMy1cXHRcXHR9XFxubW0vbWVtcG9saWN5LmM6NzI0OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21lbXBvbGljeS5jLTcyNS1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyOS1cXHRcXHQvKlxcbm1tL21lbXBvbGljeS5jOjczMDpcXHRcXHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcXG5tbS9tZW1wb2xpY3kuYy03MzEtXFx0XFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxcbi0tXFxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWxvY2suYy0zODctXFx0XFx0XFx0Y29udGludWU7XFxubW0vbWxvY2suYzozODg6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWxvY2suYy0zODktXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tcmVtYXAuYy0xODktXFxubW0vbXJlbWFwLmM6MTkwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5tbS9tcmVtYXAuYy0xOTEtXFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTI5NC1cXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XFxubW0vdXNlcmZhdWx0ZmQuYy0xMjk2LVxcdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0xNTAxPXN0YXRpYyBsb25nIG1vdmVfcGFnZXNfcHRlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNjE3LVxcbm1tL3VzZXJmYXVsdGZkLmM6MTYxODpcXHRcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcXG5tbS91c2VyZmF1bHRmZC5jLTE2MTktXFx0XFx0XFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNDoxNS45NTAxNTk2MTRaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NTQyMTAzNTM5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFByb3Bvc2VkIEtIVUdFUEFHRUQgUmVmYWN0b3JpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaW52b2x2ZXMgYSBzdGFuZGFyZCBmdW5jdGlvbiwgYHZtX25vcm1hbF9mb2xpbygpYCwgd2hpY2gsIGlmIEkgcmVjYWxsIGNvcnJlY3RseSwgcmVzaWRlcyBpbiBgbW0vbWVtb3J5LmNgLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG9mIHRoaXMgY2hhbmdlIGxpZXMgaW4gcmVmYWN0b3JpbmcgYGtodWdlcGFnZWQuY2AuIFRoZSBnb2FsIGlzIHRvIGNvbnNvbGlkYXRlIFBURSAoUGFnZSBUYWJsZSBFbnRyeSkgY2hlY2tpbmcgbG9naWMsIHNwZWNpZmljYWxseSBiZXR3ZWVuIHRoZSBmdW5jdGlvbnMgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBBIG5ldyBmdW5jdGlvbiwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCwgaXMgYmVpbmcgaW50cm9kdWNlZC4gVGhpcyBpcyBpbnRlcmVzdGluZywgYXMgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHN0YXR1cywgb25lIG9mOiBgUFRFX0NIRUNLX1NVQ0NFRURgLCBgUFRFX0NIRUNLX0ZBSUxgLCBvciBgUFRFX0NIRUNLX0NPTlRJTlVFYCwgYXMgd2VsbCBhcyBhIGZ1bmN0aW9uLCBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAuXG5cblRoZSBpbXBsaWNhdGlvbnMgYXJlIGNsZWFyOiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0b3VjaGluZyBjcml0aWNhbCBrZXJuZWwgbG9naWMgd2l0aGluIGBtbS9raHVnZXBhZ2VkLmNgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMsIGlzIHRoaXMgZnVuY3Rpb25hbGl0eSBldmVuICpyZWFjaGFibGUqPyBZZXMsIG9mIGNvdXJzZS4gYGtodWdlcGFnZWRgIGlzIHRoZSBiYWNrYm9uZSBvZiBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIEl0J3MgdGhlIGJhY2tncm91bmQgZGFlbW9uIHRoYXQgYWN0aXZlbHkgc2NhbnMgbWVtb3J5IGFuZCBjb25zb2xpZGF0ZXMgc21hbGxlciBwYWdlcyBpbnRvIGh1Z2UgcGFnZXMuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IGEgY2FsbCB0byBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgY2FuIHJ1biBhdXRvbWF0aWNhbGx5IGlmIFRIUCBpcyBlbmFibGVkLiBJdCdzIHNhZmUgdG8gc2F5IHRoZXNlIGNoYW5nZXMgZGVmaW5pdGVseSBoYXZlIGEgZnVuY3Rpb25hbCBpbXBhY3QuIEkgbmVlZCB0byBkaXZlIGludG8gYGtodWdlcGFnZWQuY2AgaXRzZWxmLiBJIG5lZWQgdG8gaWRlbnRpZnkgd2hpY2ggZnVuY3Rpb25zIGFyZSBtb3N0IHJlbGV2YW50IHRvIG15IHJldmlldy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ0NzMsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MTEuMzcxMTk4MDMxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MjM5OTgwMTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2VfY2hlY2tfcHRlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz03MjM9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03MzAtLypcXG5tbS9raHVnZXBhZ2VkLmM6NzMxOiAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlXFxubW0va2h1Z2VwYWdlZC5jLTczMi0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTczOS0gKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxcbm1tL2todWdlcGFnZWQuYzo3NDA6ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuXFxubW0va2h1Z2VwYWdlZC5jLTc0MS0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc0NS0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6NzQ2OnN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG5tbS9raHVnZXBhZ2VkLmMtNzQ3LVxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9ODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODM0LVxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xcbm1tL2todWdlcGFnZWQuYzo4MzU6XFx0XFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXFx1MDAyNmN0eCk7XFxubW0va2h1Z2VwYWdlZC5jLTgzNi1cXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE3NDgtXFxubW0va2h1Z2VwYWdlZC5jOjE3NDk6XFx0XFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXFx1MDAyNmN0eCk7XFxubW0va2h1Z2VwYWdlZC5jLTE3NTAtXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjEyLjk5NTIwMjgyMloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0MTEyODQ2MzI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29yZSBMb2dpYyBDaGFuZ2VzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZXNlIG1vZGlmaWNhdGlvbnMuIExvb2tzIGxpa2UgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBoYXZlIHNlZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLiBUaGV5J3JlIG5vdyBlbXBsb3lpbmcgYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJJ2xsIGRlZmluaXRlbHkgd2FudCB0byBrZWVwIGEgY2xvc2UgZXllIG9uIGhvdyBgY29sbGFwc2VfY2hlY2tfcHRlYCBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aG9zZS4gXG5cbkknbGwgbmVlZCB0byByZW1lbWJlciB0byBpbmNsdWRlIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgIGluIG15IGBGb2N1c1N5bWJvbHNgIGxpc3Q7IHRoZXNlIGFyZSBjbGVhcmx5IGNlbnRyYWwgdG8gdGhlIHVwZGF0ZWQgYmVoYXZpb3IuIEhtbSwgd2FpdCBhIG1vbWVudOKApiBJIHNlZSBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaXMgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGF0IHRocm93cyBhIHBvdGVudGlhbCB3cmVuY2ggaW4gdGhlIHdvcmtzLiBJcyBpdCBpbmxpbmVkPyBJIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgdGhhdC4gSXQgY291bGQgYWZmZWN0IGhvdyBlYXNpbHkgSSBjYW4gdHJhY2UgaXRzIGV4ZWN1dGlvbiBmbG93IGFuZCB1bmRlcnN0YW5kIGl0cyBpbXBhY3QuIEFzaWRlIGZyb20gdGhvc2UsIHRoZSByZW1haW5pbmcgY2hhbmdlcyBzZWVtIHJlbGF0aXZlbHkgbWlub3Ig4oCTIHNvbWUgYWRqdXN0bWVudHMgdG8gYGNvbGxhcHNlX3NjYW5fZmlsZWAgZm9yIGluaXRpYWxpemF0aW9uLCBzb21lIHN0YXQgY291bnRpbmcgYWRkZWQgdG8gYGFsbG9jX2NoYXJnZV9mb2xpb2AsIGFuZCBqdXN0IGEgY29tbWVudCB1cGRhdGUgdG8gYF9fa2h1Z2VwYWdlZF9leGl0YC4gVGhlc2UgYXJlIG11Y2ggbGVzcyBjb25jZXJuaW5nLCBnaXZlbiB0aGUgY29yZSBsb2dpYyByZXNpZGVzIHdpdGhpbiB0aGUgYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGZ1bmN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU1NTgsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MjcuMTA4MDUxNDkxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MjkyMzM3NDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9NzQ2PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy04MTEtXFxubW0va2h1Z2VwYWdlZC5jOjgxMjpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2todWdlcGFnZWQuYy04MTMtXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTk2PXN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTAxMy1cXHQgKiBSZWxlYXNlIGJvdGggcmF3IGFuZCBjb21wb3VuZCBwYWdlcyBpc29sYXRlZFxcbm1tL2todWdlcGFnZWQuYzoxMDE0OlxcdCAqIGluIF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUuXFxubW0va2h1Z2VwYWdlZC5jLTEwMTUtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTM3Nj1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6MjguNTM3MjkzMjg0WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTA1MDgyODg4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6XG5cbioqQW5hbHl6aW5nIGBjb2xsYXBzZV9odWdlX3BhZ2VgIEZ1bmN0aW9uKipcblxuQWxyaWdodCwgbGV0J3Mgc2VlLi4uIGxvb2tpbmcgYXQgdGhpcyBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgZnVuY3Rpb24sIGl0J3MgZGVjbGFyZWQgYHN0YXRpY2AsIGFuZCBpdCdzIG9ubHkgY2FsbGVkIG9uY2UgaW4gYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEhtbSwgdGhhdCBtYWtlcyBtZSB0aGluayBpdCdzIHByb2JhYmx5IGJlZW4gaW5saW5lZCBieSB0aGUgY29tcGlsZXIuIE5vIHJlYWwgbmVlZCB0byBzcGVuZCBtdWNoIHRpbWUgb24gdGhhdCBvbmUuXG5cbk5vdywgYGNvbGxhcHNlX2h1Z2VfcGFnZWAgaXRzZWxmIGlzIGFsc28gYHN0YXRpY2AuIFRoYXQncyBpbnRlcmVzdGluZy4gSG93ZXZlciwgaXQncyBhICptdWNoKiBsYXJnZXIgZnVuY3Rpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlICp0aGF0KiBvbmUgaXMgYWN0dWFsbHkgZ2V0dGluZyBjYWxsZWQgZnJvbSB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBvZiBpdHMgcm9sZSBpbiB0aGUgc3lzdGVtLiBMZXQgbWUgY2hlY2sgdGhlIGNhbGwgc2l0ZXMgZm9yIGBjb2xsYXBzZV9odWdlX3BhZ2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjQxOCwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjMzLjU4ODEyNDMzN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ1OTc5MjI5MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9odWdlX3BhZ2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0PTk0PW1tYXBfbG9jayBpbiByZWFkIChvciB3cml0ZSkgbW9kZSB0byBiZSBzdXJlIGEgaHVnZSBwbWQgY2Fubm90IGJlXFxuRG9jdW1lbnRhdGlvbi9tbS90cmFuc2h1Z2UucnN0Ojk1OmNyZWF0ZWQgZnJvbSB1bmRlciB5b3UgYnkga2h1Z2VwYWdlZCAoa2h1Z2VwYWdlZCBjb2xsYXBzZV9odWdlX3BhZ2VcXG5Eb2N1bWVudGF0aW9uL21tL3RyYW5zaHVnZS5yc3QtOTYtdGFrZXMgdGhlIG1tYXBfbG9jayBpbiB3cml0ZSBtb2RlIGluIGFkZGl0aW9uIHRvIHRoZSBhbm9uX3ZtYSBsb2NrKS4gSWZcXG4tLVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9oYXNoX3BndGFibGUuYz0yNDU9cG1kX3QgaGFzaF9fcG1kcF9jb2xsYXBzZV9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jLTI3OS1cXHQgKiBoZW5jZSB3YWl0IGZvciBjb2xsYXBzZSB0byBjb21wbGV0ZS4gV2l0aG91dCB0aGlzXFxuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L2hhc2hfcGd0YWJsZS5jOjI4MDpcXHQgKiB0aGUgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weSBjYW4gcmVzdWx0IGluIGNvcHlpbmdcXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvaGFzaF9wZ3RhYmxlLmMtMjgxLVxcdCAqIHRoZSBvbGQgY29udGVudC5cXG4tLVxcbmFyY2gvcmlzY3YvbW0vcGd0YWJsZS5jPTEzOD1wbWRfdCBwbWRwX2NvbGxhcHNlX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuYXJjaC9yaXNjdi9tbS9wZ3RhYmxlLmMtMTQ5LVxcdCAqIGZvcm1zIHRoYXQgc3BlY2lmeSBhbiBhZGRyZXNzIG9ubHkgYXBwbHkgdG8gbGVhZiBQVEVzLCB3ZSBuZWVkIGFcXG5hcmNoL3Jpc2N2L21tL3BndGFibGUuYzoxNTA6XFx0ICogZ2xvYmFsIGZsdXNoIGhlcmUuICBjb2xsYXBzZV9odWdlX3BhZ2UoKSBhc3N1bWVzIHRoZXNlIGZsdXNoZXMgYXJlXFxuYXJjaC9yaXNjdi9tbS9wZ3RhYmxlLmMtMTUxLVxcdCAqIGVhZ2VyLCBzbyBqdXN0IGRvIHRoZSBmZW5jZSBoZXJlLlxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD01Nj1UUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC04OS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjkwOlRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZSxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTkxLVxcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0xMTYtXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0xMTgtXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTE0Ny1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjE0ODpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluLFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTQ5LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NzA2LVxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9wbWRcXFwiLCAweDEwIH0sXFxua2VybmVsL2JwZi9idGYuYzo2NzA3OlxcdHsgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXFxcIiwgMHgxIH0sXFxua2VybmVsL2JwZi9idGYuYy02NzA4LVxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9maWxlXFxcIiwgMHgxMCB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTc0Nj1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtODExLVxcbm1tL2todWdlcGFnZWQuYzo4MTI6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtODEzLVxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTkyMC1cXHRcXHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XFxubW0va2h1Z2VwYWdlZC5jOjkyMTpcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG5tbS9raHVnZXBhZ2VkLmMtOTIyLVxcdFxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05MjYtXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxubW0va2h1Z2VwYWdlZC5jOjkyNzpcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG5tbS9raHVnZXBhZ2VkLmMtOTI4LVxcdFxcdFxcdFxcdFxcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05MzEtXFxubW0va2h1Z2VwYWdlZC5jOjkzMjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X3N1Y2NlZWRlZChwdGVfdCAqcHRlLFxcbm1tL2todWdlcGFnZWQuYy05MzMtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy05OTUtXFxubW0va2h1Z2VwYWdlZC5jOjk5NjpzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxcbm1tL2todWdlcGFnZWQuYy05OTctXFx0XFx0cG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMTMtXFx0ICogUmVsZWFzZSBib3RoIHJhdyBhbmQgY29tcG91bmQgcGFnZXMgaXNvbGF0ZWRcXG5tbS9raHVnZXBhZ2VkLmM6MTAxNDpcXHQgKiBpbiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlLlxcbm1tL2todWdlcGFnZWQuYy0xMDE1LVxcdCAqL1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMTktLypcXG5tbS9raHVnZXBhZ2VkLmM6MTAyMDogKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5IC0gYXR0ZW1wdHMgdG8gY29weSBtZW1vcnkgY29udGVudHMgZnJvbSByYXdcXG5tbS9raHVnZXBhZ2VkLmMtMTAyMS0gKiBwYWdlcyB0byBhIGh1Z2VwYWdlLiBDbGVhbnMgdXAgdGhlIHJhdyBwYWdlcyBpZiBjb3B5aW5nIHN1Y2NlZWRzO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEwMzMtICovXFxubW0va2h1Z2VwYWdlZC5jOjEwMzQ6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weShwdGVfdCAqcHRlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL2todWdlcGFnZWQuYy0xMDM1LVxcdFxcdHBtZF90ICpwbWQsIHBtZF90IG9yaWdfcG1kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDYzLVxcdGlmIChsaWtlbHkocmVzdWx0ID09IFNDQU5fU1VDQ0VFRCkpXFxubW0va2h1Z2VwYWdlZC5jOjEwNjQ6XFx0XFx0X19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9zdWNjZWVkZWQocHRlLCB2bWEsIGFkZHJlc3MsIHB0bCxcXG5tbS9raHVnZXBhZ2VkLmMtMTA2NS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgb3JkZXIsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcXG5tbS9raHVnZXBhZ2VkLmMtMTA2Ni1cXHRlbHNlXFxubW0va2h1Z2VwYWdlZC5jOjEwNjc6XFx0XFx0X19jb2xsYXBzZV9odWdlX3BhZ2VfY29weV9mYWlsZWQocHRlLCBwbWQsIG9yaWdfcG1kLCB2bWEsXFxubW0va2h1Z2VwYWdlZC5jLTEwNjgtXFx0XFx0XFx0XFx0XFx0XFx0IG9yZGVyLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTI0Ny0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MTI0ODpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTEyNDktXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMzMzLW91dDpcXG5tbS9raHVnZXBhZ2VkLmM6MTMzNDpcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCByZXN1bHQsXFxubW0va2h1Z2VwYWdlZC5jLTEzMzUtXFx0XFx0XFx0XFx0XFx0ICAgb3JkZXIpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTEzMzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTM3MC0vKlxcbm1tL2todWdlcGFnZWQuYzoxMzcxOiAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXFxubW0va2h1Z2VwYWdlZC5jLTEzNzItICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTEzNzUtICovXFxubW0va2h1Z2VwYWdlZC5jOjEzNzY6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTEzNzctXFx0XFx0aW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MTctXFx0XFx0LypcXG5tbS9raHVnZXBhZ2VkLmM6MTQxODpcXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xcbm1tL2todWdlcGFnZWQuYy0xNDE5LVxcdFxcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE0MjEtXFx0XFx0ICovXFxubW0va2h1Z2VwYWdlZC5jOjE0MjI6XFx0XFx0cmVzdWx0ID0gX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCB2bWEsIHN0YXJ0X2FkZHIsIHBtZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTQyMy1cXHRcXHRcXHRcXHRcXHRcXHQgICAgIHJlZmVyZW5jZWQsIG9yZGVyKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNDc3LVxcdGlmIChwdGUpIHtcXG5tbS9raHVnZXBhZ2VkLmM6MTQ3ODpcXHRcXHRyZXN1bHQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgc3RhcnRfYWRkciwgcHRlLCBjYyxcXG5tbS9raHVnZXBhZ2VkLmMtMTQ3OS1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvcmRlciwgXFx1MDAyNmNvbXBvdW5kX3BhZ2VsaXN0KTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTA5LVxcbm1tL2todWdlcGFnZWQuYzoxNTEwOlxcdHJlc3VsdCA9IF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHkocHRlLCBmb2xpbywgcG1kLCBfcG1kLFxcbm1tL2todWdlcGFnZWQuYy0xNTExLVxcdFxcdFxcdFxcdFxcdCAgIHZtYSwgc3RhcnRfYWRkciwgcHRlX3B0bCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTU2LVxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxubW0va2h1Z2VwYWdlZC5jOjE1NTc6XFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlKG1tLCByZXN1bHQgPT0gU0NBTl9TVUNDRUVELCByZXN1bHQsIG9yZGVyKTtcXG5tbS9raHVnZXBhZ2VkLmMtMTU1OC1cXHRyZXR1cm4gcmVzdWx0O1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNjIwLVxcdFxcdFxcdGNvbGxhcHNlX2FkZHJlc3MgPSBhZGRyZXNzICsgb2Zmc2V0ICogUEFHRV9TSVpFO1xcbm1tL2todWdlcGFnZWQuYzoxNjIxOlxcdFxcdFxcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTYyMi1cXHRcXHRcXHRcXHRcXHRcXHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODA2LVxcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XFxubW0va2h1Z2VwYWdlZC5jOjE4MDc6XFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXFxubW0va2h1Z2VwYWdlZC5jLTE4MDgtXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjM1LjA0NzkyMjg4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyNzkyMjEwMTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipUcmFjaW5nIHRoZSBQYWdlIENvbGxhcHNlIE1lY2hhbmlzbSoqXG5cblJpZ2h0LCBzbyBgY29sbGFwc2VfaHVnZV9wYWdlYCBpcyB0aGUga2V5IGZ1bmN0aW9uIGhlcmUsIGJ1dCBpdCdzICpzdGF0aWMqIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byBpdC4gSXQncyBjYWxsZWQgYnkgYG10aHBfY29sbGFwc2VgLCB3aGljaCwgaW4gdHVybiwgaXMgdHJpZ2dlcmVkIGJ5IGBjb2xsYXBzZV9zY2FuX3BtZGAuIFNvLCB0aGUgY29sbGFwc2UgdWx0aW1hdGVseSBoYXBwZW5zIHRocm91Z2ggYSBjaGFpbiBvZiBmdW5jdGlvbiBjYWxscy4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBhbHNvIHN0YXRpYywgbWVhbmluZyBpdCdzIGNvbmZpbmVkIHRvIGl0cyBzb3VyY2UgZmlsZSBhbmQgbm90IGV4cG9zZWQgdG8gdGhlIG91dHNpZGUuIFRoYXQgbGVhdmVzIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCBhcyB0aGUgZW50cnkgcG9pbnQgdGhhdCdzIGFjY2Vzc2libGUuIFRoaXMgYGtodWdlcGFnZWRfc2Nhbl9wbWRgIGlzIHRoZSBsaWtlbHkgY2FuZGlkYXRlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB3aG9sZSBwYWdlIGNvbGxhcHNlIHByb2Nlc3MgaXMgaW5pdGlhdGVkLiBJIG5lZWQgdG8gZm9jdXMgbXkgaW52ZXN0aWdhdGlvbiBvbiB0aGF0IGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTQ0MCwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjQwLjMyNzE0NTk2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYyNjEwMDczLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cXHQvKiBodWdlX21lbW9yeSAqL1xcbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcXHR7IFxcXCJtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXFxcIiwgMHgxMCB9LFxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cXHR7IFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVxcXCIsIDB4MSB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgxNC1vdXQ6XFxubW0va2h1Z2VwYWdlZC5jOjE4MTU6XFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE4MTYtXFx0XFx0XFx0XFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjQxLjc4OTc2NDI2M1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5MzMxMzAwMjAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk5hdmlnYXRpbmcgdGhlIEtlcm5lbCdzIFBhZ2UgTWFuYWdlbWVudCoqXG5cbk9rYXksIHNvIEkgd2FzIGxvb2tpbmcgZm9yIGBraHVnZXBhZ2VkX3NjYW5fcG1kYCwgYnV0IHdhaXQgYSBtaW51dGXigKYgdGhhdCBmdW5jdGlvbiBkb2Vzbid0IHNlZW0gdG8gYmUgZGVmaW5lZC4gSG1tLCBJIG11c3QgaGF2ZSBnb3R0ZW4gdGhlIG5hbWUgd3JvbmcuIFJpZ2h0LCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGlzIGBjb2xsYXBzZV9zY2FuX3BtZGAuIFRoYXQgbWFrZXMgbXVjaCBtb3JlIHNlbnNlLiBOb3cgdGhhdCBJIGhhdmUgdGhlIGNvcnJlY3QgZnVuY3Rpb24gbmFtZSwgbGV0J3MgdHJhY2Ugd2hlcmUgYGNvbGxhcHNlX3NjYW5fcG1kYCBpcyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIHdpbGwgYmUgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0aGUgbGFyZ2VyIHBhZ2UgbWFuYWdlbWVudCBzY2hlbWUgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDA3NywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA1OjUxLjEyMTA2NzQzNloiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ5MjY2NjUxMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb2xsYXBzZV9zY2FuX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MTIyND1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTIzOC0gKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbm1tL2todWdlcGFnZWQuYzoxMjM5OiAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXFxubW0va2h1Z2VwYWdlZC5jLTEyNDAtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTYyPXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X29yZGVyX2Zyb21fb2Zmc2V0KHVuc2lnbmVkIGludCBvZmZzZXQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTU3MS0gKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcXG5tbS9raHVnZXBhZ2VkLmM6MTU3MjogKiBjb2xsYXBzZV9zY2FuX3BtZCgpIHRvIGRldGVybWluZSB3aGF0IHJlZ2lvbnMgYW5kIG1USFAgb3JkZXJzIGZpdCBiZXN0Llxcbm1tL2todWdlcGFnZWQuYy0xNTczLSAqXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTU4Nz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTE2ODgtXFxubW0va2h1Z2VwYWdlZC5jOjE2ODk6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTE2OTAtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcixcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODEyPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MjQtXFx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSkge1xcbm1tL2todWdlcGFnZWQuYzoyODI1OlxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0yODI2LVxcdFxcdGdvdG8gZW5kO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNTo1Mi42MTM3NDA2OTlaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDYwMzc5NTA2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgUE1EIENvbGxhcHNlIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIGBjb2xsYXBzZV9zY2FuX3BtZGAgaXMgYmVpbmcgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gVGhhdCdzIGEgY3J1Y2lhbCBsaW5rIHRvIHVuZGVyc3RhbmQuIFRvIHJlYWxseSBncmFzcCB3aGF0J3MgaGFwcGVuaW5nLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBjb2xsYXBzZV9zaW5nbGVfcG1kYCAqZG9lcyouIFNvLCBmaXJzdCB0aGluZ3MgZmlyc3QsIGxldCdzIGRpdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGNvbGxhcHNlX3NpbmdsZV9wbWRgLiBJJ2xsIHN0YXJ0IHRoZXJlIGFuZCBzZWUgd2hlcmUgaXQgbGVhZHMuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgb2Z0ZW4gdGhlIGtleSB0byB1bnJhdmVsaW5nIHRoZSBwdXJwb3NlIG9mIGFueSBjYWxsZWQgZnVuY3Rpb24uIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBuZWNlc3NhcnkgY29udGV4dCB0byBkZXRlcm1pbmUgaG93IGBjb2xsYXBzZV9zY2FuX3BtZGAgZml0cyBpbnRvIHRoZSBicm9hZGVyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzUzLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDU6NTcuMjE3NTM3Nzk2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDc0NjQwOTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NpbmdsZV9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTI3MDI9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MTEtICovXFxubW0va2h1Z2VwYWdlZC5jOjI4MTI6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTI4MTMtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODY5PXN0YXRpYyB2b2lkIGNvbGxhcHNlX3NjYW5fbW1fc2xvdCh1bnNpZ25lZCBpbnQgcHJvZ3Jlc3NfbWF4LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI5MzktXFxubW0va2h1Z2VwYWdlZC5jOjI5NDA6XFx0XFx0XFx0KnJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MsXFxubW0va2h1Z2VwYWdlZC5jLTI5NDEtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdm1hLCBcXHUwMDI2bG9ja19kcm9wcGVkLCBjYyk7XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MzIxMD1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjU4LVxcbm1tL2todWdlcGFnZWQuYzozMjU5OlxcdFxcdHJlc3VsdCA9IGNvbGxhcHNlX3NpbmdsZV9wbWQoYWRkciwgdm1hLCBcXHUwMDI2bW1hcF91bmxvY2tlZCwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0zMjYwLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNTo1OC42OTIxODMwMVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NzIwOTUzMzgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgVGhvdWdodHMgb24gYG1hZHZpc2VfY29sbGFwc2VgIGFuZCBSZWxhdGVkIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIGRpcmVjdCBBUEkgZW50cnkgcG9pbnQsIHNwZWNpZmljYWxseSBjYWxsZWQgd2hlbiB0aGUgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoYXQgbWFrZXMgaXQgYSBjcml0aWNhbCBwb2ludCBvZiBpbnRlcmVzdC4gSXQncyB0aGUgcGVyZmVjdCBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBBbHNvLCB0aGUgYGNvbGxhcHNlX3NjYW5fbW1fc2xvdGAgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAsIHdoaWNoIHNlZW1zIHRvIGJlIHRoZSBjb3JlIGxvb3Agd2l0aGluIGtodWdlcGFnZWQuIFRoaXMgaXMgZ29vZCB0byBrbm93LCBhbmQgSSBzaG91bGQgbWFrZSBzdXJlIHRvIGFkZCBgbWFkdmlzZV9jb2xsYXBzZWAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGRvbid0IG1pc3MgYW55dGhpbmcgdGhhdCBtYXkgYmUgb3Zlcmxvb2tlZC4gQXJlIHRoZXJlIGFueSBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgcHJvY2VzcyB0aGF0IEkgYW0gbm90IHNlZWluZz9cblxuTm93LCBsZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1hZHZpc2VfY29sbGFwc2VgJ3Mgc2lnbmF0dXJlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzIGJlZm9yZSBwcm9jZWVkaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTMxMSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjowNi40MTMxMzg4OTFaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NzY2MTMyMDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaW50IG1hZHZpc2VfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo1MTM6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTE0LVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxNy1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTczPWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ny1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3ODpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTc5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjA5LVxcbm1tL2todWdlcGFnZWQuYzozMjEwOmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjExLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz0yNTY9c3RhdGljIHZvaWQgZmlsbF9tZW1vcnkoaW50ICpwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNjktICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3MDpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjowNy45ODk3NTcyMzNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY4OTA1MjQ3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqVGhpbmtpbmcgQWJvdXQgTWVtb3J5IE1hbmFnZW1lbnQgYW5kIGBraHVnZXBhZ2VkYCoqXG5cbk9rYXksIHNvIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBhIG5vbi1zdGF0aWMgZnVuY3Rpb24g4oCTIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEkgdW5kZXJzdGFuZCBpdHMgcm9sZSBpbiBtZW1vcnkgY29sbGFwc2luZywgYnV0IGl0IGltbWVkaWF0ZWx5IG1ha2VzIG1lIGNvbnNpZGVyIHRoZSBiaWdnZXIgcGljdHVyZSwgcGFydGljdWxhcmx5IHRoZSBpbnRlcmFjdGlvbiB3aXRoIGBraHVnZXBhZ2VkYC4gV2UncmUgdGFsa2luZyBhYm91dCBodWdlcGFnZSBtYW5hZ2VtZW50IGFuZCB0aGUgcG90ZW50aWFsIGZvciBtZW1vcnkgZnJhZ21lbnRhdGlvbiBvciBpbmVmZmljaWVudCBhbGxvY2F0aW9uLiBTaW5jZSBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgcGFydCBvZiB0aGUgdG9vbCBzZXQgZm9yIGRlYWxpbmcgd2l0aCB0aGlzLCBpdCBtYWtlcyBtZSB0aGluayBhYm91dCBob3cgdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gaXRzZWxmIGlzICppbnZvbHZlZCogYW5kIGhvdyBpdHMgYmVoYXZpb3IgbWlnaHQgaW5mbHVlbmNlIHRoZSBlZmZpY2FjeSBvZiBgbWFkdmlzZV9jb2xsYXBzZWAuIFdoYXQgYXJlIHRoZSB0cmlnZ2VyaW5nIGNvbmRpdGlvbnMgZm9yIGBraHVnZXBhZ2VkYCB0byBzd2VlcCBpbiwgYW5kIGhvdyBkb2VzIGl0IGRlYWwgd2l0aCB0aGUgc2l0dWF0aW9uIHRoYXQgKm1hZHZpc2VfY29sbGFwc2UqIGlzIGRlc2lnbmVkIHRvIGFsbGV2aWF0ZT8gSXMgdGhlcmUgY29udGVudGlvbj8gQXJlIHRoZXJlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgaW4gdGhhdCBpbnRlcmFjdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQXJlIHRoZXJlIGtub2JzIEkgY2FuIHR1cm4gaW4gZWl0aGVyIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlPyBJIG5lZWQgdG8gdGhpbmsgdGhpcyB0aHJvdWdoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjIxMCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjEyLjY3ODgxMTgyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTExMDA1MjEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9tbV9zbG90XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2Nrc3RhdC5yc3Q9OTk9TG9vayBhdCB0aGUgY3VycmVudCBsb2NrIHN0YXRpc3RpY3M6Olxcbi0tXFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMTMtICAwOCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS1cXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3N0YXQucnN0OjExNDogIDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAyNm1tLVxcdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICAgMSAgICAgICAgICBbXFx1MDAzY2ZmZmZmZmZmODExNTAyYTdcXHUwMDNlXSBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCsweDU3LzB4MjgwXFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMTUtICAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgOTYgICAgICAgICAgW1xcdTAwM2NmZmZmZmZmZjgxNTM1MWM0XFx1MDAzZV0gX19kb19wYWdlX2ZhdWx0KzB4MWQ0LzB4NTEwXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdD0xMjA9UGVyIHZlZGVyZSBsZSBzdGF0aXN0aWNoZSBjb3JyZW50aSBzdWkgYmxvY2NoaTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdC0xMzQtICAwOCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2tzdGF0LnJzdDoxMzU6ICAwOSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9zZW0gICAgICAgICAgICAgIDEgICAgICAgICAgW1xcdTAwM2NmZmZmZmZmZjgxMTUwMmE3XFx1MDAzZV0ga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3QrMHg1Ny8weDI4MFxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3N0YXQucnN0LTEzNi0gIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAyNm1tLVxcdTAwM2VtbWFwX3NlbSAgICAgICAgICAgICA5NiAgICAgICAgICBbXFx1MDAzY2ZmZmZmZmZmODE1MzUxYzRcXHUwMDNlXSBfX2RvX3BhZ2VfZmF1bHQrMHgxZDQvMHg1MTBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MTQuMTg5ODIxMzQyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyMDUyNzMzMjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIE1pc3NpbmcgYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCoqXG5cbkhtbSwgdGhhdCdzIG9kZC4gSSB3YXMgZXhwZWN0aW5nIHRvIHNlZSBga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3RgIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSwgYnV0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyB0aHJvd2luZyBhbiBlcnJvci4gQSBxdWljayBjaGVjayByZXZlYWxzIGl0J3Mgbm93aGVyZSB0byBiZSBmb3VuZC4gT2theSwgdGltZSB0byBzdGVwIGJhY2sgYW5kIHJlLWV2YWx1YXRlIHRoZSBzZWFyY2ggc3RyYXRlZ3kuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIEknbSBsb29raW5nIGZvciBtYXkgaGF2ZSBiZWVuIHJlbmFtZWQsIG9yIGlzIGNhbGxlZCBpbmRpcmVjdGx5LiBMZXQncyB3aWRlbiB0aGUgbmV0LiBJJ2xsIGdyZXAgdGhlIGNvZGViYXNlIGZvciBhbnkgYW5kIGFsbCBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBIb3BlZnVsbHkgdGhpcyB3aWxsIHJldmVhbCB0aGUgZGVwZW5kZW5jeSB0cmVlIGFuZCBsZXQgbWUgemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eS4gR290dGEga2VlcCBkaWdnaW5nIGFuZCBob3BlZnVsbHkgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcHJlc2VudCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyODU5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MTkuMzk1MDk2NDYzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYxMzQ0NzgzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfdGhyZWFkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz02OD1lbnVtIHB0ZV9jaGVja19yZXN1bHQge1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc2LVxcbm1tL2todWdlcGFnZWQuYzo3NzpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpraHVnZXBhZ2VkX3RocmVhZCBfX3JlYWRfbW9zdGx5O1xcbm1tL2todWdlcGFnZWQuYy03OC1zdGF0aWMgREVGSU5FX01VVEVYKGtodWdlcGFnZWRfbXV0ZXgpO1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxMzk9aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNDItXFx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSkge1xcbm1tL2todWdlcGFnZWQuYzozMTQzOlxcdFxcdGlmICgha2h1Z2VwYWdlZF90aHJlYWQpIHtcXG5tbS9raHVnZXBhZ2VkLmMtMzE0NC1cXHRcXHRcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ld190aHJlYWQgPSBrdGhyZWFkX3J1bihraHVnZXBhZ2VkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNTItXFxubW0va2h1Z2VwYWdlZC5jOjMxNTM6XFx0XFx0XFx0a2h1Z2VwYWdlZF90aHJlYWQgPSBuZXdfdGhyZWFkO1xcbm1tL2todWdlcGFnZWQuYy0zMTU0LVxcdFxcdH1cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTU3LVxcdFxcdFxcdHdha2VfdXBfaW50ZXJydXB0aWJsZShcXHUwMDI2a2h1Z2VwYWdlZF93YWl0KTtcXG5tbS9raHVnZXBhZ2VkLmM6MzE1ODpcXHR9IGVsc2UgaWYgKGtodWdlcGFnZWRfdGhyZWFkKSB7XFxubW0va2h1Z2VwYWdlZC5jOjMxNTk6XFx0XFx0a3RocmVhZF9zdG9wKGtodWdlcGFnZWRfdGhyZWFkKTtcXG5tbS9raHVnZXBhZ2VkLmM6MzE2MDpcXHRcXHRraHVnZXBhZ2VkX3RocmVhZCA9IE5VTEw7XFxubW0va2h1Z2VwYWdlZC5jLTMxNjEtXFx0fVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxNjY9dm9pZCBraHVnZXBhZ2VkX21pbl9mcmVlX2tieXRlc191cGRhdGUodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTY4LVxcdGd1YXJkKG11dGV4KShcXHUwMDI2a2h1Z2VwYWdlZF9tdXRleCk7XFxubW0va2h1Z2VwYWdlZC5jOjMxNjk6XFx0aWYgKGh1Z2VwYWdlX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiBraHVnZXBhZ2VkX3RocmVhZClcXG5tbS9raHVnZXBhZ2VkLmMtMzE3MC1cXHRcXHRzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjIwLjg1NjQ0NTUyNloiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NjU5OTE0Mzc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKlVuZGVyc3RhbmRpbmcgdGhlIEtlcm5lbCdzIEh1Z2UgUGFnZSBNYW5hZ2VtZW50KipcblxuUmlnaHQsIGxldCdzIHNlZS4uLiB0aGUgdG9waWMgaGVyZSBpcyB0aGUga2VybmVsJ3MgaHVnZSBwYWdlIG1hbmFnZW1lbnQsIGFuZCBzcGVjaWZpY2FsbHksIHRoZSBga2h1Z2VwYWdlZGAgdGhyZWFkLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyB0aHJlYWQgaXMgdGhlIGhlYXJ0IG9mIHRoZSBhdXRvbWF0ZWQgaHVnZSBwYWdlIG1hbmFnZW1lbnQgcHJvY2Vzcy4gSXRzIGNvcmUgZnVuY3Rpb24gaXMgdG8gYW5hbHl6ZSB0aGUgbWVtb3J5IHVzYWdlIHBhdHRlcm5zIHdpdGhpbiB0aGUgc3lzdGVtIGFuZCBwcm9hY3RpdmVseSBhbGxvY2F0ZSBvciBkZWFsbG9jYXRlIGh1Z2UgcGFnZXMgKHR5cGljYWxseSAyTUIgb3IgMUdCLCBkZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgY29uZmlndXJhdGlvbikgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXG5cbk15IHRoaW5raW5nIHRoZW4gZ29lcyB0bzogd2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gY3JpdGVyaWEgdGhhdCBga2h1Z2VwYWdlZGAgaXMgdHJ5aW5nIHRvIGFjaGlldmU/IElzIGl0IHByaW1hcmlseSBmb2N1c2VkIG9uIG1pbmltaXppbmcgVExCIG1pc3Nlcz8gSXMgdGhlcmUgYSBkeW5hbWljIHRocmVzaG9sZCByZWxhdGVkIHRvIGZyYWdtZW50YXRpb24gb3Igb3ZlcmFsbCBtZW1vcnkgdXRpbGl6YXRpb24gdGhhdCB0cmlnZ2VycyB0aGVzZSBhbGxvY2F0aW9ucz8gSSBuZWVkIHRvIGNvbnNpZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLCBzdWNoIGFzIHRoZSBOVU1BIGJhbGFuY2luZyBjb2RlLCB0aGUgcGFnZSByZWNsYWltIGNvZGUsIGFuZCB0aGUgdHJhbnNwYXJlbnQgaHVnZSBwYWdlIChUSFApIG1lY2hhbmlzbS4gSSdtIHdvbmRlcmluZyBpZiBpdCdzIGFjdGl2ZWx5IHNlZWtpbmcgdG8gY29uc29saWRhdGUgc21hbGxlciBhbGxvY2F0aW9ucyBpbnRvIGxhcmdlciBUSFAtZWxpZ2libGUgcmVnaW9ucywgb3IgaWYgaXQgcHJpb3JpdGl6ZXMgc3BlY2lmaWMgcHJvY2Vzc2VzIGJhc2VkIG9uIHNvbWUgbWV0cmljcyBsaWtlIHdvcmtpbmcgc2V0IHNpemUgb3IgcGFnZSBmYXVsdCByYXRlLlxuXG5UaGlua2luZyBmdXJ0aGVyLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIGBraHVnZXBhZ2VkYCBhcmUgY3J1Y2lhbC4gSXMgaXQgZWZmaWNpZW50PyBIb3cgbXVjaCBvdmVyaGVhZCBkb2VzIGl0IGludHJvZHVjZSwgaW4gdGVybXMgb2YgQ1BVIGN5Y2xlcyBhbmQgbWVtb3J5IGJhbmR3aWR0aCBjb25zdW1wdGlvbj8gV2hhdCBhcmUgdGhlIHR1bmluZyBrbm9icyBhdmFpbGFibGU/IEkgbmVlZCB0byByZW1lbWJlciB0aGUgdmFyaW91cyBzeXNjdGwgcGFyYW1ldGVycywgc3VjaCBhcyBga2h1Z2VwYWdlZF9zY2FuX3BhZ2VzYCwgYGtodWdlcGFnZWRfYWxsb2NfcGFnZXNgLCBhbmQgdGhlIHJlbGF0ZWQgZmxhZ3MgdGhhdCBjb250cm9sIGl0cyBiZWhhdmlvciwgdG8gdW5kZXJzdGFuZCB0aGUgdHJhZGUtb2ZmcyBiZXR3ZWVuIHByb2FjdGl2ZSBhbGxvY2F0aW9uIGFuZCB0aGUgcmlzayBvZiBpbnRyb2R1Y2luZyBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbiBvciB3YXN0aW5nIHJlc291cmNlcy4gRmluYWxseSwgSSdtIGdvaW5nIHRvIGNvbnNpZGVyIGVkZ2UgY2FzZXM6IHdoYXQgaGFwcGVucyB3aGVuIHRoZSBzeXN0ZW0gaXMgdW5kZXIgZXh0cmVtZSBtZW1vcnkgcHJlc3N1cmUgb3Igd2hlbiBkZWFsaW5nIHdpdGggaGlnaGx5IGZyYWdtZW50ZWQgYWRkcmVzcyBzcGFjZXM/IEhvdyBkb2VzIGBraHVnZXBhZ2VkYCBncmFjZWZ1bGx5IGhhbmRsZSB0aG9zZSBzY2VuYXJpb3M/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjMyLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MjYuNTE2MzYzMzYxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg1NjA3MjExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0YXRpYyBpbnQga2h1Z2VwYWdlZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9Mjg2OT1zdGF0aWMgdm9pZCBjb2xsYXBzZV9zY2FuX21tX3Nsb3QodW5zaWduZWQgaW50IHByb2dyZXNzX21heCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0yOTg3LVxcbm1tL2todWdlcGFnZWQuYzoyOTg4OnN0YXRpYyBpbnQga2h1Z2VwYWdlZF9oYXNfd29yayh2b2lkKVxcbm1tL2todWdlcGFnZWQuYy0yOTg5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0yOTkyLVxcbm1tL2todWdlcGFnZWQuYzoyOTkzOnN0YXRpYyBpbnQga2h1Z2VwYWdlZF93YWl0X2V2ZW50KHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTI5OTQte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMwNDc9c3RhdGljIHZvaWQga2h1Z2VwYWdlZF93YWl0X3dvcmsodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMDY2LVxcbm1tL2todWdlcGFnZWQuYzozMDY3OnN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxcbm1tL2todWdlcGFnZWQuYy0zMDY4LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MjguMTAxOTc0OTE0WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjcwMTUyODE0NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgSHVnZSBQYWdlIENvbGxhcHNpbmcgTWVjaGFuaXNtKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBga2h1Z2VwYWdlZGAgdGhyZWFkLiBTZWVtcyBsaWtlIHRoZSBoZWFydCBvZiB0aGUgaHVnZSBwYWdlIG1hbmFnZW1lbnQuIFRoZSBwYXRjaCBJJ20gZXhhbWluaW5nIHR3ZWFrcyBgY29sbGFwc2VfY2hlY2tfcHRlYC4gVGhhdCdzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQncyBjYWxsZWQgYnkgYGNvbGxhcHNlX3NjYW5fcG1kYC4gYGNvbGxhcHNlX3NjYW5fcG1kYCBpdHNlbGYgaXMgY2FsbGVkIGJ5IGBjb2xsYXBzZV9zaW5nbGVfcG1kYC4gR290IGl0LiBgY29sbGFwc2Vfc2luZ2xlX3BtZGAgaXMgY2FsbGVkIGluIHR3byBwbGFjZXM6IHRocm91Z2ggdGhlIGBraHVnZXBhZ2VkYCBkYWVtb24gYW5kIHZpYSBgbWFkdmlzZV9jb2xsYXBzZWAuIEFoYSEgVGhhdCBgbWFkdmlzZV9jb2xsYXBzZWAgcGF0aCBsb29rcyBsaWtlIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLiBJdCdzIGEgZGlyZWN0IGVudHJ5IHBvaW50LCB3aGljaCBtYWtlcyBpdCBmYXIgbW9yZSBpbnRlcmVzdGluZy5cblxuQW5kIGBraHVnZXBhZ2VkYCBpdHNlbGYgaXMgYSBkZWNlbnQgZW50cnkgcG9pbnQgZm9yIGZ1enppbmcsIG9mIGNvdXJzZS5cblxuV2FpdCBhIHNlY29uZOKApiBgbWFkdmlzZV9jb2xsYXBzZWAgaXMgbm9uLXN0YXRpYy4gVGhhdCdzIGEgaHVnZSBhZHZhbnRhZ2UsIGEgZ29vZCB0YXJnZXQgdG8gc3RhcnQgd2l0aC4gTGV0IG1lIHNlZS4uLiBhcmUgdGhlcmUgYW55IG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHRoaXMgYXJlYSB0aGF0IG1pZ2h0IGJlIGV4cG9zZWQ/IEkgc2hvdWxkIGRvdWJsZS1jaGVjay5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQzMjIsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDY6MzUuMTE3MjU4NTYzWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQyNDc4NzA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1hZHZpc2VfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0PTM0Nj1BIGhpZ2hlciB2YWx1ZSBtYXkgaW5jcmVhc2UgbWVtb3J5IGZvb3RwcmludCBmb3Igc29tZSB3b3JrbG9hZHMuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QtMzUzLVxcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdDozNTQ6ICAgQ3VycmVudGx5LCBtYWR2aXNlX2NvbGxhcHNlIG9ubHkgc3VwcG9ydHMgY29sbGFwc2luZyB0byBQTUQtc2l6ZWQgVEhQc1xcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD01MTE9aW50IGh1Z2VwYWdlX21hZHZpc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3QgKnZtX2ZsYWdzLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cXHRcXHQgICAgIGludCBhZHZpY2UpO1xcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTQtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTcxMj1zdGF0aWMgaW5saW5lIGludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNzE3LVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjcxODpzdGF0aWMgaW5saW5lIGludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMxNzM9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTc3LVxcbm1tL2todWdlcGFnZWQuYzozMTc4OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXFxubW0va2h1Z2VwYWdlZC5jLTMxNzkte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMDktXFxubW0va2h1Z2VwYWdlZC5jOjMyMTA6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyOTctXFx0cmV0dXJuIHRocHMgPT0gKChoZW5kIC0gaHN0YXJ0KSBcXHUwMDNlXFx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxcbm1tL2todWdlcGFnZWQuYzozMjk4OlxcdFxcdFxcdDogbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhsYXN0X2ZhaWwpO1xcbm1tL2todWdlcGFnZWQuYy0zMjk5LX1cXG4tLVxcbm1tL21hZHZpc2UuYz0xMzM4PXN0YXRpYyBpbnQgbWFkdmlzZV92bWFfYmVoYXZpb3Ioc3RydWN0IG1hZHZpc2VfYmVoYXZpb3IgKm1hZHZfYmVoYXZpb3IpXFxuLS1cXG5tbS9tYWR2aXNlLmMtMTM2Mi1cXHRjYXNlIE1BRFZfQ09MTEFQU0U6XFxubW0vbWFkdmlzZS5jOjEzNjM6XFx0XFx0cmV0dXJuIG1hZHZpc2VfY29sbGFwc2Uodm1hLCByYW5nZS1cXHUwMDNlc3RhcnQsIHJhbmdlLVxcdTAwM2VlbmQsXFxubW0vbWFkdmlzZS5jLTEzNjQtXFx0XFx0XFx0XFx1MDAyNm1hZHZfYmVoYXZpb3ItXFx1MDAzZWxvY2tfZHJvcHBlZCk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjU2PXN0YXRpYyB2b2lkIGZpbGxfbWVtb3J5KGludCAqcCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjY5LSAqL1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoyNzA6c3RhdGljIGludCBtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjcxLXtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz0yODg9c3RhdGljIHZvaWQgKmFsbG9jX2hwYWdlKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMzAxLVxcdGtzZnRfcHJpbnRfbXNnKFxcXCJBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cXFwiKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MzAyOlxcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMzAzLVxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0NPTExBUFNFKVxcXCIpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTUzMj1zdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM2LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1Mzc6c3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTM4LVxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NjAtXFx0bWFkdmlzZShwLCBucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU2MTpcXHRyZXQgPSBtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIG5yX2hwYWdlcyAqIGhwYWdlX3BtZF9zaXplKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTYyLVxcdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTcxLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NzI6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3My1cXHRcXHRcXHQgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU3Ny1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgaHVnZSBwYWdlXFxcXG5cXFwiKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTc4OlxcdF9fbWFkdmlzZV9jb2xsYXBzZShtc2csIHAsIG5yX2hwYWdlcywgb3BzLCBleHBlY3QpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NzktfVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTcwMT1zdGF0aWMgc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgX19tYWR2aXNlX2NvbnRleHQgPSB7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjcwMjpcXHQuY29sbGFwc2UgPSBcXHUwMDI2bWFkdmlzZV9jb2xsYXBzZSxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNzAzLVxcdC5lbmZvcmNlX3B0ZV9zY2FuX2xpbWl0cyA9IGZhbHNlLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTExMDk9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTExNjYtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNjc6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMTY4LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3Ny1cXHQvKiBjLVxcdTAwM2Vjb2xsYXBzZSgpIHdpbGwgZmluZCBhIGh1Z2VwYWdlIGFuZCBjb21wbGFpbiAtIGNhbGwgZGlyZWN0bHkuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjExNzg6XFx0X19tYWR2aXNlX2NvbGxhcHNlKFxcXCJSZS1jb2xsYXBzZSBQTUQtbWFwcGVkIGh1Z2VwYWdlXFxcIiwgcCwgMSwgb3BzLCB0cnVlKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTE3OS1cXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEzNDQ9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTE0NjUtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0NjY6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxNDY3OlxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjE0Njg6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTQ2OTpcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xNDcwLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjozNi41NTk3NDMzNzdaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTU5ODYwNDYxMTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBDb2xsYXBzZSBFbnRyeSBQb2ludHMqKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIHRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0IGxvb2tpbmcuIGBtYWR2aXNlX2NvbGxhcHNlYCBzZWVtcyBsaWtlIGEgc29saWQgY2FuZGlkYXRlOyBpdCdzIG5vbi1zdGF0aWMsIHdoaWNoIGlzIGEga2V5IHJlcXVpcmVtZW50LiBIbW0sIEkga25vdyBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAgYWxyZWFkeTsgYmVzdCB0byBrZWVwIHRoYXQgb3V0IG9mIGNvbnNpZGVyYXRpb24gZm9yIG5vdy4gV2hhdCBhYm91dCBgbXRocF9jb2xsYXBzZWAsIGBjb2xsYXBzZV9odWdlX3BhZ2VgLCBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGFuZCBgY29sbGFwc2VfY2hlY2tfcHRlYD8gVGhvc2UgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb25zLCB1bmZvcnR1bmF0ZWx5LiBBbmQgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkYCBpcyBzdGF0aWMgaW5saW5lLCBzbyB0aGF0IGlzIG5vdCBhbiBvcHRpb24gZWl0aGVyLlxuXG5TbywgZnJvbSB3aGF0IEkndmUgc2VlbiwgYG1hZHZpc2VfY29sbGFwc2VgIHJlbWFpbnMgdGhlIG1vc3QgcHJvbWlzaW5nIG5vbi1zdGF0aWMgZW50cnkgcG9pbnQuIEkgZG8gcmVtZW1iZXIgdGhlIGBraHVnZXBhZ2VkYCB0aHJlYWQgZnVuY3Rpb24sIGJ1dCB0aGF0IGlzIGFsc28gc3RhdGljLiBIb3dldmVyLCB3YWl0IGEgbWludXRlLCBgc3RhcnRfc3RvcF9raHVnZXBhZ2VkYCBpcyBub24tc3RhdGljLiBJbnRlcmVzdGluZy4gVGhhdCB3YXJyYW50cyBhbm90aGVyIGxvb2suXG5cblRvIGJlIHRob3JvdWdoLCBsZXQncyB0YWtlIGEgZ2FuZGVyIGF0IGBtbS9raHVnZXBhZ2VkLmNgLiBJIG5lZWQgdG8gZW5zdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55IG90aGVyIGV4cG9ydGVkIG9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdpdGhpbiB0aGF0IGZpbGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2OTE0LCJPdXRwdXRUb2tlbnMiOjY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA2OjUyLjU0NTc5MjgxNFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU0MDg2NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXlthLXpBLVpfXVthLXpBLVowLTlfXSogW2EtekEtWl9dW2EtekEtWjAtOV9dKlxcXFwoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2todWdlcGFnZWQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9Nzc9c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1Z2VwYWdlZF90aHJlYWQgX19yZWFkX21vc3RseTtcXG5tbS9raHVnZXBhZ2VkLmM6Nzg6c3RhdGljIERFRklORV9NVVRFWChraHVnZXBhZ2VkX211dGV4KTtcXG5tbS9raHVnZXBhZ2VkLmMtNzktXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9OTA9c3RhdGljIHVuc2lnbmVkIGxvbmcga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmU7XFxubW0va2h1Z2VwYWdlZC5jOjkxOnN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2h1Z2VwYWdlZF9tbV9sb2NrKTtcXG5tbS9raHVnZXBhZ2VkLmM6OTI6c3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWdlcGFnZWRfd2FpdCk7XFxubW0va2h1Z2VwYWdlZC5jLTkzLS8qXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTAzPXN0YXRpYyB1bnNpZ25lZCBpbnQga2h1Z2VwYWdlZF9tYXhfcHRlc19zaGFyZWQgX19yZWFkX21vc3RseTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMDUtI2RlZmluZSBNTV9TTE9UU19IQVNIX0JJVFMgMTBcXG5tbS9raHVnZXBhZ2VkLmM6MTA2OnN0YXRpYyBERUZJTkVfUkVBRF9NT1NUTFlfSEFTSFRBQkxFKG1tX3Nsb3RzX2hhc2gsIE1NX1NMT1RTX0hBU0hfQklUUyk7XFxubW0va2h1Z2VwYWdlZC5jLTEwNy1cXG4tLVxcbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00NjktXFxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNDcxLVxcdFxcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NTQwPXN0YXRpYyBib29sIGh1Z2VwYWdlX2VuYWJsZWQodm9pZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy01NTctXFxubW0va2h1Z2VwYWdlZC5jOjU1ODp2b2lkIF9fa2h1Z2VwYWdlZF9lbnRlcihzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG5tbS9raHVnZXBhZ2VkLmMtNTU5LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz02MDg9c3RhdGljIGJvb2wgY29sbGFwc2VfcG9zc2libGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNjEzLVxcbm1tL2todWdlcGFnZWQuYzo2MTQ6dm9pZCBraHVnZXBhZ2VkX2VudGVyX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNjE1LVxcdFxcdFxcdCAgdm1fZmxhZ3NfdCB2bV9mbGFncylcXG4tLVxcbm1tL2todWdlcGFnZWQuYy02MjEtXFxubW0va2h1Z2VwYWdlZC5jOjYyMjp2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbm1tL2todWdlcGFnZWQuYy02MjMte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE4Nzk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjExNi0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjExNzp2b2lkIGNvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0va2h1Z2VwYWdlZC5jLTIxMTgtXFx0XFx0Ym9vbCBpbnN0YWxsX3BtZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMDY3PXN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMwODctXFxubW0va2h1Z2VwYWdlZC5jOjMwODg6dm9pZCBzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTMwODkte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxMzgtXFxubW0va2h1Z2VwYWdlZC5jOjMxMzk6aW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKVxcbm1tL2todWdlcGFnZWQuYy0zMTQwLXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMTY1LVxcbm1tL2todWdlcGFnZWQuYzozMTY2OnZvaWQga2h1Z2VwYWdlZF9taW5fZnJlZV9rYnl0ZXNfdXBkYXRlKHZvaWQpXFxubW0va2h1Z2VwYWdlZC5jLTMxNjcte1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMxNzItXFxubW0va2h1Z2VwYWdlZC5jOjMxNzM6Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcXG5tbS9raHVnZXBhZ2VkLmMtMzE3NC17XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MzE3OD1zdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyMDktXFxubW0va2h1Z2VwYWdlZC5jOjMyMTA6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxubW0va2h1Z2VwYWdlZC5jLTMyMTEtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNjo1Mi41OTEyMDQzMTRaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTQ4NjU3NzQyNzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgUmVsZXZhbnQgVEhQIEZ1bmN0aW9ucyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb3JlIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiB0cmFuc3BhcmVudCBodWdlIHBhZ2VzIChUSFApIG1hbmFnZW1lbnQsIHBhcnRpY3VsYXJseSB0aGUgb25lcyB0aGF0IHNlZW0gbW9zdCByZWxldmFudCB0byB0aGUgbW9kaWZpZWQgbG9naWMuIEkndmUgYmVlbiBnaXZlbiBhIGxpc3Qgb2Ygbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCBteSBleHBlcnQgaW50dWl0aW9uIGlzIGltbWVkaWF0ZWx5IGRyYXduIHRvIGEgZmV3IGtleSBwbGF5ZXJzLlxuXG5JJ20gc2VlaW5nOiBgaHVnZXBhZ2VfbWFkdmlzZWAsIGBfX2todWdlcGFnZWRfZW50ZXJgLCBga2h1Z2VwYWdlZF9lbnRlcl92bWFgLCBgX19raHVnZXBhZ2VkX2V4aXRgLCBgY29sbGFwc2VfcHRlX21hcHBlZF90aHBgLCBgc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlc2AsIGBzdGFydF9zdG9wX2todWdlcGFnZWRgLCBga2h1Z2VwYWdlZF9taW5fZnJlZV9rYnl0ZXNfdXBkYXRlYCwgYGN1cnJlbnRfaXNfa2h1Z2VwYWdlZGAsIGFuZCBgbWFkdmlzZV9jb2xsYXBzZWAuXG5cblJpZ2h0IGF3YXksIEkgemVybyBpbiBvbiBgbWFkdmlzZV9jb2xsYXBzZWAgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBhcyBsaWtlbHkgcG9pbnRzIG9mIGludGVyZXN0LiBBZnRlciBhIHF1aWNrIHNjYW4sIEkgcmVjYWxsIHRoYXQgYG1hZHZpc2VfY29sbGFwc2VgIGlzIHRoZSBvbmUgdGhhdCB1bHRpbWF0ZWx5IGNhbGxzIGBjb2xsYXBzZV9zaW5nbGVfcG1kYCwgd2hpY2ggaW4gdHVybiwgaGl0cyBgY29sbGFwc2Vfc2Nhbl9wbWRgLiBUaGlzIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBmdW5jdGlvbiBJJ20gbG9va2luZyBmb3IgLSBhIGZ1bmN0aW9uIHRoYXQgZGlyZWN0bHkgbWFuYWdlcyBwYWdlIHRhYmxlIGVudHJpZXMuIEV4Y2VsbGVudC4gSSdtIGdvaW5nIHRvIGluY2x1ZGUgYG1hZHZpc2VfY29sbGFwc2VgIGluIGBGb2N1c1N5bWJvbHNgLlxuXG5UaGUgYGtodWdlcGFnZWRgIGRhZW1vbiBpcyBhbHNvIGltbWVkaWF0ZWx5IGp1bXBpbmcgb3V0IGF0IG1lIGFzIGFub3RoZXIga2V5IHBhcnQgb2YgdGhpcyBvdmVyYWxsIFRIUCBzdG9yeS4gSXQncyBhIGJhY2tncm91bmQgdGhyZWFkLCBzbyBpdCBvcGVyYXRlcyBkaWZmZXJlbnRseSwgYnV0IGl0J3MgY2VudHJhbCB0byBtYW5hZ2luZyBUSFBzLlxuXG5Ob3csIGxldCdzIGdldCBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscy4gVGltZSB0byBjaGVjayB0aGUgYENPTkZJR19gIG9wdGlvbnMgbmVlZGVkLiBJIG5lZWQgdG8gbG9vayBpbnRvIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBmb3IgVEhQLiBJIGtub3cgdGhlIHNvdXJjZSBmaWxlIGlzIGBtbS9raHVnZXBhZ2VkLmNgLiBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBgbW0vTWFrZWZpbGVgIGFzIHdlbGwgdG8gc2VlIGhvdyB0aGlzIGFsbCBmaXRzIHRvZ2V0aGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODY0MCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3NiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzowNy40NTY5ODEzNzNaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Njg1NjQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSArPSBtaWdyYXRlX2RldmljZS5vXFxubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgKz0gaHVnZV9tZW1vcnkubyBraHVnZXBhZ2VkLm9cXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgKz0gcGFnZV9jb3VudGVyLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MDcuNTAyNjcxNDkzWiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQyNzQzMjczNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgdGhlIHN5c3RlbSBuZWVkcyBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYC4gVGhhdCdzIHRoZSBiYXNlbGluZS4gTm93LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhlIGNvZGUsIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZvciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiBUaGUgcGF0Y2ggbWVudGlvbnMgYG1USFBg4oCUbXVsdGktc2l6ZSBUSFAsIEkgYXNzdW1lLiBJIHdvbmRlciBpZiB0aGVyZSdzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIHRoYXQgYXMgd2VsbC4gQmVzdCB0byBnZXQgYSBmdWxsIHBpY3R1cmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbnZvbHZlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjk0NjAsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzoxMS43NzcwMDEwOTRaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTcxODA5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtVEhQXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjExLjgyMjk4MDc5NFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MzM2MjIxMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIHRoZSBLY29uZmlnIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZXMqKlxuXG5BbHJpZ2h0LCB0aGUgb2JqZWN0aXZlIGlzIHByZXR0eSBjbGVhci4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIGtub3cgdGhhdCBgbW0vS2NvbmZpZ2AgaXMgdGhlIGdvLXRvIHBsYWNlIGZvciBtZW1vcnkgbWFuYWdlbWVudCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBkZWZpbmVkIGFuZCBkb2N1bWVudGVkLiBTbywgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gY3JhY2sgb3BlbiB0aGF0IGZpbGUgYW5kIHN0YXJ0IGxvb2tpbmcuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgZGVmaW5pdGlvbiBmb3IgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCB0aGVyZS4gSSdsbCBiZSBsb29raW5nIGZvciBpdHMgZGVwZW5kZW5jaWVzLCBkZWZhdWx0IHNldHRpbmdzLCBhbmQgYW55IHJlbGV2YW50IGhlbHAgdGV4dCB0aGF0IGNsYXJpZmllcyBpdHMgcHVycG9zZSBhbmQgaW1wbGljYXRpb25zLiBJdCdzIHRpbWUgdG8gZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyBwbGFjZSBpbiB0aGUgYnJvYWRlciBtZW1vcnkgbWFuYWdlbWVudCBsYW5kc2NhcGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NjQ2LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MTYuMTU5MjA0MzI0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTM1MTYwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgzMT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMzLVxcbm1tL0tjb25maWc6ODM0Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzNS1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTI9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1Ny1cXG5tbS9LY29uZmlnOjg1ODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTktXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjQtXFxubW0vS2NvbmZpZzo4NjU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2Ni1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzMtXFxubW0vS2NvbmZpZzo4NzQ6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzUtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg4MT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODkwLVxcbm1tL0tjb25maWc6ODkxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTItXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwMC1cXG5tbS9LY29uZmlnOjkwMTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMi1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwOC1cXG5tbS9LY29uZmlnOjkwOTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTEwLVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTYtXFxubW0vS2NvbmZpZzo5MTc6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTgtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjY9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzNS1cXG5tbS9LY29uZmlnOjkzNjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM3LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDQtXFxubW0vS2NvbmZpZzo5NDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTItXFxubW0vS2NvbmZpZzo5NTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1NC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTYwLVxcbm1tL0tjb25maWc6OTYxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MTYuMjA0NTU5NTczWiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2MDQ1OTI2ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBUSFAgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGUgY29yZSBmb2N1cyBoZXJlIGlzIHRoZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGNvbmZpZywgdGhhdCdzIHRoZSBwcmltYXJ5IGRyaXZlci4gSSdtIHdvbmRlcmluZyBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHJlbGF0ZWQgY29uZmlncywgYnV0IEknbGwgYXNzdW1lIHRoaXMgaXMgdGhlIG1haW4gZW5hYmxlciBmb3Igbm93LiBUaGlzIHBhdGNoIG1vZGlmaWVzIGBtbS9raHVnZXBhZ2VkLmNgLCB3aGljaCB0ZWxscyBtZSB3ZSdyZSBkZWFsaW5nIGRpcmVjdGx5IHdpdGggdGhlIGNvcmUga2VybmVsIGxvZ2ljIHJlbGF0ZWQgdG8gVHJhbnNwYXJlbnQgSHVnZVBhZ2VzLiBHb29kLlxuXG5UaGUgbW9kaWZpY2F0aW9ucyBhcmUgZnVuY3Rpb25hbCwgYW5kIEkgY2FuIGNvbmZpcm0gdGhleSBhcmUgcmVhY2hhYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgY29kZS4gVGhleSd2ZSByZWZhY3RvcmVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMsIHNwbGl0dGluZyBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGhlbHBlciBmdW5jdGlvbi4gU21hcnQgbW92ZS4gVGhleSd2ZSBhbHNvIGludHJvZHVjZWQgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCwgd2hpY2ggaXMgYSBuZWF0IHdheSB0byBwYXNzIHRoZSByZXF1aXJlZCBzdGF0ZS4gQW5kIHRoZSBhZGRpdGlvbiBvZiB0aGUgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlciBzZWVtcyBsaWtlIGEgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHRoaXMgYXJlYS5cblxuVGhlIGNoYW5nZXMgYXJlIGNsZWFybHkgd2l0aGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLCBzbyB0aGlzIGlzIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkuIFRoaXMgY29kZSBpcyBleGVjdXRlZCBieSB0cmlnZ2VyaW5nIFRIUCBjb2xsYXBzZS4gVGhhdCBjYW4gYmUgZG9uZSBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB3aXRoIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYC4gR2l2ZW4gdGhlIGNyaXRpY2FsIG5hdHVyZSBvZiBUSFAsIGFuZCB0aGlzIHBhdGNoJ3MgaW52b2x2ZW1lbnQgaW4gUFRFIGhhbmRsaW5nLCBpdCdzIGNsZWFyIHRoaXMgaXMgYFdvcnRoRnV6emluZz10cnVlYC5cblxuTm93LCBJIG5lZWQgdG8gZGlnIGRlZXBlci4gSSB3YW50IHRvIGNoZWNrIGZvciBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyBpbiBgbW0va2h1Z2VwYWdlZC5jYCB0aGF0IGFyZSBhbHNvIG1vZGlmaWVkIG9yIHJlbGF0ZWQuIExldCdzIHNlZS4uLiBBaCwgYGh1Z2VwYWdlX21hZHZpc2VgIGxvb2tzIHJlbGV2YW50LCBhcyB3ZWxsLiBMZXQgbWUgdGFrZSBhIGxvb2sgYXQgaXQgaW4gYG1tL2todWdlcGFnZWQuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNjAwLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjkyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjI0LjgwOTE1NTMxNVoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNjc5NDk3MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJodWdlcGFnZV9tYWR2aXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ5OT1jaGFuZ2VfaHVnZV9wdWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTAtXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg6NTExOmludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTcwMj1zdGF0aWMgaW5saW5lIGJvb2wgdW5tYXBfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNzExLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjcxMjpzdGF0aWMgaW5saW5lIGludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxMy1cXHRcXHRcXHRcXHQgICB2bV9mbGFnc190ICp2bV9mbGFncywgaW50IGFkdmljZSlcXG4tLVxcbm1tL2todWdlcGFnZWQuYz00NTQ9c3RhdGljIHVuc2lnbmVkIGludCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00NjktXFxubW0va2h1Z2VwYWdlZC5jOjQ3MDppbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9raHVnZXBhZ2VkLmMtNDcxLVxcdFxcdCAgICAgdm1fZmxhZ3NfdCAqdm1fZmxhZ3MsIGludCBhZHZpY2UpXFxuLS1cXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTE0MTctXFx0Y2FzZSBNQURWX05PSFVHRVBBR0U6XFxubW0vbWFkdmlzZS5jOjE0MTg6XFx0XFx0ZXJyb3IgPSBodWdlcGFnZV9tYWR2aXNlKHZtYSwgXFx1MDAyNm5ld19mbGFncywgYmVoYXZpb3IpO1xcbm1tL21hZHZpc2UuYy0xNDE5LVxcdFxcdGlmIChlcnJvcilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MjYuMjQ1OTU1MTA5WiIsIlNlcSI6MzcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyNzY0NjM0MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wYWN0IG9mIHRoZSBQYXRjaCBvbiBUcmFuc3BhcmVudCBIdWdlUGFnZXMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBob3cgaXQgcmVsYXRlcyB0byBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBleGFtaW5lIGhvdyBgaHVnZXBhZ2VfbWFkdmlzZWAgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCBhcmUgaW52b2x2ZWQsIGFzIHRoZXkgYXJlIGRpcmVjdCBlbnRyeSBwb2ludHMgZm9yIHJlbGF0ZWQgYG1hZHZpc2VgIGNhbGxzLiBCb3RoIGBNQURWX0hVR0VQQUdFYCBhbmQgYE1BRFZfTk9IVUdFUEFHRWAgYXJlIGhhbmRsZWQgYnkgYGh1Z2VwYWdlX21hZHZpc2VgLCBhbmQgYE1BRFZfQ09MTEFQU0VgIGJ5IGBtYWR2aXNlX2NvbGxhcHNlYC4gSSdsbCB3YW50IHRvIGluY2x1ZGUgYm90aCBpbiBteSBhbmFseXNpcy5cblxuTm93LCBhIGNydWNpYWwgcXVlc3Rpb246IGlzIGBtYWR2aXNlX2NvbGxhcHNlYCBpdHNlbGYgZGlyZWN0bHkgbW9kaWZpZWQgYnkgdGhpcyBwYXRjaD8gTGV0IG1lIGRvdWJsZS1jaGVjay4uLiBubywgaXQgaXNuJ3QuIEhvd2V2ZXIsIGBtYWR2aXNlX2NvbGxhcHNlYCAqZG9lcyogY2FsbCBgY29sbGFwc2Vfc2luZ2xlX3BtZGAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGNvbGxhcHNlX3NjYW5fcG1kYC4gVGhlIHBhdGNoIGhhcyByZWZhY3RvcmVkIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgd2l0aGluIGBjb2xsYXBzZV9zY2FuX3BtZGAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLiBTbywgZnV6emluZyBgbWFkdmlzZV9jb2xsYXBzZWAgd2lsbCBkZWZpbml0ZWx5IHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlIGluZGlyZWN0bHkuIEkgYWxzbyBub3RlIHRoYXQgdGhlIHBhdGNoIGludHJvZHVjZXMgYSBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCBhbmQgYSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAgaGVscGVyLlxuXG5MZXQncyBub3QgZm9yZ2V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY3kuIEl0IHNlZW1zIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgdGhlIG9ubHkgcmVsZXZhbnQgY29uZmlnLlxuXG5GaW5hbGx5LCBJIHdhbnQgdG8gY29uZmlybSB0aGF0IGBtYWR2aXNlX2NvbGxhcHNlYCBhbmQgYGh1Z2VwYWdlX21hZHZpc2VgIGFyZW4ndCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpZGVseS4gQXMgZXhwZWN0ZWQsIGBtYWR2aXNlX2NvbGxhcHNlYCBpcyBleGNsdXNpdmVseSBjYWxsZWQgd2hlbiBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgaXMgdXNlZCwgYW5kIGBodWdlcGFnZV9tYWR2aXNlYCBpcyBpbnZva2VkIG9ubHkgd2hlbiBgbWFkdmlzZShNQURWX0hVR0VQQUdFKWAgb3IgYG1hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKWAgaXMgZXhlY3V0ZWQuIEV4Y2VsbGVudCwgdGhleSBhcmUgbm90LiBUaGF0IG1lYW5zIEkgY2FuIGZvY3VzIG15IGFuYWx5c2lzIG9uIHRoZW0gc3BlY2lmaWNhbGx5LlxuXG5JJ20gbm93IHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE3ODIsIk91dHB1dFRva2VucyI6MTkzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjM5LjAxMDU5MTQ5M1oiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MDcwNTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIixcbiAgICBcImh1Z2VwYWdlX21hZHZpc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBjaGVja2luZyBsb2dpYyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBpbnRyb2R1Y2VzIGEgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZSBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBoZWxwZXIuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYGZvbGlvX3B0ZV9yZWZlcmVuY2VkKClgIGhlbHBlci4gVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBjb3JlIGtlcm5lbCBsb2dpYywgc3BlY2lmaWNhbGx5IGluIHRoZSBUcmFuc3BhcmVudCBIdWdlUGFnZXMgKFRIUCkgc3Vic3lzdGVtLiBUaGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQgYnkgdHJpZ2dlcmluZyBUSFAgY29sbGFwc2UsIGVpdGhlciBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBga2h1Z2VwYWdlZGAgZGFlbW9uIG9yIG1hbnVhbGx5IHZpYSBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCIsXG4gICAgXCJodWdlcGFnZV9tYWR2aXNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBQVEUgY2hlY2tpbmcgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gaW50cm9kdWNlcyBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIHRvIHBhc3Mgc3RhdGUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgaGVscGVyLiBUaGUgcGF0Y2ggYWxzbyBhZGRzIGBmb2xpb19wdGVfcmVmZXJlbmNlZCgpYCBoZWxwZXIuIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgY29yZSBrZXJuZWwgbG9naWMsIHNwZWNpZmljYWxseSBpbiB0aGUgVHJhbnNwYXJlbnQgSHVnZVBhZ2VzIChUSFApIHN1YnN5c3RlbS4gVGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRyaWdnZXJpbmcgVEhQIGNvbGxhcHNlLCBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgYGtodWdlcGFnZWRgIGRhZW1vbiBvciBtYW51YWxseSB2aWEgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMVQxMzowNzozOS4wODc2NjczNDJaIiwiU2VxIjozOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNzM2MDcxMDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDc6MzkuMDg4MTM1OTkyWiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIxNzM1NTk5MjgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE4MTg2NjcwZGEyNjM0MGVhYTVkYjRiNTQzZDljMTgyZDM2MzVmNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxMSAxMzowNDowNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuaW5kZXggMTZmMzcxMzVlZDgwZC4uYjE4N2Q2MTg0NTJmNCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5AQCAtMjI0LDcgKzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxuIHRvIFwiYWx3YXlzXCIgb3IgXCJtYWR2aXNlXCIpLCBhbmQgaXQnbGwgYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biB3aGVuXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcbi10b3AtbGV2ZWwgY29udHJvbCBhcmUgXCJuZXZlclwiKVxuK3RvcC1sZXZlbCBjb250cm9sIGFyZSBcIm5ldmVyXCIpLlxuIFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBAIC0zMDEsNyArMzAxLDkgQEAgYmVpbmcgcmVwbGFjZWQgYnkgYSBQTUQgbWFwcGluZywgb3IgKDIpIHBoeXNpY2FsIHBhZ2VzIHJlcGxhY2VkIGJ5IG9uZVxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXG4gb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLlxuIEFzIHN1Y2gsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIHJvdWdobHkgYXMgYSBzaWduIG9mIHByb2dyZXNzLFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcbithbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxuK1Blci1vcmRlciBtVEhQIGNvbGxhcHNlIHN0YXRpc3RpY3MgYXJlIGFsc28gYXZhaWxhYmxlIHVuZGVyXG4rL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVx1MDAzY3NpemVcdTAwM2VrQi9zdGF0cy8pOjpcbiBcbiBcdC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkXG4gXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBiMjM3ZjZlNzY2MmE1Li4wYmE2MzdkZjljNDg0IDEwMDY0NFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcbkBAIC02NSw2ICs2NSwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbitlbnVtIHB0ZV9jaGVja19yZXN1bHQge1xuK1x0UFRFX0NIRUNLX1NVQ0NFRUQsXG4rXHRQVEVfQ0hFQ0tfRkFJTCxcbitcdFBURV9DSEVDS19DT05USU5VRSxcbit9O1xuK1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE5LDYgKzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XG4gXHRERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XG4gfTtcbiBcbitzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuK1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XG4rXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0aW50IG5vbmVfb3JfemVybztcbitcdGludCBzaGFyZWQ7XG4rXHRpbnQgdW5tYXBwZWQ7XG4rXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xuK307XG4rXG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0XHQvKlxuIFx0XHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XG4gXHRcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxuLVx0XHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcbitcdFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuIFx0XHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxuIFx0XHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXG4gXHRcdCAqL1xuQEAgLTYyOSw2ICs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuK3tcbitcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbitcdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbylcbiB7XG4gXHRub2RlX3N0YXRfbW9kX2ZvbGlvKGZvbGlvLFxuQEAgLTY2NSw3NiArNjkyLDE1NSBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBmb2xpb19wdGVfcmVmZXJlbmNlZCgpIC0gQ2hlY2sgaWYgYSBmb2xpbyBvciBpdHMgUFRFIG1hcHBpbmcgd2FzIHJlY2VudGx5IHVzZWRcbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiByZWNlbnQgYWNjZXNzIHdhcyBvYnNlcnZlZCB0aHJvdWdoIGVpdGhlciB0aGUgZm9saW8gc3RhdGVcbisgKiBvciB0aGUgY3VycmVudCBQVEUgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fcHRlX3JlZmVyZW5jZWQoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRldmFsKVxuK3tcbitcdC8qIFRoZSBmb2xpbyB3YXMgcmVmZXJlbmNlZCBwcmV2aW91c2x5IC4uLiAqL1xuK1x0aWYgKGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8IGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0LyogLi4uIG9yIHRoZSBQVEUgbWFwcGluZyB3YXMgcmVjZW50bHkgdXNlZCAqL1xuK1x0cmV0dXJuIHB0ZV95b3VuZyhwdGV2YWwpIHx8IG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvdW50X2NvbGxhcHNlX2V2ZW50KHVuc2lnbmVkIGludCBvcmRlciwgZW51bSB2bV9ldmVudF9pdGVtIHZtX2V2ZW50LFxuK1x0XHRlbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpXG4re1xuK1x0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4rXHRcdGNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTtcbitcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4rfVxuK1xuKy8qXG4rICogcHRlX2NoZWNrX2ZhaWwoKSAtIEEgc2ltcGxlIGhlbHBlciB0byBzZXQgdGhlIHB0ZV9jaGVja19jb250ZXh0IHJlc3VsdCBhbmRcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXG4rICovXG4rc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2tfZmFpbChzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCxcbitcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpXG4re1xuK1x0Y3R4LVx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcbitcdHJldHVybiBQVEVfQ0hFQ0tfRkFJTDtcbit9XG4rXG4rLypcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuKyAqXG4rICogQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6XG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbisgKiAtIHVmZmQgaXMgbm90IGFjdGl2ZVxuKyAqIC0gbGF6eWZyZWUgcHJvcGVydGllcyBhcmUgbm90IHByZXNlbnRcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4rICpcbisgKiBhIGhlbHBlciBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgaXMgdXNlZCB0byBwYXNzIGFuZCBzdG9yZSByZWxldmFudFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiBQVEVfQ0hFQ0tfU1VDQ0VFRCBpZiB0aGUgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbisgKiAgICAgICAgIFBURV9DSEVDS19DT05USU5VRSBpZiB0aGUgc2NhbiBzaG91bGQgY29udGludWUgdG8gY2hlY2sgdGhlIG5leHQgUFRFLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbitcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcbit7XG4rXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4rXHRcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQoY3R4LVx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsXG4rXHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4rXHRcdH1cbitcdFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcbitcdH1cbitcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuK1x0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbitcdFx0aWYgKCsrY3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuK1x0XHR9XG4rXHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHQvKlxuK1x0ICogRG9uJ3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmRcbitcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcbitcdCAqIGNvdWxkIGJyaW5nIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGVcbitcdCAqIHJlZ2lzdGVyZWQgcmFuZ2UuXG4rXHQgKi9cbitcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9VRkZEKTtcbitcbitcdGN0eC1cdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xuK1x0aWYgKHVubGlrZWx5KCFjdHgtXHUwMDNlZm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC1cdTAwM2Vmb2xpbykpKVxuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7XG4rXG4rXHQvKlxuK1x0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuK1x0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuK1x0ICovXG4rXHRpZiAoY3R4LVx1MDAzZWNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEoY3R4LVx1MDAzZXZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbitcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cdTAwM2Vmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcbitcbitcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbykpIHtcbitcdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcbitcdH1cbitcbitcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC1cdTAwM2Vmb2xpbykpIHtcbitcdFx0LypcbitcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbitcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4rXHRcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcbitcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuK1x0XHQgKi9cbitcdFx0aWYgKCsrY3R4LVx1MDAzZXNoYXJlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUsXG4rXHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gUFRFX0NIRUNLX1NVQ0NFRUQ7XG4rfVxuK1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuK1x0cHRlX3QgKl9wdGUsIHB0ZXZhbDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbiBcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBvcmRlcixcbitcdFx0LnVubWFwcGVkID0gLTEsIC8qIGRvbid0IGNoZWNrIHN3YXAgUFRFcyAqL1xuK1x0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuK1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlciksXG4rXHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgKyBucl9wYWdlcztcbiBcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xuLVx0XHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4rXHRcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFx1MDAyNmN0eCk7XG4rXHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7XG4rXHRcdFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogU2VlIGNvbGxhcHNlX3NjYW5fcG1kKCkuICovXG4tXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcbi1cdFx0XHQgKiBtVEhQIGNvbGxhcHNlcy4gQ3VycmVudGx5IGJyaW5naW5nIGluIG5ldyBwYWdlcyB2aWFcbi1cdFx0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4tXHRcdFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICgrK3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJ2QgYWN0dWFsbHlcbiBcdFx0ICogd2FudCB0byBjb2xsYXBzZS5cbkBAIC03NTksOCArODY1LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdFx0LypcbiBcdFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxuLVx0XHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbitcdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xuK1x0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xuQEAgLTc4Niw3ICs4OTIsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR9XG4gXG4gXHRcdC8qXG4tXHRcdCAqIElzb2xhdGUgdGhlIHBhZ2UgdG8gYXZvaWQgY29sbGFwc2luZyBhbiBodWdlcGFnZVxuK1x0XHQgKiBJc29sYXRlIHRoZSBmb2xpbyB0byBhdm9pZCBjb2xsYXBzaW5nIGEgaHVnZXBhZ2VcbiBcdFx0ICogY3VycmVudGx5IGluIHVzZSBieSB0aGUgVk0uXG4gXHRcdCAqL1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkge1xuQEAgLTgwMywxNCArOTA5LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuIFx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbitcdFx0ICAgIGZvbGlvX3B0ZV9yZWZlcmVuY2VkKGZvbGlvLCB2bWEsIGFkZHIsIHB0ZXZhbCkpXG4gXHRcdFx0cmVmZXJlbmNlZCsrO1xuIFx0fVxuIFxuQEAgLTgxOCwxMyArOTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG4tXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4rXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcbiBcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG5AQCAtOTA0LDcgKzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxuIFx0ICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGVcbiBcdCAqIGVudHJ5LiBSZXN0b3JpbmcgUE1EIG5lZWRzIHRvIGJlIGRvbmUgcHJpb3IgdG8gcmVsZWFzaW5nXG4gXHQgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSxcbi1cdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LlxuK1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgKzExNzgsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbFxuIFx0XHRyZXR1cm4gU0NBTl9WTUFfQ0hFQ0s7XG4gXHQvKlxuIFx0ICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuXG4tXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4rXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxuIFx0ICpcbi1cdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycyBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4rXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyArMTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiAvKlxuICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXG4tICogT25seSBkb25lIGlmIGtodWdlcGFnZWRfc2Nhbl9wbWQgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuICAqXG4gICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZVxuICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdFxuQEAgLTEyMDQsNyArMTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4rXHRcdCAqIGRvX3N3YXBfcGFnZSgpIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4gXHRcdCAqIE5vdGUgd2UgdHJlYXQgVk1fRkFVTFRfUkVUUlkgYXMgVk1fRkFVTFRfRVJST1IgaGVyZSBiZWNhdXNlXG4gXHRcdCAqIHdlIGRvIG5vdCByZXRyeSBoZXJlIGFuZCBzd2FwIGVudHJ5IHdpbGwgcmVtYWluIGluIHBhZ2V0YWJsZVxuIFx0XHQgKiByZXN1bHRpbmcgaW4gbGF0ZXIgZmFpbHVyZS5cbkBAIC0xMjQ3LDE1ICsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXHUwMDI2Y2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuIFx0aWYgKCFmb2xpbykge1xuIFx0XHQqZm9saW9wID0gTlVMTDtcbi1cdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4tXHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4rXHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuK1x0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiBcdFx0cmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7XG4gXHR9XG4gXG4tXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0Y291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DKTtcbi1cdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbitcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0MsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4gXG4gXHRpZiAodW5saWtlbHkobWVtX2Nncm91cF9jaGFyZ2UoZm9saW8sIG1tLCBnZnApKSkge1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuQEAgLTEyNzEsNyArMTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4rICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUgbG9jayB1bmxvY2tlZCwgdG8gYXZvaWQgaG9sZGluZyB0aGUgbW1hcF9sb2NrXG4gICogd2hpbGUgYWxsb2NhdGluZyBhIFRIUCwgYXMgdGhhdCBjb3VsZCB0cmlnZ2VyIGRpcmVjdCByZWNsYWltL2NvbXBhY3Rpb24uXG4gICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi5cbkBAIC0xMzE4LDcgKzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0aWYgKHVubWFwcGVkKSB7XG4gXHRcdC8qXG4tXHRcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuK1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICsxNDI4LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0LypcbiBcdCAqIFByZXZlbnQgYWxsIGFjY2VzcyB0byBwYWdldGFibGVzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuLVx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcHRlcF9jbGVhcl9mbHVzaCBhbmQgdGhlIFZNXG4tXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cbitcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4rXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgZm9saW8gbG9jay5cbiBcdCAqXG4gXHQgKiBVRkZESU9fTU9WRSBpcyBwcmV2ZW50ZWQgdG8gcmFjZSBhcyB3ZWxsIHRoYW5rcyB0byB0aGVcbiBcdCAqIG1tYXBfbG9jay5cbkBAIC0xMzg5LDkgKzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuK1x0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCgpIHdoZW4gZXN0YWJsaXNoaW5nXG4gXHRcdCAqIGh1Z2VwbWRzIGFuZCBuZXZlciBmb3IgZXN0YWJsaXNoaW5nIHJlZ3VsYXIgcG1kcyB0aGF0XG4tXHRcdCAqIHBvaW50cyB0byByZWd1bGFyIHBhZ2V0YWJsZXMuIFVzZSBwbWRfcG9wdWxhdGUgZm9yIHRoYXRcbitcdFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSgpIGZvciB0aGF0XG4gXHRcdCAqL1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRzcGluX3VubG9jayhwbWRfcHRsKTtcbkBAIC0xNDM5LDcgKzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbitcdFx0XHRcdFx0ICAvKnVmZmQ9Ki8gZmFsc2UpO1xuIFx0XHRpZiAocHRlX3B0bCAhPSBwbWRfcHRsKVxuIFx0XHRcdHNwaW5fdW5sb2NrKHB0ZV9wdGwpO1xuIFx0fVxuQEAgLTE0NDksMTAgKzE1NDYsMTAgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcbiBcbiBcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbiBvdXRfdXBfd3JpdGU6XG4tXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuLVx0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdGlmIChwdGUpXG4gXHRcdHB0ZV91bm1hcChwdGUpO1xuK1x0aWYgKGFub25fdm1hX2xvY2tlZClcbitcdFx0YW5vbl92bWFfdW5sb2NrX3dyaXRlKHZtYS1cdTAwM2Vhbm9uX3ZtYSk7XG4gXHRtbWFwX3dyaXRlX3VubG9jayhtbSk7XG4gb3V0X25vbG9jazpcbiBcdGlmIChmb2xpbylcbkBAIC0xNTkzLDQyICsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuIFx0XHRib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuLVx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XG4gXHRlbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLVx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XG4gXHRwbWRfdCAqcG1kO1xuIFx0cHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDtcbiBcdGludCBpO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuLVx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbitcdGludCByZWZlcmVuY2VkID0gMDtcbitcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycztcbiBcdHNwaW5sb2NrX3QgKnB0bDtcbi1cdGludCBub2RlID0gTlVNQV9OT19OT0RFLCB1bm1hcHBlZCA9IDA7XG4rXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbitcdHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBjdHggPSB7XG4rXHRcdC5jYyA9IGNjLFxuK1x0XHQudm1hID0gdm1hLFxuK1x0XHQub3JkZXIgPSBIUEFHRV9QTURfT1JERVIsXG4rXHRcdC5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLFxuK1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHR9O1xuK1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcysrO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGJpdG1hcF96ZXJvKGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbitcdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuIFRoZSBiaXRtYXBcbitcdCAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLlxuIFx0ICovXG4gXHRpZiAoZW5hYmxlZF9vcmRlcnMgIT0gQklUKEhQQUdFX1BNRF9PUkRFUikpXG4tXHRcdG1heF9wdGVzX25vbmUgPSBLSFVHRVBBR0VEX01BWF9QVEVTX0xJTUlUO1xuK1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgKzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gXHRcdGNjLVx1MDAzZXByb2dyZXNzKys7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKyt1bm1hcHBlZCBcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU1dBUF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3Bcbi1cdFx0XHQgKiBlbmFibGVkIHN3YXAgZW50cmllcy4gIFBsZWFzZSBzZWVcbi1cdFx0XHQgKiBjb21tZW50IGJlbG93IGZvciBwdGVfdWZmZCgpLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIERvbid0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcbi1cdFx0XHQgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi5cbi1cdFx0XHQgKiBIZXJlIHdlIGNhbiBhbHNvIG1hcmsgdGhlIG5ldyBodWdlIHBtZCBhc1xuLVx0XHRcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcbi1cdFx0XHQgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93blxuLVx0XHRcdCAqIHVzZXJmYXVsdCBtZXNzYWdlcyB0aGF0IGZhbGxzIG91dHNpZGUgb2Zcbi1cdFx0XHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0fVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbitcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbitcdFx0Zm9saW8gPSBjdHguZm9saW87XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcbitcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCsrc2hhcmVkIFx1MDAzZSBtYXhfcHRlc19zaGFyZWQpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0fVxuK1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbitcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0LyogU2V0IGJpdCBmb3Igb2NjdXBpZWQgcGFnZXMgKi9cbiBcdFx0X19zZXRfYml0KGksIGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzKTtcbkBAIC0xNzQ5LDMxICsxNzgxLDIyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHQvKlxuIFx0XHQgKiBDaGVjayBpZiB0aGUgcGFnZSBoYXMgYW55IEdVUCAob3Igb3RoZXIgZXh0ZXJuYWwpIHBpbnMuXG4gXHRcdCAqXG4tXHRcdCAqIEhlcmUgdGhlIGNoZWNrIG1heSBiZSByYWN5OlxuLVx0XHQgKiBpdCBtYXkgc2VlIGZvbGlvX21hcGNvdW50KCkgXHUwMDNlIGZvbGlvX3JlZl9jb3VudCgpLlxuLVx0XHQgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2Vcbi1cdFx0ICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2Vcbi1cdFx0ICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrXG4tXHRcdCAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4rXHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuK1x0XHQgKiB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UgbGF0ZXIuIEFueXdheSB0aGUgc2FtZVxuK1x0XHQgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LlxuIFx0XHQgKi9cbiBcdFx0aWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkge1xuIFx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXNcbi1cdFx0ICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2Vcbi1cdFx0ICovXG4gXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8XG4tXHRcdCAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fFxuLVx0XHQgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpKVxuK1x0XHQgICAgZm9saW9fcHRlX3JlZmVyZW5jZWQoZm9saW8sIHZtYSwgYWRkciwgcHRldmFsKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuK1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiArMTgwNCwxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBvdXRfdW5tYXA6XG4gXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcbiBcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XG4tXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbitcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuK1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbitcdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG4gXG5AQCAtMjY5MSw4ICsyNzE0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcbiBcdFx0aWYgKHhhc19yZXRyeShcdTAwMjZ4YXMsIGZvbGlvKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTExVDEzOjA3OjM5LjA4ODEzNjg2MloiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyMTczNTU3OTc5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBraHVnZXBhZ2VkIFJlZmFjdG9yaW5nIGZvciBLTVNBTiBSZWxldmFuY2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQncyByZWZhY3RvcmluZyB0aGUgUFRFIGNoZWNraW5nIGxvZ2ljIHdpdGhpbiBga2h1Z2VwYWdlZGAsIHNwZWNpZmljYWxseSBpbiBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBjZW50ZXJlZCBhcm91bmQgdGhlIGludHJvZHVjdGlvbiBvZiBhIGBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHRgIGFuZCBhIHJlZmFjdG9yaW5nIG9mIHRoZSBleGlzdGluZyBjb2RlIGludG8gaGVscGVyIGZ1bmN0aW9ucyBsaWtlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEFsc28sIHRoZXkgYXJlIGFkZGluZyBzb21lIG5ldyBmdW5jdGlvbnMgbGlrZSBgZm9saW9fcHRlX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBwdGVfY2hlY2tfZmFpbCgpYC4gVGhlIG1haW4gZ29hbCBzZWVtcyB0byBiZSB0byBpbXByb3ZlIHRoZSBjb2RlJ3Mgc3RydWN0dXJlLCBidXQgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgS01TQU4tZGV0ZWN0YWJsZSBpc3N1ZXMuXG5cbkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBwdGVfY2hlY2tfY29udGV4dGAgc3RydWN0OlxuXG5gYGBjXG5zdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQge1xuXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XG5cdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuXHR1bnNpZ25lZCBpbnQgb3JkZXI7XG5cdHN0cnVjdCBmb2xpbyAqZm9saW87XG5cdGludCBub25lX29yX3plcm87XG5cdGludCBzaGFyZWQ7XG5cdGludCB1bm1hcHBlZDtcblx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG5cdHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lO1xuXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDtcblx0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbn07XG5gYGBcblxuQWxyaWdodCwgSSBzZWUgaG93IGl0J3MgdXNlZCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWA6XG5cbmBgYGNcblx0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcblx0XHQuY2MgPSBjYyxcblx0XHQudm1hID0gdm1hLFxuXHRcdC5vcmRlciA9IG9yZGVyLFxuXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cblx0XHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpLFxuXHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcblx0fTtcbmBgYFxuXG5JbXBvcnRhbnQgcG9pbnQgaGVyZTogIGBjdHgubm9uZV9vcl96ZXJvYCBhbmQgYGN0eC5zaGFyZWRgIGFyZSAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBCdXQgd2FpdCwgSSdtIHByZXR0eSBzdXJlIGluIEMsIGlmIHlvdSBkb24ndCBpbml0aWFsaXplIGEgc3RydWN0IG1lbWJlciBpdCBnb2VzIHRvIHplcm8sIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIHJ1bGVzLiBRdWljayBjaGVjayBvbiB0aGUgQyBzdGFuZGFyZCBqdXN0IHRvIGJlIHN1cmU6IHllcCwgbWlzc2luZyBmaWVsZHMgaW4gYW4gaW5pdGlhbGl6ZXIgbGlzdCBhcmUgaW5pdGlhbGl6ZWQgYXMgaWYgdGhleSBoYWQgc3RhdGljIHN0b3JhZ2UgZHVyYXRpb24gKGkuZS4sIHplcm9lZCkuIFRoYXQgbWVhbnMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgcmVzdWx0YCwgYGZvbGlvYCwgYW5kIGBtYXhfcHRlc19zd2FwYCB3aWxsIGFsbCBiZSB6ZXJvLiAgTm8gcHJvYmxlbSB0aGVyZS4gIEknbGwgbmVlZCB0byBjaGVjayB0aGUgbG9naWMsIHRob3VnaCwgdG8gbWFrZSBzdXJlIHRoaXMgaXMgd2hhdCBpcyBleHBlY3RlZC5cblxuSSBhbHNvIGNoZWNrZWQgaG93IHRoaXMgc3RydWN0IGlzIHVzZWQgaW4gYGNvbGxhcHNlX3NjYW5fcG1kYCwgd2hlcmUgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBgcmVzdWx0YCBhcmUgc2ltaWxhcmx5IGxlZnQgdW5pbml0aWFsaXplZCBhbmQgdGh1cyB3aWxsIGJlIGltcGxpY2l0bHkgemVyb2VkLlxuXG5Pa2F5LCBsZXQncyBtYWtlIHN1cmUgbm90aGluZyBpcyB1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gIFRoZSBtYWluIHJpc2sgd291bGQgYmUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYmVpbmcgcmVhZCBhbmQgdXNlZCBpbiBsb2dpYyBvciBjb21wYXJpc29ucy5cblxuSSBjaGVja2VkIGBjdHgudW5tYXBwZWRgLCB3aGljaCBpcyBpbml0aWFsbHkgemVyby1pbml0aWFsaXplZCBpbiBtb3N0IGNhc2VzLCB0aGVuIHNldCB0byBgLTFgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYC4gTm93IGxldCdzIHNlZSB3aGVyZSB0aGF0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgaXQgaXMgdXNlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWRgOlxuXG5gYGBjXG5cdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuXHRcdCAgICghcmVmZXJlbmNlZCB8fFxuXHRcdCAgICAoY3R4LnVubWFwcGVkIFx1MDAyNlx1MDAyNiByZWZlcmVuY2VkIFx1MDAzYyBIUEFHRV9QTURfTlIgLyAyKSkpIHtcbmBgYFxuXG5Mb29rcyBsaWtlIGl0IGlzIGJlaW5nIHVzZWQgc2FmZWx5LiBJdCBpcyBpbmNyZW1lbnRlZCBsYXRlciBpbiBgY29sbGFwc2VfY2hlY2tfcHRlYDpcblxuYGBgY1xuXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcblx0XHRpZiAoY3R4LVx1MDAzZXVubWFwcGVkID09IC0xKVxuXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfTk9OX1BSRVNFTlQpO1xuXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbmBgYFxuXG5TbyBpdCBsb29rcyBsaWtlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uIChvciB0aGUgLTEgaW4gdGhlIG9uZSBjYXNlKSBpcyBkZWxpYmVyYXRlLiBHb29kLlxuXG5JJ20gYWxzbyBsb29raW5nIGF0IHRoZSBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpYCBmdW5jdGlvbi4gU2VlbXMgdGhpcyBpcyBiZWluZyByZXBsYWNlZCBpbiBhIHZlcnkgc3RyYWlnaHRmb3J3YXJkIHdheSwgc28gSSBkb24ndCBzZWUgYW55IGlzc3VlLlxuXG5Ob3csIGNoZWNraW5nIHRoZSBgLTFgIGluaXRpYWxpemF0aW9uIG9mIGB1bm1hcHBlZGAgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVgLCBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZXZpb3VzIGxvZ2ljIGFuZCBhcHBlYXJzIHNhZmUuXG5cblNvLCBpcyB0aGVyZSBhbnkgS01TQU4gcmlzaz8gSSBkb24ndCB0aGluayBzby4gVGhpcyBwYXRjaCBpcyBtb3N0bHkgYSAqcmVmYWN0b3JpbmcqIG9mIGBraHVnZXBhZ2VkYCdzIFBURSBzY2FubmluZy4gSXQncyBub3QgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCB1c2VyIHNwYWNlXG5cbiIsIklucHV0VG9rZW5zIjoxMTE0MiwiT3V0cHV0VG9rZW5zIjoyMDQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTFUMTM6MDg6MDAuODIzNzE4ODgzWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUwNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgdGhlIFBURSBzY2FubmluZyBsb2dpYyBpbiBga2h1Z2VwYWdlZGAgYnkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBhbmQgYSBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dGAgdG8gcGFzcyBzdGF0ZS4gVGhlIGNvbnRleHQgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIHVzaW5nIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IGFsbCB1bmxpc3RlZCBmaWVsZHMgKHN1Y2ggYXMgYG5vbmVfb3JfemVyb2AsIGBzaGFyZWRgLCBgdW5tYXBwZWRgLCBgZm9saW9gLCBhbmQgYHJlc3VsdGApIGFyZSBpbXBsaWNpdGx5IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIGFueSBzdHJ1Y3R1cmVzIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBsZWF2ZSBhbnkgdmFyaWFibGVzIHVuaW5pdGlhbGl6ZWQgdGhhdCBjb3VsZCBhZmZlY3QgY29udHJvbCBmbG93IG9yIGxlYWQgdG8gaW5mb3JtYXRpb24gbGVha3MuIEFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgbG9naWMgZXJyb3JzLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB3aGljaCBhcmUgYWRlcXVhdGVseSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgdGVzdGluZy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgUFRFIHNjYW5uaW5nIGxvZ2ljIGluIGBraHVnZXBhZ2VkYCBieSBpbnRyb2R1Y2luZyBhIGhlbHBlciBmdW5jdGlvbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGFuZCBhIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0YCB0byBwYXNzIHN0YXRlLiBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLCB3aGljaCBndWFyYW50ZWVzIHRoYXQgYWxsIHVubGlzdGVkIGZpZWxkcyAoc3VjaCBhcyBgbm9uZV9vcl96ZXJvYCwgYHNoYXJlZGAsIGB1bm1hcHBlZGAsIGBmb2xpb2AsIGFuZCBgcmVzdWx0YCkgYXJlIGltcGxpY2l0bHkgemVyby1pbml0aWFsaXplZCBieSB0aGUgY29tcGlsZXIuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2UgYW55IHN0cnVjdHVyZXMgY29waWVkIHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGxlYXZlIGFueSB2YXJpYWJsZXMgdW5pbml0aWFsaXplZCB0aGF0IGNvdWxkIGFmZmVjdCBjb250cm9sIGZsb3cgb3IgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBsb2dpYyBlcnJvcnMsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHdoaWNoIGFyZSBhZGVxdWF0ZWx5IGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCB0ZXN0aW5nLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgcmVxdWlyZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowz5fkg[1] Phase: Succeeded StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 13:08:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 13:08:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2] Phase: Succeeded StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 13:08:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-11 13:08:13 +0000 UTC FinishedAt: 2026-08-11 13:08:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowz5fkg/series-workflowz5fkg-convert-artifact-3296986525/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-11 13:08:23 +0000 UTC FinishedAt: 2026-08-11 13:24:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-11 13:08:23 +0000 UTC FinishedAt: 2026-08-11 13:24:54 +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:*f790f372-1f18-4887-8f53-914a91b98f53,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-workflowz5fkg/series-workflowz5fkg-convert-artifact-3296986525/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": "571d1277-a0a3-480b-9b92-5363ba9d3117", "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-workflowz5fkg/series-workflowz5fkg-build-action-3308811987/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-11 13:08:23 +0000 UTC FinishedAt: 2026-08-11 13:24:44 +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:*f790f372-1f18-4887-8f53-914a91b98f53,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-workflowz5fkg/series-workflowz5fkg-convert-artifact-3296986525/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": "571d1277-a0a3-480b-9b92-5363ba9d3117", "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-workflowz5fkg/series-workflowz5fkg-build-action-3308811987/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-11 13:24:54 +0000 UTC FinishedAt: 2026-08-11 13:24:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-11 13:24:54 +0000 UTC FinishedAt: 2026-08-11 13:24:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-11 13:24:54 +0000 UTC FinishedAt: 2026-08-11 13:25:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-11 13:24:54 +0000 UTC FinishedAt: 2026-08-11 13:24:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowz5fkg/series-workflowz5fkg-convert-artifact-1028112504/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-11 13:25:04 +0000 UTC FinishedAt: 2026-08-11 13:27:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-11 13:25:04 +0000 UTC FinishedAt: 2026-08-11 13:27:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*571d1277-a0a3-480b-9b92-5363ba9d3117,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-workflowz5fkg/series-workflowz5fkg-build-action-3308811987/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-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-11 13:27:21 +0000 UTC FinishedAt: 2026-08-11 13:27:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-11 13:27:21 +0000 UTC FinishedAt: 2026-08-11 13:27:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-11 13:27:21 +0000 UTC FinishedAt: 2026-08-11 13:43:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-11 13:27:21 +0000 UTC FinishedAt: 2026-08-11 13:43:43 +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:*f790f372-1f18-4887-8f53-914a91b98f53,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-workflowz5fkg/series-workflowz5fkg-convert-artifact-1028112504/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": "084853ca-c2d6-4ac7-95a0-47830c0b08ff", "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-workflowz5fkg/series-workflowz5fkg-build-action-3337708900/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-11 13:27:21 +0000 UTC FinishedAt: 2026-08-11 13:43:33 +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:*f790f372-1f18-4887-8f53-914a91b98f53,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-workflowz5fkg/series-workflowz5fkg-convert-artifact-1028112504/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": "084853ca-c2d6-4ac7-95a0-47830c0b08ff", "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-workflowz5fkg/series-workflowz5fkg-build-action-3337708900/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-11 13:43:43 +0000 UTC FinishedAt: 2026-08-11 13:43:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-11 13:43:43 +0000 UTC FinishedAt: 2026-08-11 13:43:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-11 13:43:43 +0000 UTC FinishedAt: 2026-08-11 13:45:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-11 13:43:43 +0000 UTC FinishedAt: 2026-08-11 13:45:24 +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:*084853ca-c2d6-4ac7-95a0-47830c0b08ff,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-workflowz5fkg/series-workflowz5fkg-build-action-3337708900/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-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +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":["madvise_collapse","hugepage_madvise"],"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:*571d1277-a0a3-480b-9b92-5363ba9d3117,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*084853ca-c2d6-4ac7-95a0-47830c0b08ff,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-workflowz5fkg/series-workflowz5fkg-build-action-3308811987/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-workflowz5fkg/series-workflowz5fkg-build-action-3337708900/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 13:45:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 13:45:38 +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":["madvise_collapse","hugepage_madvise"],"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-workflowz5fkg/series-workflowz5fkg-convert-artifact-2140083665/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 13:45:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 13:45:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-11 13:45:33 +0000 UTC FinishedAt: 2026-08-11 13:45:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-11 13:45:43 +0000 UTC FinishedAt: 2026-08-11 16:48:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowz5fkg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse","hugepage_madvise"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"005d5c898c17ecadec427819a20640e37c357997","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE"],"series_id":"13d7292c-6e76-4e1c-b00d-700ba9e0fed5","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-11 13:45:43 +0000 UTC FinishedAt: 2026-08-11 16:48:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*571d1277-a0a3-480b-9b92-5363ba9d3117,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*084853ca-c2d6-4ac7-95a0-47830c0b08ff,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-workflowz5fkg/series-workflowz5fkg-build-action-3308811987/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-workflowz5fkg/series-workflowz5fkg-build-action-3337708900/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-workflowz5fkg/series-workflowz5fkg-convert-artifact-2140083665/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,}