Name: series-workflowml2k8 Phase: Succeeded StartedAt: 2026-09-09 06:36:49 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[0] Phase: Succeeded StartedAt: 2026-09-09 06:36:49 +0000 UTC FinishedAt: 2026-09-09 07:00:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[0].run-triage Phase: Succeeded StartedAt: 2026-09-09 06:36:49 +0000 UTC FinishedAt: 2026-09-09 07:00:50 +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": "ba9572bc43d04d71ba52ae7f20645f1eafe86875", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SHMEM", "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": "ba9572bc43d04d71ba52ae7f20645f1eafe86875", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SHMEM", "TRANSPARENT_HUGEPAGE" ], "series_id": "5ec407be-c4b7-489c-b9af-9127f439c9d3" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "truncate_inode_partial_folio", "shmem_undo_range", "truncate_inode_pages_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NITUVNJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtzaG1lbV91bmRvX3JhbmdlJiMzNDssCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXG5cbkFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXJzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgKGBtaW5fbnJieXRlc2AsIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGBmb2xpbzJgLCBgKnBzdGFydGAsIGAqcGVuZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBjYWxsZXIgdmFyaWFibGVzIChgc3RhcnRgLCBgZW5kYCkgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBidWdzIGluIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiwgZm9saW8gc3BsaXR0aW5nLCBvciByZWZlcmVuY2UgY291bnRpbmcgd291bGQgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBsb2NraW5nLCBvciBwYWdlIHN0YXRlIGludmFsaWRhdGlvbiwgd2hpY2ggYXJlIGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgcGFnZSBjYWNoZSBhc3NlcnRpb25zIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS90cnVuY2F0ZS5jIGFuZCBtbS9zaG1lbS5jIGZvciBoYW5kbGluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyB3aGVuIHRydW5jYXRpbmcgcGFnZWNhY2hlIGFuZCBzaG1lbSByYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgdHJ1bmNhdGlvbiBhbmQgaG9sZS1wdW5jaGluZyBzeXNjYWxscyAoZS5nLiwgdHJ1bmNhdGUsIGZ0cnVuY2F0ZSwgZmFsbG9jYXRlKSBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBmb2xpbyBzcGxpdHRpbmcgYW5kIGluZGV4IGJvdW5kYXJ5IGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZDgwMzBhNDFlMGIwYjY4NjdhNGIzZWMyMjNjMTY3OTkxNWNiNjc3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNjI3LDggJiM0Mzs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXG4gdW5zaWduZWQgZmluZF9nZXRfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXG4gXHRcdHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgZm9saW9fYmF0Y2ggKmZiYXRjaCwgcGdvZmZfdCAqaW5kaWNlcyk7XG4gaW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LFxuLVx0XHRsb2ZmX3QgZW5kKTtcbiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4mIzQzO1x0XHRsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKTtcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0cGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7XG5kaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmNcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XG4tLS0gYS9tbS9zaG1lbS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zaG1lbS5jXG5AQCAtMTE3NSwxMSAmIzQzOzExNzUsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFx0aWYgKGZvbGlvKSB7XG4gXHRcdHNhbWVfZm9saW8gPSBsZW5kIFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XG4gXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbi1cdFx0XHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuLVx0XHRcdGlmIChzYW1lX2ZvbGlvKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4tXHRcdH1cbiYjNDM7XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHNhbWVfZm9saW8gPyBcdTAwMjZlbmQgOiBOVUxMKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0Zm9saW8gPSBOVUxMO1xuQEAgLTExODksOCAmIzQzOzExODYsNyBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFx0XHRmb2xpbyA9IHNobWVtX2dldF9wYXJ0aWFsX2ZvbGlvKGlub2RlLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbiBcdGlmIChmb2xpbykge1xuIFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuJiM0MztcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0fVxuQEAgLTEyNTgsNyAmIzQzOzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFxuIFx0XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuIFx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbiYjNDM7XHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sXG4mIzQzO1x0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuIFx0XHRcdFx0XHQvKlxuIFx0XHRcdFx0XHQgKiBJZiB3ZSBzcGxpdCBhIHBhZ2UsIHJlc2V0IHRoZSBsb29wIHNvXG4gXHRcdFx0XHRcdCAqIHRoYXQgd2UgcGljayB1cCB0aGUgbmV3IHN1YiBwYWdlcy5cbmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuY1xuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcbi0tLSBhL21tL3RydW5jYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3RydW5jYXRlLmNcbkBAIC0yMDYsMzUgJiM0MzsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXG4gLypcbiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGVcbiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZVxuLSAqIGZvbGlvIHRoYXQmIzM5O3Mgd2l0aGluIHRoZSBbc3RhcnQsIGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuJiM0MzsgKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuICAqIGl0JiMzOTtzIGxhcmdlLiAgc3BsaXRfcGFnZV9yYW5nZSgpIHdpbGwgZGlzY2FyZCBwYWdlcyB3aGljaCBub3cgbGllIGJleW9uZFxuICAqIGlfc2l6ZSwgYW5kIHdlIHJlbHkgb24gdGhlIGNhbGxlciB0byBkaXNjYXJkIHBhZ2VzIHdoaWNoIGxpZSB3aXRoaW4gYVxuICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS5cbiAgKlxuLSAqIFJldHVybnMgZmFsc2UgaWYgc3BsaXR0aW5nIGZhaWxlZCBzbyB0aGUgY2FsbGVyIGNhbiBhdm9pZFxuLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuXG4mIzQzOyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcbiYjNDM7ICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4mIzQzOyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmVcbiYjNDM7ICogdG8gZGlzY2FyZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuXG4gICovXG4tYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcbiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4mIzQzO1x0XHRcdFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxuIHtcbiBcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xuIFx0c2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDtcbiBcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xuIFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbiBcbi1cdGlmIChwb3MgXHUwMDNjIHN0YXJ0KVxuLVx0XHRvZmZzZXQgPSBzdGFydCAtIHBvcztcbiYjNDM7XHRpZiAocG9zIFx1MDAzYyBsc3RhcnQpXG4mIzQzO1x0XHRvZmZzZXQgPSBsc3RhcnQgLSBwb3M7XG4gXHRlbHNlXG4gXHRcdG9mZnNldCA9IDA7XG4tXHRpZiAocG9zICYjNDM7IHNpemUgXHUwMDNjPSAodTY0KWVuZClcbiYjNDM7XHRpZiAocG9zICYjNDM7IHNpemUgXHUwMDNjPSAodTY0KWxlbmQpXG4gXHRcdGxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7XG4gXHRlbHNlXG4tXHRcdGxlbmd0aCA9IGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0O1xuJiM0MztcdFx0bGVuZ3RoID0gbGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0O1xuIFxuIFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xuIFx0aWYgKGxlbmd0aCA9PSBzaXplKSB7XG4gXHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRnb3RvIG5vX3NwbGl0O1xuIFx0fVxuIFxuIFx0LypcbkBAIC0yNDgsOSAmIzQzOzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdGdvdG8gbm9fc3BsaXQ7XG4gXG4gXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cdTAwM2VtYXBwaW5nKTtcbiYjNDM7XHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gXHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcbiBcdGlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7XG4gXHRcdC8qXG5AQCAtMjU5LDM4ICYjNDM7MjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4gXHRcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxuIFx0XHQgKi9cbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbzI7XG4mIzQzO1x0XHRib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlO1xuIFxuLVx0XHRpZiAob2Zmc2V0ICYjNDM7IGxlbmd0aCA9PSBzaXplKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4mIzQzO1x0XHRpZiAocGVuZClcbiYjNDM7XHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLFxuJiM0MztcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuJiM0MztcdFx0aWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSlcbiYjNDM7XHRcdFx0Z290byBzcGxpdDtcbiYjNDM7cmV0cnk6XG4gXHRcdHNwbGl0X2F0MiA9IGZvbGlvX3BhZ2UoZm9saW8sXG4gXHRcdFx0XHRQQUdFX0FMSUdOX0RPV04ob2Zmc2V0ICYjNDM7IGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xuIFx0XHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XG4gXG4gXHRcdGlmICghZm9saW9fdHJ5X2dldChmb2xpbzIpKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4mIzQzO1x0XHRcdGdvdG8gc3BsaXQ7XG4gXG4gXHRcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxuIFx0XHRcdGdvdG8gb3V0O1xuIFxuLVx0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSlcbiYjNDM7XHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XG4mIzQzO1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudFxuJiM0MztcdFx0ICogc3BsaXQuIFJldHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgZm9saW8gaW4gY2FzZSBpdCYjMzk7cyBzdGlsbFxuJiM0MztcdFx0ICogbGFyZ2UuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xuJiM0MztcdFx0XHRmb2xpb19wdXQoZm9saW8yKTtcbiYjNDM7XHRcdFx0Z290byByZXRyeTtcbiYjNDM7XHRcdH1cbiBcbiBcdFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nKVxuLVx0XHRcdGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpO1xuJiM0MztcdFx0ICAgIGZvbGlvMi1cdTAwM2VtYXBwaW5nID09IGZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpXG4mIzQzO1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4gb3V0OlxuJiM0MztcdFx0aWYgKCF0YWlsX2lzb2xhdGVkIFx1MDAyNlx1MDAyNiBwZW5kKVxuJiM0MztcdFx0XHQqcGVuZCA9IGZvbGlvMi1cdTAwM2VpbmRleDtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4tbm9fc3BsaXQ6XG4mIzQzO3NwbGl0OlxuJiM0MztcdFx0aWYgKHBzdGFydClcbiYjNDM7XHRcdFx0KnBzdGFydCA9IHJvdW5kX3VwKHBvcyAmIzQzOyBvZmZzZXQsXG4mIzQzO1x0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cdTAwM2VtYXBwaW5nLCBmb2xpbyk7XG4tXHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuJiM0MztcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuJiM0Mztub19zcGxpdDpcbiYjNDM7XHRpZiAocHN0YXJ0KVxuJiM0MztcdFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXHUwMDNlaW5kZXg7XG4mIzQzO1x0aWYgKHBlbmQpXG4mIzQzO1x0XHQqcGVuZCA9IChwb3MgJiM0Mzsgc2l6ZSBcdTAwM2UgKHU2NClsZW5kKSA/IGZvbGlvLVx1MDAzZWluZGV4IDpcbiYjNDM7XHRcdFx0XHRcdFx0ICAgZm9saW9fbmV4dF9pbmRleChmb2xpbyk7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbiAvKlxuQEAgLTQxMywxMSAmIzQzOzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XG4gXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4mIzQzO1x0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIFx1MDAyNnN0YXJ0LFxuJiM0MztcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdGZvbGlvID0gTlVMTDtcbkBAIC00MjcsOCAmIzQzOzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuIFx0XHRcdFx0XHRcdEZHUF9MT0NLLCAwKTtcbiBcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4mIzQzO1x0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbiBcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtTSE1FTSYjMzQ7LAogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8mIzM0OywKICAgICYjMzQ7c2htZW1fdW5kb19yYW5nZSYjMzQ7LAogICAgJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3RydW5jYXRlLmMgYW5kIG1tL3NobWVtLmMgZm9yIGhhbmRsaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIHdoZW4gdHJ1bmNhdGluZyBwYWdlY2FjaGUgYW5kIHNobWVtIHJhbmdlcy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCB0cnVuY2F0aW9uIGFuZCBob2xlLXB1bmNoaW5nIHN5c2NhbGxzIChlLmcuLCB0cnVuY2F0ZSwgZnRydW5jYXRlLCBmYWxsb2NhdGUpIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGZvbGlvIHNwbGl0dGluZyBhbmQgaW5kZXggYm91bmRhcnkgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBkODAzMGE0MWUwYjBiNjg2N2E0YjNlYzIyM2MxNjc5OTE1Y2I2NzcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAwNjo1OToxMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaApAQCAtNjI3LDggJiM0Mzs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsCiB1bnNpZ25lZCBmaW5kX2dldF9lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCwKIAkJcGdvZmZfdCBlbmQsIHN0cnVjdCBmb2xpb19iYXRjaCAqZmJhdGNoLCBwZ29mZl90ICppbmRpY2VzKTsKIGludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7Ci1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LAotCQlsb2ZmX3QgZW5kKTsKJiM0Mztib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCwKJiM0MzsJCWxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpOwogbG9uZyBtYXBwaW5nX2V2aWN0X2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA4OWExNDk1ZTU1ZjdlLi40ZWZiYmJiYTVkYTU5IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3NobWVtLmMKQEAgLTExNzUsMTEgJiM0MzsxMTc1LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCwKIAlpZiAoZm9saW8pIHsKIAkJc2FtZV9mb2xpbyA9IGxlbmQgJmx0OyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7CiAJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQlpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHsKLQkJCXN0YXJ0ID0gZm9saW9fbmV4dF9pbmRleChmb2xpbyk7Ci0JCQlpZiAoc2FtZV9mb2xpbykKLQkJCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7Ci0JCX0KJiM0MzsJCXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgJmFtcDtzdGFydCwKJiM0MzsJCQkJCSAgICAgc2FtZV9mb2xpbyA/ICZhbXA7ZW5kIDogTlVMTCk7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCWZvbGlvX3B1dChmb2xpbyk7CiAJCWZvbGlvID0gTlVMTDsKQEAgLTExODksOCAmIzQzOzExODYsNyBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLAogCQlmb2xpbyA9IHNobWVtX2dldF9wYXJ0aWFsX2ZvbGlvKGlub2RlLCBsZW5kICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwogCWlmIChmb2xpbykgewogCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKQotCQkJZW5kID0gZm9saW8tJmd0O2luZGV4OwomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCAmYW1wO2VuZCk7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCWZvbGlvX3B1dChmb2xpbyk7CiAJfQpAQCAtMTI1OCw3ICYjNDM7MTI1NCw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsCiAKIAkJCQlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiAJCQkJCXRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTsKLQkJCQl9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHsKJiM0MzsJCQkJfSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLAomIzQzOwkJCQkJCQlsc3RhcnQsIGxlbmQsIE5VTEwsIE5VTEwpKSB7CiAJCQkJCS8qCiAJCQkJCSAqIElmIHdlIHNwbGl0IGEgcGFnZSwgcmVzZXQgdGhlIGxvb3Agc28KIAkJCQkJICogdGhhdCB3ZSBwaWNrIHVwIHRoZSBuZXcgc3ViIHBhZ2VzLgpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS90cnVuY2F0ZS5jCkBAIC0yMDYsMzUgJiM0MzsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsCiAvKgogICogSGFuZGxlIHBhcnRpYWwgZm9saW9zLiAgVGhlIGZvbGlvIG1heSBiZSBlbnRpcmVseSB3aXRoaW4gdGhlCiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZQotICogZm9saW8gdGhhdCYjMzk7cyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmCiYjNDM7ICogZm9saW8gdGhhdCYjMzk7cyB3aXRoaW4gdGhlIFtsc3RhcnQsIGxlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWYKICAqIGl0JiMzOTtzIGxhcmdlLiAgc3BsaXRfcGFnZV9yYW5nZSgpIHdpbGwgZGlzY2FyZCBwYWdlcyB3aGljaCBub3cgbGllIGJleW9uZAogICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhCiAgKiBuZXdseSBjcmVhdGVkIGhvbGUuCiAgKgotICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkCi0gKiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUgZm9saW8gd2hpY2ggaXMgc3R1YmJvcm5seSB1bnNwbGl0LgomIzQzOyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGUKJiM0MzsgKiBwYWdlIHJhbmdlIGZ1bGx5IGNvdmVyZWQgYnkgW2xzdGFydCwgbGVuZF0gYWZ0ZXIgYW55IHNwbGl0IChvciBub25lKSwKJiM0MzsgKiBpLmUuIHRoZSByYW5nZSBvZiBwYWdlcyB0aGF0IGFyZSB3aG9sbHkgd2l0aGluIFtsc3RhcnQsIGxlbmRdIGFuZCBzbyBzYWZlCiYjNDM7ICogdG8gZGlzY2FyZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybiAldHJ1ZSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0LCAlZmFsc2Ugb3RoZXJ3aXNlLgogICovCi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQomIzQzO2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LAomIzQzOwkJCQkgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpCiB7CiAJbG9mZl90IHBvcyA9IGZvbGlvX3Bvcyhmb2xpbyk7CiAJc2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7CiAJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCAqc3BsaXRfYXQyOwomIzQzOwl1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzOwogCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiAKLQlpZiAocG9zICZsdDsgc3RhcnQpCi0JCW9mZnNldCA9IHN0YXJ0IC0gcG9zOwomIzQzOwlpZiAocG9zICZsdDsgbHN0YXJ0KQomIzQzOwkJb2Zmc2V0ID0gbHN0YXJ0IC0gcG9zOwogCWVsc2UKIAkJb2Zmc2V0ID0gMDsKLQlpZiAocG9zICYjNDM7IHNpemUgJmx0Oz0gKHU2NCllbmQpCiYjNDM7CWlmIChwb3MgJiM0Mzsgc2l6ZSAmbHQ7PSAodTY0KWxlbmQpCiAJCWxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7CiAJZWxzZQotCQlsZW5ndGggPSBlbmQgJiM0MzsgMSAtIHBvcyAtIG9mZnNldDsKJiM0MzsJCWxlbmd0aCA9IGxlbmQgJiM0MzsgMSAtIHBvcyAtIG9mZnNldDsKIAogCWZvbGlvX3dhaXRfd3JpdGViYWNrKGZvbGlvKTsKIAlpZiAobGVuZ3RoID09IHNpemUpIHsKIAkJdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlnb3RvIG5vX3NwbGl0OwogCX0KIAogCS8qCkBAIC0yNDgsOSAmIzQzOzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQogCWlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSkKIAkJZm9saW9faW52YWxpZGF0ZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpOwogCWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCi0JCXJldHVybiB0cnVlOwomIzQzOwkJZ290byBub19zcGxpdDsKIAogCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKGZvbGlvLSZndDttYXBwaW5nKTsKJiM0MzsJbWluX25yYnl0ZXMgPSBtYXBwaW5nX21pbl9mb2xpb19ucmJ5dGVzKGZvbGlvLSZndDttYXBwaW5nKTsKIAlzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTsKIAlpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkgewogCQkvKgpAQCAtMjU5LDM4ICYjNDM7MjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiAJCSAqIGZvciBzaG1lbSB0cnVuY2F0ZQogCQkgKi8KIAkJc3RydWN0IGZvbGlvICpmb2xpbzI7CiYjNDM7CQlib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlOwogCi0JCWlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpCi0JCQlnb3RvIG5vX3NwbGl0OwomIzQzOwkJaWYgKHBlbmQpCiYjNDM7CQkJKnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLAomIzQzOwkJCQkJICAgbWluX25yYnl0ZXMpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAKJiM0MzsJCWlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpCiYjNDM7CQkJZ290byBzcGxpdDsKJiM0MztyZXRyeToKIAkJc3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbywKIAkJCQlQQUdFX0FMSUdOX0RPV04ob2Zmc2V0ICYjNDM7IGxlbmd0aCkgLyBQQUdFX1NJWkUpOwogCQlmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7CiAKIAkJaWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvMikpCi0JCQlnb3RvIG5vX3NwbGl0OwomIzQzOwkJCWdvdG8gc3BsaXQ7CiAKIAkJaWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkKJiM0MzsJCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7CiYjNDM7CQkJdGFpbF9pc29sYXRlZCA9IGZhbHNlOwogCQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudAomIzQzOwkJICogc3BsaXQuIFJldHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgZm9saW8gaW4gY2FzZSBpdCYjMzk7cyBzdGlsbAomIzQzOwkJICogbGFyZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7CiYjNDM7CQkJZm9saW9fdW5sb2NrKGZvbGlvMik7CiYjNDM7CQkJZm9saW9fcHV0KGZvbGlvMik7CiYjNDM7CQkJZ290byByZXRyeTsKJiM0MzsJCX0KIAogCQkvKiBtYWtlIHN1cmUgZm9saW8yIGlzIGxhcmdlIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaXRzIG1hcHBpbmcgKi8KIAkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSAmYW1wOyZhbXA7Ci0JCSAgICBmb2xpbzItJmd0O21hcHBpbmcgPT0gZm9saW8tJmd0O21hcHBpbmcpCi0JCQlmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbzIsIHNwbGl0X2F0MiwgbWluX29yZGVyKTsKJiM0MzsJCSAgICBmb2xpbzItJmd0O21hcHBpbmcgPT0gZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOwomIzQzOwkJICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKQomIzQzOwkJCXRhaWxfaXNvbGF0ZWQgPSBmYWxzZTsKIAogCQlmb2xpb191bmxvY2soZm9saW8yKTsKIG91dDoKJiM0MzsJCWlmICghdGFpbF9pc29sYXRlZCAmYW1wOyZhbXA7IHBlbmQpCiYjNDM7CQkJKnBlbmQgPSBmb2xpbzItJmd0O2luZGV4OwogCQlmb2xpb19wdXQoZm9saW8yKTsKLW5vX3NwbGl0OgomIzQzO3NwbGl0OgomIzQzOwkJaWYgKHBzdGFydCkKJiM0MzsJCQkqcHN0YXJ0ID0gcm91bmRfdXAocG9zICYjNDM7IG9mZnNldCwKJiM0MzsJCQkJCSAgIG1pbl9ucmJ5dGVzKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKLQlyZXR1cm4gdHJ1ZTsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSkKJiM0MzsJCXRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLSZndDttYXBwaW5nLCBmb2xpbyk7CiYjNDM7bm9fc3BsaXQ6CiYjNDM7CWlmIChwc3RhcnQpCiYjNDM7CQkqcHN0YXJ0ID0gb2Zmc2V0ID8gZm9saW9fbmV4dF9pbmRleChmb2xpbykgOiBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CWlmIChwZW5kKQomIzQzOwkJKnBlbmQgPSAocG9zICYjNDM7IHNpemUgJmd0OyAodTY0KWxlbmQpID8gZm9saW8tJmd0O2luZGV4IDoKJiM0MzsJCQkJCQkgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtNDEzLDExICYjNDM7NDQ5LDggQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAlmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQsIEZHUF9MT0NLLCAwKTsKIAlpZiAoIUlTX0VSUihmb2xpbykpIHsKIAkJc2FtZV9mb2xpbyA9IGxlbmQgJmx0OyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7Ci0JCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewotCQkJc3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKLQkJCWlmIChzYW1lX2ZvbGlvKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKLQkJfQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCAmYW1wO3N0YXJ0LAomIzQzOwkJCQkJICAgICBzYW1lX2ZvbGlvID8gJmFtcDtlbmQgOiBOVUxMKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAkJZm9saW8gPSBOVUxMOwpAQCAtNDI3LDggJiM0Mzs0NjAsNyBAQCB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQlmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbGVuZCAmZ3Q7Jmd0OyBQQUdFX1NISUZULAogCQkJCQkJRkdQX0xPQ0ssIDApOwogCQlpZiAoIUlTX0VSUihmb2xpbykpIHsKLQkJCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkKLQkJCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CQkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCAmYW1wO2VuZCk7CiAJCQlmb2xpb191bmxvY2soZm9saW8pOwogCQkJZm9saW9fcHV0KGZvbGlvKTsKIAkJfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTk2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBUaGlzIFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIHNvbWUgcHJldHR5IGZ1bmRhbWVudGFsIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUsIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGAuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgZGVhbGluZyB3aXRoIGNvcmUgcGFnZWNhY2hlIHRydW5jYXRpb24gbG9naWMg4oCTIHRoaW5ncyBsaWtlIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBkaWdnaW5nIGludG8gaG93IHdlIGhhbmRsZSBwYXJ0aWFsIGZvbGlvcywgaG93IGZvbGlvcyBhcmUgc3BsaXQsIGFuZCBob3cgaW5kZXggcmFuZ2VzIGFyZSBtYW5hZ2VkIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLgoKVGhlIGltcG9ydGFudCBxdWVzdGlvbiBub3cgaXMsIGlzIHRoaXMgY29kZSByZWFjaGFibGUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgb3Igd2l0aCBmdXp6aW5nPyBHaXZlbiB0aGF0IHRoaXMgaGl0cyBgbW0vdHJ1bmNhdGUuY2AgYW5kIGBtbS9zaG1lbS5jYCwgY29yZSBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLCBleGVjdXRlZCBkdXJpbmcgdHJ1bmNhdGlvbiwgaG9sZSBwdW5jaGluZyAoZS5nLiBgZmFsbG9jYXRlYCksIGV2aWN0aW9uLCBldGMuLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyB5ZXMuIFRoaXMgaXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nYC4KClNvLCB0byBzdW1tYXJpemU6CgoxLiAgKipXb3J0aEZ1enppbmc6IHRydWUqKiAtIERlZmluaXRlbHkuIFRoaXMgaGl0cyBjcml0aWNhbCBNTSBjb2RlLgoyLiAgKipGb2N1c1N5bWJvbHM6KiogSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCBsb2dpYyBpcyBiZWluZyB0b3VjaGVkLiBUaGUga2V5IHN5bWJvbHMgd2l0aGluIHRoZSBwYXRjaCBhcmU6CiAgICAqICAgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIChpbiBgbW0vdHJ1bmNhdGUuY2ApCiAgICAqICAgYHNobWVtX3VuZG9fcmFuZ2VgIChpbiBgbW0vc2htZW0uY2ApCiAgICAqICAgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCAoaW4gYG1tL3RydW5jYXRlLmNgKQoKTm93LCBJJiMzOTttIGdvaW5nIHRvIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gZGl2ZSBpbnRvIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbGVycyBvZiB0aGVzZSBmdW5jdGlvbnMsIGxvb2sgYXQgdGhlIGNvbnRleHQsIHZlcmlmeSBhbnkgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMsIGFuZCBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoZXNlIGNoYW5nZXMgY291bGQgbWFuaWZlc3QgdnVsbmVyYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaW50ZXJuYWwuaD02Mjk9aW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbm1tL2ludGVybmFsLmg6NjMwOmJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxubW0vaW50ZXJuYWwuaC02MzEtXHRcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xuLS1cbm1tL3NobWVtLmM9MTExOT1zdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuLS1cbm1tL3NobWVtLmMtMTE3Ny1cdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5tbS9zaG1lbS5jOjExNzg6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG5tbS9zaG1lbS5jLTExNzktXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuLS1cbm1tL3NobWVtLmMtMTE4OC1cdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5tbS9zaG1lbS5jOjExODk6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbm1tL3NobWVtLmMtMTE5MC1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9zaG1lbS5jLTEyMjYtXHRcdFx0XHRcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XG5tbS9zaG1lbS5jOjEyMjc6XHRcdFx0XHRcdCAqIGJvcmRlciwgc2tpcCBpdCBhcyB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1xubW0vc2htZW0uYy0xMjI4LVx0XHRcdFx0XHQgKiBhYm92ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB6ZXJvZCBpdHMgY29udGVudCBvbmNlLlxuLS1cbm1tL3NobWVtLmMtMTI1Ni1cdFx0XHRcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8obWFwcGluZywgZm9saW8pO1xubW0vc2htZW0uYzoxMjU3Olx0XHRcdFx0fSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLFxubW0vc2htZW0uYy0xMjU4LVx0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuLS1cbm1tL3RydW5jYXRlLmM9MTgwPXN0YXRpYyBpbnQgZm9saW9fc3BsaXRfb3JfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LFxuLS1cbm1tL3RydW5jYXRlLmMtMjIwLSAqL1xubW0vdHJ1bmNhdGUuYzoyMjE6Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG5tbS90cnVuY2F0ZS5jLTIyMi1cdFx0XHRcdCAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZClcbi0tXG5tbS90cnVuY2F0ZS5jPTQwMj12b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbm1tL3RydW5jYXRlLmMtNDUxLVx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xubW0vdHJ1bmNhdGUuYzo0NTI6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG5tbS90cnVuY2F0ZS5jLTQ1My1cdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4tLVxubW0vdHJ1bmNhdGUuYy00NjItXHRcdGlmICghSVNfRVJSKGZvbGlvKSkge1xubW0vdHJ1bmNhdGUuYzo0NjM6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xubW0vdHJ1bmNhdGUuYy00NjQtXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTAwCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgVHJ1bmNhdGUgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgaW5vZGUgdHJ1bmNhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cnVuY2F0aW9uIHByb2Nlc3MgaXMgYWN0dWFsbHkgKmltcGxlbWVudGVkKiBhdCB0aGUgbG93ZXN0IGxldmVsLiBUaGF0IG1lYW5zIGNoZWNraW5nIG91dCB0aGUgY29yZSBmdW5jdGlvbnMgaGFuZGxpbmcgdGhpcywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGF5ZXIsIGdpdmVuIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgcGFnZXMgYW5kIGZvbGlvcy4gSSYjMzk7bSB0aGlua2luZywgYmFzZWQgb24gcGFzdCBleHBlcmllbmNlLCB0aGF0IGBtbS90cnVuY2F0ZS5jYCBpcyB0aGUgbGlrZWx5IHBsYWNlIGZvciB0aGVzZSBsb3ctbGV2ZWwgaW1wbGVtZW50YXRpb25zLiBNb3JlIHNwZWNpZmljYWxseSwgSSYjMzk7bSB6ZXJvaW5nIGluIG9uIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBrZXkgcGxheWVycywgaGFuZGxpbmcgdGhlIHBhcnRpYWwgdHJ1bmNhdGlvbiBvZiBpbmRpdmlkdWFsIGZvbGlvcyBhbmQgdGhlIHJhbmdlLWJhc2VkIHRydW5jYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGV5IGludGVyYWN0LCBob3cgdGhleSBoYW5kbGUgbG9ja2luZywgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIHBhZ2UgY2FjaGUuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIG51YW5jZXMgaW4gaG93IHRoZXkgZGVhbCB3aXRoIHBhcnRpYWxseSBmaWxsZWQgZm9saW9zLCBkaXJ0eSBwYWdlcywgYW5kIHRoZSBvdmVyYWxsIGNvb3JkaW5hdGlvbiBvZiB0aGUgdHJ1bmNhdGlvbiBvcGVyYXRpb24uIEZyb20gdGhlcmUsIEkmIzM5O2xsIGJlIGFibGUgdG8gaW5mZXIgdGhlIGNyaXRpY2FsIHBhdGgsIGFuZCBpZGVudGlmeSBhbnkgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdHJ1bmNhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjE1Olx0ICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4gMjE2Olx0ICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxuIDIxNzpcdCAqIHRvIGRpc2NhcmQuXG4gMjE4Olx0ICpcbiAyMTk6XHQgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cbiAyMjA6XHQgKi9cbiAyMjE6XHRib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcbiAyMjI6XHRcdFx0XHRcdCAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZClcbiAyMjM6XHR7XG4gMjI0Olx0XHRsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTtcbiAyMjU6XHRcdHNpemVfdCBzaXplID0gZm9saW9fc2l6ZShmb2xpbyk7XG4gMjI2Olx0XHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XG4gMjI3Olx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7XG4gMjI4Olx0XHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xuIDIyOTpcdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbiAyMzA6XHRcbiAyMzE6XHRcdGlmIChwb3MgXHUwMDNjIGxzdGFydClcbiAyMzI6XHRcdFx0b2Zmc2V0ID0gbHN0YXJ0IC0gcG9zO1xuIDIzMzpcdFx0ZWxzZVxuIDIzNDpcdFx0XHRvZmZzZXQgPSAwO1xuIDIzNTpcdFx0aWYgKHBvcyAmIzQzOyBzaXplIFx1MDAzYz0gKHU2NClsZW5kKVxuIDIzNjpcdFx0XHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xuIDIzNzpcdFx0ZWxzZVxuIDIzODpcdFx0XHRsZW5ndGggPSBsZW5kICYjNDM7IDEgLSBwb3MgLSBvZmZzZXQ7XG4gMjM5Olx0XG4gMjQwOlx0XHRmb2xpb193YWl0X3dyaXRlYmFjayhmb2xpbyk7XG4gMjQxOlx0XHRpZiAobGVuZ3RoID09IHNpemUpIHtcbiAyNDI6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuIDI0MzpcdFx0XHRnb3RvIG5vX3NwbGl0O1xuIDI0NDpcdFx0fVxuIDI0NTpcdFxuIDI0NjpcdFx0LypcbiAyNDc6XHRcdCAqIFdlIG1heSBiZSB6ZXJvaW5nIHBhZ2VzIHdlJiMzOTtyZSBhYm91dCB0byBkaXNjYXJkLCBidXQgaXQgYXZvaWRzXG4gMjQ4Olx0XHQgKiBkb2luZyBhIGNvbXBsZXggY2FsY3VsYXRpb24gaGVyZSwgYW5kIHRoZW4gZG9pbmcgdGhlIHplcm9pbmdcbiAyNDk6XHRcdCAqIGFueXdheSBpZiB0aGUgcGFnZSBzcGxpdCBmYWlscy5cbiAyNTA6XHRcdCAqL1xuIDI1MTpcdFx0aWYgKCFtYXBwaW5nX2luYWNjZXNzaWJsZShmb2xpby1cdTAwM2VtYXBwaW5nKSlcbiAyNTI6XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIDI1NTpcdFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gMjU2Olx0XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIDI1NzpcdFx0XHRnb3RvIG5vX3NwbGl0O1xuIDI1ODpcdFxuIDI1OTpcdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gMjYwOlx0XHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gMjYxOlx0XHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcbiAyNjI6XHRcdGlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7XG4gMjYzOlx0XHRcdC8qXG4gMjY0Olx0XHRcdCAqIHRyeSB0byBzcGxpdCBhdCBvZmZzZXQgJiM0MzsgbGVuZ3RoIHRvIG1ha2Ugc3VyZSBmb2xpb3Mgd2l0aGluXG4gMjY1Olx0XHRcdCAqIHRoZSByYW5nZSBjYW4gYmUgZHJvcHBlZCwgZXNwZWNpYWxseSB0byBhdm9pZCBtZW1vcnkgd2FzdGVcbiAyNjY6XHRcdFx0ICogZm9yIHNobWVtIHRydW5jYXRlXG4gMjY3Olx0XHRcdCAqL1xuIDI2ODpcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcbiAyNjk6XHRcdFx0Ym9vbCB0YWlsX2lzb2xhdGVkID0gdHJ1ZTtcbiAyNzA6XHRcbiAyNzE6XHRcdFx0aWYgKHBlbmQpXG4gMjcyOlx0XHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLFxuIDI3MzpcdFx0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc0Olx0XG4gMjc1Olx0XHRcdGlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpXG4gMjc2Olx0XHRcdFx0Z290byBzcGxpdDtcbiAyNzc6XHRyZXRyeTpcbiAyNzg6XHRcdFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcbiAyNzk6XHRcdFx0XHRcdFBBR0VfQUxJR05fRE9XTihvZmZzZXQgJiM0MzsgbGVuZ3RoKSAvIFBBR0VfU0laRSk7XG4gMjgwOlx0XHRcdGZvbGlvMiA9IHBhZ2VfZm9saW8oc3BsaXRfYXQyKTtcbiAyODE6XHRcbiAyODI6XHRcdFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvMikpXG4gMjgzOlx0XHRcdFx0Z290byBzcGxpdDtcbiAyODQ6XHRcbiAyODU6XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpXG4gMjg2Olx0XHRcdFx0Z290byBvdXQ7XG4gMjg3Olx0XG4gMjg4Olx0XHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XG4gMjg5Olx0XHRcdFx0dGFpbF9pc29sYXRlZCA9IGZhbHNlO1xuIDI5MDpcdFx0XHRcdGdvdG8gb3V0O1xuIDI5MTpcdFx0XHR9XG4gMjkyOlx0XG4gMjkzOlx0XHRcdC8qXG4gMjk0Olx0XHRcdCAqIHNwbGl0X2F0MiBtYXkgbm8gbG9uZ2VyIGJlbG9uZyB0byBmb2xpbzIgZHVlIHRvIGNvbmN1cnJlbnRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjAxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgRGF0YSBDb3JydXB0aW9uIGluIFNoYXJlZCBNZW1vcnkqKgoKT2theSwgdGltZSB0byBkaWcgaW50byBhIHBvdGVudGlhbCBpc3N1ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCB0cmFjZSBpdHMgdXNhZ2UuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNhbGxlcnMsIGFuZCwgY3J1Y2lhbGx5LCBob3cgdGhvc2UgY2FsbGVycyBtaWdodCBpbnRlcmFjdCB3aXRoIGFueSBmdW5jdGlvbnMgdGhhdCBjb3VsZCBsZWFkIHRvIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uIGluIHRoZSBzaGFyZWQgbWVtb3J5IGNvbnRleHQg4oCTIG5hbWVseSwgYW55dGhpbmcgcmVsYXRlZCB0byB0cnVuY2F0aW9uLiBUaGUgY29kZSYjMzk7cyBwcm9iYWJseSBnb3Qgc29tZSBpbnRlcmVzdGluZyBpbnRlcmFjdGlvbnMgd2l0aCBob3cgaXQgaGFuZGxlcyBjaGFuZ2VzIHRvIGZpbGUgc2l6ZSBvciBkYXRhIHJlZ2lvbnMsIHNvIEkmIzM5O2xsIGJlIGxvb2tpbmcgYXQgYWxsIGNhbGxlcnMgb2YgYHRydW5jYXRlYCB3aXRoaW4gYHNobWVtLmNgIGFzIHdlbGwuIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgdHdvIGFyZWFzIGlzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgc29tZXRoaW5nIG9mIGludGVyZXN0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGF1ZGl0IHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2htZW1fdW5kb19yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zaG1lbS5jPTEwODc9c3RhdGljIHN0cnVjdCBmb2xpbyAqc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpbmRleClcbi0tXG5tbS9zaG1lbS5jLTExMTgtICovXG5tbS9zaG1lbS5jOjExMTk6c3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbm1tL3NobWVtLmMtMTEyMC1cdFx0XHRcdFx0XHRcdFx0IGJvb2wgdW5mYWxsb2MpXG4tLVxubW0vc2htZW0uYz0xMjgzPXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXG5tbS9zaG1lbS5jLTEyODQte1xubW0vc2htZW0uYzoxMjg1Olx0c2htZW1fdW5kb19yYW5nZShpbm9kZSwgbHN0YXJ0LCBsZW5kLCBmYWxzZSk7XG5tbS9zaG1lbS5jLTEyODYtXHRpbm9kZV9zZXRfbXRpbWVfdG9fdHMoaW5vZGUsIGlub2RlX3NldF9jdGltZV9jdXJyZW50KGlub2RlKSk7XG4tLVxubW0vc2htZW0uYz0yNjMwPXN0YXRpYyBpbnQgc3luY2hyb25vdXNfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX2VudHJ5X3QgKndhaXQsXG4tLVxubW0vc2htZW0uYy0yNjQyLSAqIGZhdWx0aW5nIHBhZ2VzIGludG8gdGhlIGhvbGUgd2hpbGUgaXQmIzM5O3MgYmVpbmcgcHVuY2hlZC4gIEFsdGhvdWdoXG5tbS9zaG1lbS5jOjI2NDM6ICogc2htZW1fdW5kb19yYW5nZSgpIGRvZXMgcmVtb3ZlIHRoZSBhZGRpdGlvbnMsIGl0IG1heSBiZSB1bmFibGUgdG9cbm1tL3NobWVtLmMtMjY0NC0gKiBrZWVwIHVwLCBhcyBlYWNoIG5ldyBwYWdlIG5lZWRzIGl0cyBvd24gdW5tYXBfbWFwcGluZ19yYW5nZSgpIGNhbGwsXG4tLVxubW0vc2htZW0uYz0zNjA5PXN0YXRpYyBsb25nIHNobWVtX2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsXG4tLVxubW0vc2htZW0uYy0zNzE5LVx0XHRcdGlmIChpbmRleCBcdTAwM2Ugc3RhcnQpIHtcbm1tL3NobWVtLmM6MzcyMDpcdFx0XHRcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsXG5tbS9zaG1lbS5jLTM3MjEtXHRcdFx0XHQgICAgKGxvZmZfdClzdGFydCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MzA5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKkludmVzdGlnYXRpbmcgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCBDYWxsZXJzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIGlzIGJlaW5nIHVzZWQuIEdpdmVuIHRoYXQgaXQgZGVhbHMgd2l0aCBpbm9kZSBwYWdlIHJhbmdlcywgaXQmIzM5O3MgcHJldHR5IGNsZWFyIHRoYXQgaXQgaGFzIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgYm90aCBtZW1vcnkgbWFuYWdlbWVudCAobW0pIGFuZCB0aGUgZmlsZXN5c3RlbSAoZnMpIGxheWVycy4gVGhlcmVmb3JlLCB0aGUgZmlyc3QgbG9naWNhbCBzdGVwIGlzIHRvIHBpbnBvaW50IGl0cyBjYWxsZXJzIHdpdGhpbiB0aG9zZSBhcmVhcyBvZiB0aGUga2VybmVsIGNvZGViYXNlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGF0JiMzOTtsbCBnaXZlIG1lIGluc2lnaHQgaW50byB3aGF0JiMzOTtzIGJlaW5nIHRydW5jYXRlZCwgd2h5LCBhbmQgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBvciBjb3JyZWN0bmVzcyBpbXBsaWNhdGlvbnMgb2YgYW55IG1vZGlmaWNhdGlvbnMgSSBtaWdodCBiZSBjb25zaWRlcmluZy4gSSBzaG91bGQgc3RhcnQgYnkgc2VhcmNoaW5nIGZvciBjYWxscyBpbiB0aGUgYG1tYCBhbmQgYGZzYCBkaXJlY3Rvcmllcy4gS25vd2luZyB0aGUgY2FsbCBjb250ZXh0LCBlc3BlY2lhbGx5LCBpcyAqY3JpdGljYWwqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zaG1lbS5jPTU3NTQ9dm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcbm1tL3NobWVtLmMtNTc1NS17XG5tbS9zaG1lbS5jOjU3NTY6XHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS1cdTAwM2VpX21hcHBpbmcsIGxzdGFydCwgbGVuZCk7XG5tbS9zaG1lbS5jLTU3NTctfVxuLS1cbm1tL3RydW5jYXRlLmM9MzYxPWxvbmcgbWFwcGluZ19ldmljdF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS90cnVuY2F0ZS5jLTM3OC0vKipcbm1tL3RydW5jYXRlLmM6Mzc5OiAqIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlIC0gdHJ1bmNhdGUgcmFuZ2Ugb2YgcGFnZXMgc3BlY2lmaWVkIGJ5IHN0YXJ0IFx1MDAyNiBlbmQgYnl0ZSBvZmZzZXRzXG5tbS90cnVuY2F0ZS5jLTM4MC0gKiBAbWFwcGluZzogbWFwcGluZyB0byB0cnVuY2F0ZVxuLS1cbm1tL3RydW5jYXRlLmMtMzk4LSAqIE5vdGUgdGhhdCBzaW5jZSAtXHUwMDNlaW52YWxpZGF0ZV9mb2xpbygpIGFjY2VwdHMgcmFuZ2UgdG8gaW52YWxpZGF0ZVxubW0vdHJ1bmNhdGUuYzozOTk6ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgaXMgYWJsZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGVuZCAmIzQzOyAxIGlzIG5vdFxubW0vdHJ1bmNhdGUuYy00MDAtICogcGFnZSBhbGlnbmVkIHByb3Blcmx5LlxubW0vdHJ1bmNhdGUuYy00MDEtICovXG5tbS90cnVuY2F0ZS5jOjQwMjp2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxubW0vdHJ1bmNhdGUuYy00MDMtXHRcdFx0XHRsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcbi0tXG5tbS90cnVuY2F0ZS5jLTQ5OS19XG5tbS90cnVuY2F0ZS5jOjUwMDpFWFBPUlRfU1lNQk9MKHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKTtcbm1tL3RydW5jYXRlLmMtNTAxLVxuLS1cbm1tL3RydW5jYXRlLmM9NTE1PXZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpXG5tbS90cnVuY2F0ZS5jLTUxNi17XG5tbS90cnVuY2F0ZS5jOjUxNzpcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgKGxvZmZfdCktMSk7XG5tbS90cnVuY2F0ZS5jLTUxOC19XG4tLVxubW0vdHJ1bmNhdGUuYz05MzY9dm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpXG4tLVxubW0vdHJ1bmNhdGUuYy05NTYtXHRcdFx0XHQgICAgMSAmIzQzOyB1bm1hcF9lbmQgLSB1bm1hcF9zdGFydCwgMCk7XG5tbS90cnVuY2F0ZS5jOjk1NzpcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgbGVuZCk7XG5tbS90cnVuY2F0ZS5jLTk1OC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTIwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgc2htZW0uY2AgYW5kIGB0cnVuY2F0ZS5jYCBhcmUgYmVpbmcgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBidWlsZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGNoZWNrIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYENPTkZJR19TSE1FTWAgYW5kIHBvdGVudGlhbGx5IG90aGVyIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBhZmZlY3QgYHNobWVtLmNgLiBJIGtub3cgdGhhdCBgdHJ1bmNhdGUuY2AgaXMgZXNzZW50aWFsbHkgYWx3YXlzIHBhcnQgb2YgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgKG1tKSBhbmQgaXMgZ29pbmcgdG8gYmUgYnVpbHQgaW4gZXZlcnkgaW5zdGFuY2UsIHNvIEkmIzM5O20gbm90IGFzIGNvbmNlcm5lZCB3aXRoIGl0cyBidWlsZCBjb25kaXRpb25hbC4gSSBrbm93IHRoYXQgYHNobWVtLmNgIGlzIGNvbmRpdGlvbmFsbHkgYnVpbHQgd2l0aCBgQ09ORklHX1NITUVNYCAob3IgcG9zc2libHkgYENPTkZJR19UTVBGU2AgZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBlbnZpcm9ubWVudCkuIFRoZXJlZm9yZSwgSSBzaG91bGQgYmUgYWJsZSB0byBhc2NlcnRhaW4gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGJ1aWxkIGJ5IGV4YW1pbmluZyB0aGUgYG1tL01ha2VmaWxlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2htZW1cXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTUxPW9iai15XHRcdFx0Oj0gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcXFxuLS1cbm1tL01ha2VmaWxlLTUzLVx0XHRcdCAgIHJlYWRhaGVhZC5vIGZvbGlvLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBzaHJpbmtlci5vIFxcXG5tbS9NYWtlZmlsZTo1NDpcdFx0XHQgICBzaG1lbS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFxcXG5tbS9NYWtlZmlsZS01NS1cdFx0XHQgICBtbV9pbml0Lm8gcGVyY3B1Lm8gc2xhYl9jb21tb24ubyBcXFxuLS1cbm1tL3NobWVtLmM9NTIwPXN0YXRpYyBpbnQgc2htZW1fY29uZmlybV9zd2FwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90IGluZGV4LFxuLS1cbm1tL3NobWVtLmMtNTY5LSNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL3NobWVtLmM6NTcwOi8qIGlmZGVmIGhlcmUgdG8gYXZvaWQgYmxvYXRpbmcgc2htZW0ubyB3aGVuIG5vdCBuZWNlc3NhcnkgKi9cbm1tL3NobWVtLmMtNTcxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDYyNgoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIEludmVzdGlnYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiBlaXRoZXIgYENPTkZJR19TSE1FTWAgb3IgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgYXJlIHBlcnRpbmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSBnb2luZyB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBpbiBgbW0vS2NvbmZpZ2Agb3IgYGluaXQvS2NvbmZpZ2Ag4oCTIHRob3NlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBpbml0aWFsaXphdGlvbi1yZWxhdGVkIHNldHRpbmdzLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBsb3dkb3duIG9uIHdoYXQgdGhlc2Ugb3B0aW9ucyBhY3R1YWxseSAqZG8qIGFuZCB3aGV0aGVyIHRoZXkmIzM5O3JlIGV2ZW4gcmVsZXZhbnQgdG8gd2hhdCBJJiMzOTttIGN1cnJlbnRseSB3b3JraW5nIG9uLiBHb3R0YSBzdGFydCB3aXRoIHRoZSBmdW5kYW1lbnRhbHMsIHJpZ2h0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgU0hNRU0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTg5Nj1jb25maWcgRVZFTlRGRFxuLS1cbmluaXQvS2NvbmZpZy0xOTA0LVxuaW5pdC9LY29uZmlnOjE5MDU6Y29uZmlnIFNITUVNXG5pbml0L0tjb25maWctMTkwNi1cdGJvb2wgXCYjMzQ7VXNlIGZ1bGwgc2htZW0gZmlsZXN5c3RlbVwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA5NDEKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIE1lbW9yeSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gcG90ZW50aWFsIG9wdGltaXphdGlvbnMgYW5kIGl0IHNlZW1zIGxpa2UgYENPTkZJR19TSE1FTWAgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFyZSB0aGUgb2J2aW91cyBwbGFjZXMgdG8gc3RhcnQgaWYgSSBuZWVkIHRvIGFkanVzdCBtZW1vcnkgYmVoYXZpb3IuIEkgYWxyZWFkeSBrbm93IHRoYXQgYENPTkZJR19TSE1FTWAgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3aGljaCBpcyBnb29kLiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBTSE1FTSBhbmQgVEhQLCBlc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGhvdyB0aGV5IGhhbmRsZSBsYXJnZSBmb2xpb3MgYW5kIHBhZ2VjYWNoZSwgaXMgd2hhdCBJJiMzOTttIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHJpZ2h0IG5vdy4gSSYjMzk7bSBnb2luZyB0byBkaWcgaW50byB0aGUgcmVsYXRpb25zaGlwLCBhbmQgbmVlZCB0byBjaGVjayB0aGluZ3MgbGlrZSBgbWFwcGluZ19taW5fZm9saW9fb3JkZXJgIGFuZCBgbWFwcGluZ19taW5fZm9saW9fbnJieXRlc2AsIG9yIGFueSBvdGhlciBjb25maWd1cmF0aW9ucyB0aGF0IHBlcnRhaW4gdG8gVEhQIGFuZCBsYXJnZSBmb2xpb3MuIFRob3NlIGFyZSBwcm9iYWJseSB0aGUga2V5cyB0byBnZXR0aW5nIHRoaXMgcmlnaHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21hcHBpbmdfbWluX2ZvbGlvX29yZGVyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9wYWdlbWFwLmg9NDY4PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50XG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo0Njk6bWFwcGluZ19taW5fZm9saW9fb3JkZXIoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaC00NzAte1xuLS1cbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTQ3Nz1tYXBwaW5nX21pbl9mb2xpb19ucnBhZ2VzKGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDc4LXtcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oOjQ3OTpcdHJldHVybiAxVUwgXHUwMDNjXHUwMDNjIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDgwLX1cbi0tXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaD01Mjg9c3RhdGljIGlubGluZSBib29sIG1hcHBpbmdfcG1kX2ZvbGlvX3N1cHBvcnQoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXG4tLVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNTMyLVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmg6NTMzOlx0cmV0dXJuIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpIFx1MDAzYz0gUE1EX09SREVSIFx1MDAyNlx1MDAyNlxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNTM0LVx0ICAgICAgIG1hcHBpbmdfbWF4X2ZvbGlvX29yZGVyKG1hcHBpbmcpIFx1MDAzZT0gUE1EX09SREVSO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTUzNAoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiAzODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9jdXMgU3ltYm9scyBmb3IgRnV6emluZyoqCgpPa2F5LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhlc2UgYEZvY3VzU3ltYm9sc2AuIEkgc2VlIHdlJiMzOTtyZSBleGFtaW5pbmc6IGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gR29vZCwgSSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlIHF1aXRlIHRhcmdldGVkLiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgaXMgZGVmaW5pdGVseSBzcGVjaWZpYyB0byB0aGUgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIHN0dWZmLCB3aGljaCBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQsIGFuZCBpcyBub3QgZ29pbmcgdG8gaW1wYWN0IG11Y2ggYmV5b25kIHRoYXQuIFRoZW4gdGhlcmUmIzM5O3MgYHNobWVtX3VuZG9fcmFuZ2VgIHdoaWNoIGRlYWxzIHdpdGggc2htZW0gdHJ1bmNhdGlvbiBhbmQgaG9sZSBwdW5jaGluZy4gQW5kIGZpbmFsbHkgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCB3aGljaCBoYW5kbGVzIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbi4gQWxsIHZlcnkgZm9jdXNlZCBhcmVhcyBvZiBjb25jZXJuLgoKTm93LCBsZXQmIzM5O3MganVzdCBxdWlja2x5IHNjYW4gYG1tL3RydW5jYXRlLmNgIGFuZCBgbW0vc2htZW0uY2AgdG8gbWFrZSBzdXJlIHdlJiMzOTtyZSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzIHRoYXQgc2hvdWxkIG9yIHNob3VsZG4mIzM5O3QgYmUgaW5jbHVkZWQuIExvb2tzIGxpa2Ugd2UmIzM5O3ZlIGdvdCB0aGUgZGlyZWN0bHkgbW9kaWZpZWQgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLCBgc2htZW1fdW5kb19yYW5nZWAgdGhhdCYjMzk7cyBhIGRpcmVjdGx5IG1vZGlmaWVkIGNhbGxlciwgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgYWxzbyBhIGRpcmVjdGx5IG1vZGlmaWVkIGNhbGxlci4gTm8gcmVkIGZsYWdzIHRoZXJlLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWdzLiBXZSYjMzk7cmUgbG9va2luZyBhdCBgQ09ORklHX1NITUVNYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9yIGBTSE1FTWAgYW5kIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuCgpBbHJpZ2h0LCB0aW1lIHRvIG1ha2Ugc3VyZSBJJiMzOTttIHNldHRpbmcgdGhlIGBzZXQtcmVzdWx0c2AgcGFyYW1ldGVycyBjb3JyZWN0bHkuIExldCYjMzk7cyBzZWUuLi4gd2UgbmVlZCBgV29ydGhGdXp6aW5nYCwgYFJlYXNvbmluZ2AsIGBGb2N1c1N5bWJvbHNgLCBhbmQgYEVuYWJsZUNvbmZpZ3NgLgoKRmluYWxseSwgYSBxdWljayBzYW5pdHkgY2hlY2sgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMuIEl0JiMzOTtzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGluIGFtZDY0IFFFTVUuIGBXb3J0aEZ1enppbmdgIHNob3VsZCBiZSBgdHJ1ZWAgYmVjYXVzZSB3ZSBhcmUgaW5kZWVkIHRvdWNoaW5nIG1lbW9yeSBtYW5hZ2VtZW50IChgbW0vYCkgYW5kIHJlZmFjdG9yaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIGxvZ2ljLiBGb3IgYEZvY3VzU3ltYm9sc2AsIHdlJiMzOTt2ZSBnb3QgdGhvc2Ugd2VsbC1kZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZW4mIzM5O3QgdWJpcXVpdG91cyBhbmQgYXJlIHNwZWNpZmljIHRvIHRoZSBhcmVhcyBiZWluZyBtb2RpZmllZC4gYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGhhdmUgdGhlIGBDT05GSUdfYCBwcmVmaXggc3RyaXBwZWQuCgpPa2F5LCBJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NITUVNJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtzaG1lbV91bmRvX3JhbmdlJiMzNDssCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U0hNRU0mIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvJiMzNDssCiAgICAmIzM0O3NobWVtX3VuZG9fcmFuZ2UmIzM0OywKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS90cnVuY2F0ZS5jIGFuZCBtbS9zaG1lbS5jIGZvciBoYW5kbGluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyB3aGVuIHRydW5jYXRpbmcgcGFnZWNhY2hlIGFuZCBzaG1lbSByYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgdHJ1bmNhdGlvbiBhbmQgaG9sZS1wdW5jaGluZyBzeXNjYWxscyAoZS5nLiwgdHJ1bmNhdGUsIGZ0cnVuY2F0ZSwgZmFsbG9jYXRlKSBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBmb2xpbyBzcGxpdHRpbmcgYW5kIGluZGV4IGJvdW5kYXJ5IGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXG5cbkFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXJzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgKGBtaW5fbnJieXRlc2AsIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGBmb2xpbzJgLCBgKnBzdGFydGAsIGAqcGVuZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBjYWxsZXIgdmFyaWFibGVzIChgc3RhcnRgLCBgZW5kYCkgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBidWdzIGluIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiwgZm9saW8gc3BsaXR0aW5nLCBvciByZWZlcmVuY2UgY291bnRpbmcgd291bGQgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBsb2NraW5nLCBvciBwYWdlIHN0YXRlIGludmFsaWRhdGlvbiwgd2hpY2ggYXJlIGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgcGFnZSBjYWNoZSBhc3NlcnRpb25zIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGQ4MDMwYTQxZTBiMGI2ODY3YTRiM2VjMjIzYzE2Nzk5MTVjYjY3NzAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIFNlcCA5IDA2OjU5OjEwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmgKaW5kZXggNjhkYjVhYmQwYTRjZS4uNmU2YWQzMTg3Mzc4YSAxMDA2NDQKLS0tIGEvbW0vaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oCkBAIC02MjcsOCAmIzQzOzYyNyw4IEBAIHVuc2lnbmVkIGZpbmRfbG9ja19lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCwKIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LAogCQlwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpOwogaW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsCi0JCWxvZmZfdCBlbmQpOwomIzQzO2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LAomIzQzOwkJbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCk7CiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdW5zaWduZWQgbG9uZyBtYXBwaW5nX3RyeV9pbnZhbGlkYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwgdW5zaWduZWQgbG9uZyAqbnJfZmFpbGVkKTsKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc2htZW0uYwpAQCAtMTE3NSwxMSAmIzQzOzExNzUsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLAogCWlmIChmb2xpbykgewogCQlzYW1lX2ZvbGlvID0gbGVuZCAmbHQ7IGZvbGlvX25leHRfcG9zKGZvbGlvKTsKIAkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7Ci0JCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewotCQkJc3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKLQkJCWlmIChzYW1lX2ZvbGlvKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKLQkJfQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCAmYW1wO3N0YXJ0LAomIzQzOwkJCQkJICAgICBzYW1lX2ZvbGlvID8gJmFtcDtlbmQgOiBOVUxMKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAkJZm9saW8gPSBOVUxMOwpAQCAtMTE4OSw4ICYjNDM7MTE4Niw3IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsCiAJCWZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgJmd0OyZndDsgUEFHRV9TSElGVCk7CiAJaWYgKGZvbGlvKSB7CiAJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQlpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpCi0JCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsICZhbXA7ZW5kKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAl9CkBAIC0xMjU4LDcgJiM0MzsxMjU0LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCwKIAogCQkJCWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHsKIAkJCQkJdHJ1bmNhdGVfaW5vZGVfZm9saW8obWFwcGluZywgZm9saW8pOwotCQkJCX0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewomIzQzOwkJCQl9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sCiYjNDM7CQkJCQkJCWxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHsKIAkJCQkJLyoKIAkJCQkJICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzbwogCQkJCQkgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCBiNThiYTk0MGJlNDc0Li5kODhhMWIxNTkwODQ1IDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3RydW5jYXRlLmMKQEAgLTIwNiwzNSAmIzQzOzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwKIC8qCiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGUKICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlCi0gKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW3N0YXJ0LCBlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWYKJiM0MzsgKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZgogICogaXQmIzM5O3MgbGFyZ2UuICBzcGxpdF9wYWdlX3JhbmdlKCkgd2lsbCBkaXNjYXJkIHBhZ2VzIHdoaWNoIG5vdyBsaWUgYmV5b25kCiAgKiBpX3NpemUsIGFuZCB3ZSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gZGlzY2FyZCBwYWdlcyB3aGljaCBsaWUgd2l0aGluIGEKICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS4KICAqCi0gKiBSZXR1cm5zIGZhbHNlIGlmIHNwbGl0dGluZyBmYWlsZWQgc28gdGhlIGNhbGxlciBjYW4gYXZvaWQKLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuCiYjNDM7ICogV2hlbiBAcHN0YXJ0IGFuZC9vciBAcGVuZCBhcmUgbm9uLU5VTEwgdGhleSByZWNlaXZlIHRoZSBpbmRleGVzIG9mIHRoZQomIzQzOyAqIHBhZ2UgcmFuZ2UgZnVsbHkgY292ZXJlZCBieSBbbHN0YXJ0LCBsZW5kXSBhZnRlciBhbnkgc3BsaXQgKG9yIG5vbmUpLAomIzQzOyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmUKJiM0MzsgKiB0byBkaXNjYXJkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuCiAgKi8KLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsCiYjNDM7CQkJCSAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCkKIHsKIAlsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTsKIAlzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pOwogCXVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDsKIAlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbWluX25yYnl0ZXM7CiAJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKIAotCWlmIChwb3MgJmx0OyBzdGFydCkKLQkJb2Zmc2V0ID0gc3RhcnQgLSBwb3M7CiYjNDM7CWlmIChwb3MgJmx0OyBsc3RhcnQpCiYjNDM7CQlvZmZzZXQgPSBsc3RhcnQgLSBwb3M7CiAJZWxzZQogCQlvZmZzZXQgPSAwOwotCWlmIChwb3MgJiM0Mzsgc2l6ZSAmbHQ7PSAodTY0KWVuZCkKJiM0MzsJaWYgKHBvcyAmIzQzOyBzaXplICZsdDs9ICh1NjQpbGVuZCkKIAkJbGVuZ3RoID0gc2l6ZSAtIG9mZnNldDsKIAllbHNlCi0JCWxlbmd0aCA9IGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0OwomIzQzOwkJbGVuZ3RoID0gbGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0OwogCiAJZm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pOwogCWlmIChsZW5ndGggPT0gc2l6ZSkgewogCQl0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby0mZ3Q7bWFwcGluZywgZm9saW8pOwotCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCWdvdG8gbm9fc3BsaXQ7CiAJfQogCiAJLyoKQEAgLTI0OCw5ICYjNDM7MjU0LDEwIEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiAJaWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKQogCQlmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7CiAJaWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlnb3RvIG5vX3NwbGl0OwogCiAJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tJmd0O21hcHBpbmcpOwomIzQzOwltaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tJmd0O21hcHBpbmcpOwogCXNwbGl0X2F0ID0gZm9saW9fcGFnZShmb2xpbywgUEFHRV9BTElHTl9ET1dOKG9mZnNldCkgLyBQQUdFX1NJWkUpOwogCWlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7CiAJCS8qCkBAIC0yNTksMzggJiM0MzsyNjYsNjcgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKIAkJICogZm9yIHNobWVtIHRydW5jYXRlCiAJCSAqLwogCQlzdHJ1Y3QgZm9saW8gKmZvbGlvMjsKJiM0MzsJCWJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7CiAKLQkJaWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSkKLQkJCWdvdG8gbm9fc3BsaXQ7CiYjNDM7CQlpZiAocGVuZCkKJiM0MzsJCQkqcGVuZCA9IHJvdW5kX2Rvd24ocG9zICYjNDM7IG9mZnNldCAmIzQzOyBsZW5ndGgsCiYjNDM7CQkJCQkgICBtaW5fbnJieXRlcykgJmd0OyZndDsgUEFHRV9TSElGVDsKIAomIzQzOwkJaWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSkKJiM0MzsJCQlnb3RvIHNwbGl0OwomIzQzO3JldHJ5OgogCQlzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLAogCQkJCVBBR0VfQUxJR05fRE9XTihvZmZzZXQgJiM0MzsgbGVuZ3RoKSAvIFBBR0VfU0laRSk7CiAJCWZvbGlvMiA9IHBhZ2VfZm9saW8oc3BsaXRfYXQyKTsKIAogCQlpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSkKLQkJCWdvdG8gbm9fc3BsaXQ7CiYjNDM7CQkJZ290byBzcGxpdDsKIAogCQlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSkKIAkJCWdvdG8gb3V0OwogCi0JCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKQomIzQzOwkJaWYgKCFmb2xpb190cnlsb2NrKGZvbGlvMikpIHsKJiM0MzsJCQl0YWlsX2lzb2xhdGVkID0gZmFsc2U7CiAJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50CiYjNDM7CQkgKiBzcGxpdC4gUmV0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBmb2xpbyBpbiBjYXNlIGl0JiMzOTtzIHN0aWxsCiYjNDM7CQkgKiBsYXJnZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHBhZ2VfZm9saW8oc3BsaXRfYXQyKSAhPSBmb2xpbzIpIHsKJiM0MzsJCQlmb2xpb191bmxvY2soZm9saW8yKTsKJiM0MzsJCQlmb2xpb19wdXQoZm9saW8yKTsKJiM0MzsJCQlnb3RvIHJldHJ5OwomIzQzOwkJfQogCiAJCS8qIG1ha2Ugc3VyZSBmb2xpbzIgaXMgbGFyZ2UgYW5kIGRvZXMgbm90IGNoYW5nZSBpdHMgbWFwcGluZyAqLwogCQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvMi0mZ3Q7bWFwcGluZyA9PSBmb2xpby0mZ3Q7bWFwcGluZykKLQkJCWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpOwomIzQzOwkJICAgIGZvbGlvMi0mZ3Q7bWFwcGluZyA9PSBmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpCiYjNDM7CQkJdGFpbF9pc29sYXRlZCA9IGZhbHNlOwogCiAJCWZvbGlvX3VubG9jayhmb2xpbzIpOwogb3V0OgomIzQzOwkJaWYgKCF0YWlsX2lzb2xhdGVkICZhbXA7JmFtcDsgcGVuZCkKJiM0MzsJCQkqcGVuZCA9IGZvbGlvMi0mZ3Q7aW5kZXg7CiAJCWZvbGlvX3B1dChmb2xpbzIpOwotbm9fc3BsaXQ6CiYjNDM7c3BsaXQ6CiYjNDM7CQlpZiAocHN0YXJ0KQomIzQzOwkJCSpwc3RhcnQgPSByb3VuZF91cChwb3MgJiM0Mzsgb2Zmc2V0LAomIzQzOwkJCQkJICAgbWluX25yYnl0ZXMpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXJldHVybiB0cnVlOwogCX0KLQlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCi0JCXJldHVybiBmYWxzZTsKLQl0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby0mZ3Q7bWFwcGluZywgZm9saW8pOwotCXJldHVybiB0cnVlOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKJiM0Mztub19zcGxpdDoKJiM0MzsJaWYgKHBzdGFydCkKJiM0MzsJCSpwc3RhcnQgPSBvZmZzZXQgPyBmb2xpb19uZXh0X2luZGV4KGZvbGlvKSA6IGZvbGlvLSZndDtpbmRleDsKJiM0MzsJaWYgKHBlbmQpCiYjNDM7CQkqcGVuZCA9IChwb3MgJiM0Mzsgc2l6ZSAmZ3Q7ICh1NjQpbGVuZCkgPyBmb2xpby0mZ3Q7aW5kZXggOgomIzQzOwkJCQkJCSAgIGZvbGlvX25leHRfaW5kZXgoZm9saW8pOwomIzQzOwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC00MTMsMTEgJiM0Mzs0NDksOCBAQCB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCWZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgJmd0OyZndDsgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApOwogCWlmICghSVNfRVJSKGZvbGlvKSkgewogCQlzYW1lX2ZvbGlvID0gbGVuZCAmbHQ7IGZvbGlvX25leHRfcG9zKGZvbGlvKTsKLQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7Ci0JCQlzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pOwotCQkJaWYgKHNhbWVfZm9saW8pCi0JCQkJZW5kID0gZm9saW8tJmd0O2luZGV4OwotCQl9CiYjNDM7CQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsICZhbXA7c3RhcnQsCiYjNDM7CQkJCQkgICAgIHNhbWVfZm9saW8gPyAmYW1wO2VuZCA6IE5VTEwpOwogCQlmb2xpb191bmxvY2soZm9saW8pOwogCQlmb2xpb19wdXQoZm9saW8pOwogCQlmb2xpbyA9IE5VTEw7CkBAIC00MjcsOCAmIzQzOzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCWZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kICZndDsmZ3Q7IFBBR0VfU0hJRlQsCiAJCQkJCQlGR1BfTE9DSywgMCk7CiAJCWlmICghSVNfRVJSKGZvbGlvKSkgewotCQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKJiM0MzsJCQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsICZhbXA7ZW5kKTsKIAkJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCQlmb2xpb19wdXQoZm9saW8pOwogCQl9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODA4CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgSW1wbGljYXRpb25zKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBmb2N1c2VkIG9uIHdoZXRoZXIgd2UgbmVlZCB0byBjb25zaWRlciBLTVNBTiBmdXp6aW5nIG9yIGlmIEtBU0FOIGlzIGFkZXF1YXRlIGZvciB0aGlzIHBhdGNoLiBJIHNlZSB0aGF0IGl0IHRvdWNoZXMgYG1tL2ludGVybmFsLmhgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vdHJ1bmNhdGUuY2Ag4oCTIHRoYXQmIzM5O3MgYSBrZXkgYXJlYSB0byB3YXRjaC4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBtb2RpZnlpbmcgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIGFuZCBpdHMgY2FsbGVycyBpbiBgc2htZW1fdW5kb19yYW5nZWAgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAuCgpMb29raW5nIGF0IHRoZSBjaGFuZ2VzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIEkgc2VlIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGFsdGVyYXRpb25zLiBUaGUgYWRkaXRpb24gb2YgYHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZGAgdG8gcmV0dXJuIHBhZ2UgaW5kaWNlcyBpcyBpbnRlcmVzdGluZywgYW5kIHRoZSBjaGFuZ2VzIGluIGluZGV4IGNvbXB1dGF0aW9uIHJlbGF0ZWQgdG8gZm9saW8gc3BsaXR0aW5nIGFyZSBpbW1lZGlhdGVseSByYWlzaW5nIGEgZmxhZy4gSSYjMzk7bSBhbHNvIG5vdGluZyB0aGUgY2hhbmdlIGluIHRoZSByZXR1cm4gdmFsdWUgc2VtYW50aWNzIOKAkyByZXR1cm5pbmcgYHRydWVgIG9ubHkgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCBub3cg4oCTIHRoYXQmIzM5O3Mgc29tZXRoaW5nIHRoYXQgY291bGQgc3VidGx5IGNoYW5nZSB0aGUgY29udHJvbCBmbG93IGluIHRoZSBjYWxsZXJzLiBUaGUgdXBkYXRlcyB0byB0aG9zZSBjYWxsZXJzLCBzcGVjaWZpY2FsbHkgYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCB0byBwYXNzIGAmYW1wO3N0YXJ0YCBhbmQgYCZhbXA7ZW5kYCBwb2ludGVycywgYXJlIGFsc28gaW1wb3J0YW50IHRvIGV4YW1pbmUuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGNhbGxlcnMgYW5kIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhlIHZhcmlhYmxlcyBiZWluZyBwYXNzZWQgdG8gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLiBJJiMzOTttIHN0YXJ0aW5nIGJ5IGV4YW1pbmluZyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCBhcyBJIGNhbiBmaW5kIGl0IGluIGBtbS90cnVuY2F0ZS5jYCBhcm91bmQgbGluZSA0MTMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgYXJlIHVzZWQsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIG9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIHRoYXQgbWlnaHQgYmUgZXhwb3NlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSBtb3JlIGFnZ3Jlc3NpdmUgZnV6emluZyBhcHByb2FjaCB0byBjYXRjaCBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gdGhpcyBjcml0aWNhbCBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3RydW5jYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzOTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM5NTpcdCAqIG1hcHBpbmcgaXMgbGFyZ2UsIGl0IGlzIHByb2JhYmx5IHRoZSBjYXNlIHRoYXQgdGhlIGZpbmFsIHBhZ2VzIGFyZSB0aGUgbW9zdFxuIDM5NjpcdCAqIHJlY2VudGx5IHRvdWNoZWQsIGFuZCBmcmVlaW5nIGhhcHBlbnMgaW4gYXNjZW5kaW5nIGZpbGUgb2Zmc2V0IG9yZGVyLlxuIDM5NzpcdCAqXG4gMzk4Olx0ICogTm90ZSB0aGF0IHNpbmNlIC1cdTAwM2VpbnZhbGlkYXRlX2ZvbGlvKCkgYWNjZXB0cyByYW5nZSB0byBpbnZhbGlkYXRlXG4gMzk5Olx0ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgaXMgYWJsZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGVuZCAmIzQzOyAxIGlzIG5vdFxuIDQwMDpcdCAqIHBhZ2UgYWxpZ25lZCBwcm9wZXJseS5cbiA0MDE6XHQgKi9cbiA0MDI6XHR2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIDQwMzpcdFx0XHRcdFx0bG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXG4gNDA0Olx0e1xuIDQwNTpcdFx0cGdvZmZfdFx0XHRzdGFydDtcdFx0LyogaW5jbHVzaXZlICovXG4gNDA2Olx0XHRwZ29mZl90XHRcdGVuZDtcdFx0LyogZXhjbHVzaXZlICovXG4gNDA3Olx0XHRzdHJ1Y3QgZm9saW9fYmF0Y2ggZmJhdGNoO1xuIDQwODpcdFx0cGdvZmZfdFx0XHRpbmRpY2VzW0ZPTElPX0JBVENIX1NJWkVdO1xuIDQwOTpcdFx0cGdvZmZfdFx0XHRpbmRleDtcbiA0MTA6XHRcdGludFx0XHRpO1xuIDQxMTpcdFx0c3RydWN0IGZvbGlvXHQqZm9saW87XG4gNDEyOlx0XHRib29sXHRcdHNhbWVfZm9saW87XG4gNDEzOlx0XG4gNDE0Olx0XHRpZiAobWFwcGluZ19lbXB0eShtYXBwaW5nKSlcbiA0MTU6XHRcdFx0cmV0dXJuO1xuIDQxNjpcdFxuIDQxNzpcdFx0LypcbiA0MTg6XHRcdCAqICYjMzk7c3RhcnQmIzM5OyBhbmQgJiMzOTtlbmQmIzM5OyBhbHdheXMgY292ZXJzIHRoZSByYW5nZSBvZiBwYWdlcyB0byBiZSBmdWxseVxuIDQxOTpcdFx0ICogdHJ1bmNhdGVkLiBQYXJ0aWFsIHBhZ2VzIGFyZSBjb3ZlcmVkIHdpdGggJiMzOTtwYXJ0aWFsX3N0YXJ0JiMzOTsgYXQgdGhlXG4gNDIwOlx0XHQgKiBzdGFydCBvZiB0aGUgcmFuZ2UgYW5kICYjMzk7cGFydGlhbF9lbmQmIzM5OyBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZS5cbiA0MjE6XHRcdCAqIE5vdGUgdGhhdCAmIzM5O2VuZCYjMzk7IGlzIGV4Y2x1c2l2ZSB3aGlsZSAmIzM5O2xlbmQmIzM5OyBpcyBpbmNsdXNpdmUuXG4gNDIyOlx0XHQgKi9cbiA0MjM6XHRcdHN0YXJ0ID0gKGxzdGFydCAmIzQzOyBQQUdFX1NJWkUgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA0MjQ6XHRcdGlmIChsZW5kID09IC0xKVxuIDQyNTpcdFx0XHQvKlxuIDQyNjpcdFx0XHQgKiBsZW5kID09IC0xIGluZGljYXRlcyBlbmQtb2YtZmlsZSBzbyB3ZSBoYXZlIHRvIHNldCAmIzM5O2VuZCYjMzk7XG4gNDI3Olx0XHRcdCAqIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHBnb2ZmX3QgYW5kIHNpbmNlIHRoZSB0eXBlIGlzXG4gNDI4Olx0XHRcdCAqIHVuc2lnbmVkIHdlJiMzOTtyZSB1c2luZyAtMS5cbiA0Mjk6XHRcdFx0ICovXG4gNDMwOlx0XHRcdGVuZCA9IC0xO1xuIDQzMTpcdFx0ZWxzZVxuIDQzMjpcdFx0XHRlbmQgPSAobGVuZCAmIzQzOyAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA0MzM6XHRcbiA0MzQ6XHRcdGZvbGlvX2JhdGNoX2luaXQoXHUwMDI2ZmJhdGNoKTtcbiA0MzU6XHRcdGluZGV4ID0gc3RhcnQ7XG4gNDM2Olx0XHR3aGlsZSAoaW5kZXggXHUwMDNjIGVuZCBcdTAwMjZcdTAwMjYgZmluZF9sb2NrX2VudHJpZXMobWFwcGluZywgXHUwMDI2aW5kZXgsIGVuZCAtIDEsXG4gNDM3Olx0XHRcdFx0XHUwMDI2ZmJhdGNoLCBpbmRpY2VzKSkge1xuIDQzODpcdFx0XHR0cnVuY2F0ZV9mb2xpb19iYXRjaF9leGNlcHRpb25hbHMobWFwcGluZywgXHUwMDI2ZmJhdGNoLCBpbmRpY2VzKTtcbiA0Mzk6XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZm9saW9fYmF0Y2hfY291bnQoXHUwMDI2ZmJhdGNoKTsgaSYjNDM7JiM0MzspXG4gNDQwOlx0XHRcdFx0dHJ1bmNhdGVfY2xlYW51cF9mb2xpbyhmYmF0Y2guZm9saW9zW2ldKTtcbiA0NDE6XHRcdFx0ZGVsZXRlX2Zyb21fcGFnZV9jYWNoZV9iYXRjaChtYXBwaW5nLCBcdTAwMjZmYmF0Y2gpO1xuIDQ0MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBmb2xpb19iYXRjaF9jb3VudChcdTAwMjZmYmF0Y2gpOyBpJiM0MzsmIzQzOylcbiA0NDM6XHRcdFx0XHRmb2xpb191bmxvY2soZmJhdGNoLmZvbGlvc1tpXSk7XG4gNDQ0Olx0XHRcdGZvbGlvX2JhdGNoX3JlbGVhc2UoXHUwMDI2ZmJhdGNoKTtcbiA0NDU6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gNDQ2Olx0XHR9XG4gNDQ3Olx0XG4gNDQ4Olx0XHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgPT0gKGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuIDQ0OTpcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApO1xuIDQ1MDpcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4gNDUxOlx0XHRcdHNhbWVfZm9saW8gPSBsZW5kIFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XG4gNDUyOlx0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4gNDUzOlx0XHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIDQ1NDpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDQ1NTpcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDQ1NjpcdFx0XHRmb2xpbyA9IE5VTEw7XG4gNDU3Olx0XHR9XG4gNDU4Olx0XG4gNDU5Olx0XHRpZiAoIXNhbWVfZm9saW8pIHtcbiA0NjA6XHRcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsXG4gNDYxOlx0XHRcdFx0XHRcdFx0RkdQX0xPQ0ssIDApO1xuIDQ2MjpcdFx0XHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiA0NjM6XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFx1MDAyNmVuZCk7XG4gNDY0Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiA0NjU6XHRcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDQ2NjpcdFx0XHR9XG4gNDY3Olx0XHR9XG4gNDY4Olx0XG4gNDY5Olx0XHRpbmRleCA9IHN0YXJ0O1xuIDQ3MDpcdFx0d2hpbGUgKGluZGV4IFx1MDAzYyBlbmQpIHtcbiA0NzE6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gNDcyOlx0XHRcdGlmICghZmluZF9nZXRfZW50cmllcyhtYXBwaW5nLCBcdTAwMjZpbmRleCwgZW5kIC0gMSwgXHUwMDI2ZmJhdGNoLFxuIDQ3MzpcdFx0XHRcdFx0aW5kaWNlcykpIHtcbiA0NzQ6XHRcdFx0XHQvKiBJZiBhbGwgZ29uZSBmcm9tIHN0YXJ0IG9ud2FyZHMsIHdlJiMzOTtyZSBkb25lICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4MzUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYG1tL3NobWVtLmNgKioKCk9rYXksIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIuIEJhc2VkIG9uIHRoZSBjdXJyZW50IGlzc3VlLCBteSBpbnR1aXRpb24gaXMgcG9pbnRpbmcgbWUgdG93YXJkcyB0aGUgc2hhcmVkIG1lbW9yeSBjb2RlLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgbW0vc2htZW0uY2AsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IGNhbmRpZGF0ZSBmb3IgdGhlIHR5cGUgb2YgbWVtb3J5IGludGVyYWN0aW9uIHRoZSBpc3N1ZSBpcyByZWxhdGVkIHRvLiBUaGUgYmVoYXZpb3IgcmVwb3J0ZWQgaGFzIGEgY2VydGFpbiBudWFuY2UgYW5kIHRoZSBzaGFyZWQgbWVtb3J5IGltcGxlbWVudGF0aW9ucyBzb21ldGltZXMgaGF2ZSBzdWJ0bGUgaXNzdWVzLiBJ4oCZbSB0aGlua2luZyB0aGVyZSBtaWdodCBiZSBzb21ldGhpbmcgcmVsYXRlZCB0byBhbGxvY2F0aW9uIG9yIHN5bmNocm9uaXphdGlvbiB0aGVyZS4gTm93LCBzcGVjaWZpY2FsbHksIGdpdmVuIHdoYXQgSSYjMzk7bSBzZWVpbmcsIGxldCYjMzk7cyB6ZXJvIGluIG9uIHRoZSBhcmVhIGFyb3VuZCBsaW5lIDExNzUuIFRoYXQgZmVlbHMgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBzcGVjaWZpYyBsaW5lIGFuZCB3aGF0IGl0JiMzOTtzIGRvaW5nLCBhbmQgc2VlIGlmIGl0JiMzOTtzIGNvbnRyaWJ1dGluZyB0byB0aGlzIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3NobWVtLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTA6XHRcdFx0XHRcdG5yX3N3YXBzX2ZyZWVkICYjNDM7PSBzaG1lbV9mcmVlX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjExNTE6XHRcdFx0XHRcdFx0XHRcdFx0ICBlbmQgLSAxLCBmb2xpbyk7XG4xMTUyOlx0XHRcdFx0XHRjb250aW51ZTtcbjExNTM6XHRcdFx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRcdFx0aWYgKCF1bmZhbGxvYyB8fCAhZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpXG4xMTU2Olx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4xMTU3Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbjExNTg6XHRcdFx0fVxuMTE1OTpcdFx0XHRmb2xpb19iYXRjaF9yZW1vdmVfZXhjZXB0aW9uYWxzKFx1MDAyNmZiYXRjaCk7XG4xMTYwOlx0XHRcdGZvbGlvX2JhdGNoX3JlbGVhc2UoXHUwMDI2ZmJhdGNoKTtcbjExNjE6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4xMTYyOlx0XHR9XG4xMTYzOlx0XG4xMTY0Olx0XHQvKlxuMTE2NTpcdFx0ICogV2hlbiB1bmRvaW5nIGEgZmFpbGVkIGZhbGxvY2F0ZSwgd2Ugd2FudCBub25lIG9mIHRoZSBwYXJ0aWFsIGZvbGlvXG4xMTY2Olx0XHQgKiB6ZXJvaW5nIGFuZCBzcGxpdHRpbmcgYmVsb3csIGJ1dCBzaGFsbCB3YW50IHRvIHRydW5jYXRlIHRoZSB3aG9sZVxuMTE2NzpcdFx0ICogZm9saW8gd2hlbiAhdXB0b2RhdGUgaW5kaWNhdGVzIHRoYXQgaXQgd2FzIGFkZGVkIGJ5IHRoaXMgZmFsbG9jYXRlLFxuMTE2ODpcdFx0ICogZXZlbiB3aGVuIFtsc3RhcnQsIGxlbmRdIGNvdmVycyBvbmx5IGEgcGFydCBvZiB0aGUgZm9saW8uXG4xMTY5Olx0XHQgKi9cbjExNzA6XHRcdGlmICh1bmZhbGxvYylcbjExNzE6XHRcdFx0Z290byB3aG9sZV9mb2xpb3M7XG4xMTcyOlx0XG4xMTczOlx0XHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgPT0gKGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMTE3NDpcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbjExNzU6XHRcdGlmIChmb2xpbykge1xuMTE3NjpcdFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuMTE3NzpcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbjExNzg6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcdTAwMjZzdGFydCxcbjExNzk6XHRcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4xMTgwOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xMTgxOlx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4xMTgyOlx0XHRcdGZvbGlvID0gTlVMTDtcbjExODM6XHRcdH1cbjExODQ6XHRcbjExODU6XHRcdGlmICghc2FtZV9mb2xpbylcbjExODY6XHRcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4xMTg3Olx0XHRpZiAoZm9saW8pIHtcbjExODg6XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4xMTg5Olx0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbjExOTA6XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbjExOTE6XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjExOTI6XHRcdH1cbjExOTM6XHRcbjExOTQ6XHR3aG9sZV9mb2xpb3M6XG4xMTk1Olx0XG4xMTk2Olx0XHRpbmRleCA9IHN0YXJ0O1xuMTE5NzpcdFx0d2hpbGUgKGluZGV4IFx1MDAzYyBlbmQpIHtcbjExOTg6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmICghZmluZF9nZXRfZW50cmllcyhtYXBwaW5nLCBcdTAwMjZpbmRleCwgZW5kIC0gMSwgXHUwMDI2ZmJhdGNoLFxuMTIwMTpcdFx0XHRcdFx0aW5kaWNlcykpIHtcbjEyMDI6XHRcdFx0XHQvKiBJZiBhbGwgZ29uZSBvciBob2xlLXB1bmNoIG9yIHVuZmFsbG9jLCB3ZSYjMzk7cmUgZG9uZSAqL1xuMTIwMzpcdFx0XHRcdGlmIChpbmRleCA9PSBzdGFydCB8fCBlbmQgIT0gLTEpXG4xMjA0Olx0XHRcdFx0XHRicmVhaztcbjEyMDU6XHRcdFx0XHQvKiBCdXQgaWYgdHJ1bmNhdGluZywgcmVzdGFydCB0byBtYWtlIHN1cmUgYWxsIGdvbmUgKi9cbjEyMDY6XHRcdFx0XHRpbmRleCA9IHN0YXJ0O1xuMTIwNzpcdFx0XHRcdGNvbnRpbnVlO1xuMTIwODpcdFx0XHR9XG4xMjA5Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFx1MDAyNmZiYXRjaCk7IGkmIzQzOyYjNDM7KSB7XG4xMjEwOlx0XHRcdFx0Zm9saW8gPSBmYmF0Y2guZm9saW9zW2ldO1xuMTIxMTpcdFxuMTIxMjpcdFx0XHRcdGlmICh4YV9pc192YWx1ZShmb2xpbykpIHtcbjEyMTM6XHRcdFx0XHRcdGludCBvcmRlcjtcbjEyMTQ6XHRcdFx0XHRcdGxvbmcgc3dhcHNfZnJlZWQ7XG4xMjE1Olx0XG4xMjE2Olx0XHRcdFx0XHRpZiAodW5mYWxsb2MpXG4xMjE3Olx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTIxODpcdFx0XHRcdFx0c3dhcHNfZnJlZWQgPSBzaG1lbV9mcmVlX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjEyMTk6XHRcdFx0XHRcdFx0XHRcdCAgICAgIGVuZCAtIDEsIGZvbGlvKTtcbjEyMjA6XHRcdFx0XHRcdGlmICghc3dhcHNfZnJlZWQpIHtcbjEyMjE6XHRcdFx0XHRcdFx0cGdvZmZfdCBiYXNlID0gaW5kaWNlc1tpXTtcbjEyMjI6XHRcbjEyMjM6XHRcdFx0XHRcdFx0b3JkZXIgPSBzaG1lbV9jb25maXJtX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjEyMjQ6XHRcdFx0XHRcdFx0XHRcdFx0ICAgcmFkaXhfdG9fc3dwX2VudHJ5KGZvbGlvKSk7XG4xMjI1Olx0XHRcdFx0XHRcdC8qXG4xMjI2Olx0XHRcdFx0XHRcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XG4xMjI3Olx0XHRcdFx0XHRcdCAqIGJvcmRlciwgc2tpcCBpdCBhcyB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1xuMTIyODpcdFx0XHRcdFx0XHQgKiBhYm92ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB6ZXJvZCBpdHMgY29udGVudCBvbmNlLlxuMTIyOTpcdFx0XHRcdFx0XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDc6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODI4MAoJCQkJCQkJb3V0cHV0OiAyMjMKCQkJCQkJCXRob3VnaHRzOiA4ODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGlzIGNsZWFybHkgZm9jdXNlZCBvbiByZWZpbmluZyBob3cgd2UgaGFuZGxlIHBhcnRpYWwgZm9saW9zIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLiBTcGVjaWZpY2FsbHksIGl0JiMzOTtzIGNsZWFuaW5nIHVwIHRoZSBpbnRlcmZhY2UgdG8gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLiBJbnN0ZWFkIG9mIHRoZSBjYWxsZXIgaGF2aW5nIHRvIGZpZ3VyZSBvdXQgc3RhcnQgYW5kIGVuZCBwYWdlIG9mZnNldHMgYmFzZWQgb24gcmV0dXJuIHZhbHVlcywgdGhlIGZ1bmN0aW9uIG5vdyBkaXJlY3RseSB1cGRhdGVzIGAqcHN0YXJ0YCBhbmQgYCpwZW5kYC4gTWFrZXMgc2Vuc2Ug4oCTIG1vcmUgZXhwbGljaXQgaXMgZ2VuZXJhbGx5IGJldHRlciwgYW5kIGl0IHNpbXBsaWZpZXMgdGhlIGxvZ2ljIG9uIHRoZSBjYWxsZXImIzM5O3Mgc2lkZS4KClRoZSBtYWluIGNoYW5nZXMgc2VlbSB0byBiZSBpbiBob3cgaXQgZGVhbHMgd2l0aCBsYXJnZSBmb2xpbyBzcGxpdHMuIEl0IGxvb2tzIGxpa2UgYHBzdGFydGAgYW5kIGBwZW5kYCBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIG9yIGBzaG1lbV91bmRvX3JhbmdlYCwgYW5kIHRoZW4gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIGRvZXMgdGhlIGFzc2lnbm1lbnRzLiBJIHNlZSB0aGUgYXNzaWdubWVudHMgYXJlIGJhc2VkIG9uIHdoZXRoZXIgZm9saW8gc3BsaXR0aW5nIGlzIHN1Y2Nlc3NmdWw6IGlmIGBmb2xpb19zcGxpdF9vcl91bm1hcGAgd29ya3MsIHdlIHVwZGF0ZSBgKnBlbmRgIGFuZCBgKnBzdGFydGAgd2l0aCB0aGUgY29ycmVjdGx5IHJvdW5kZWQgdmFsdWVzLiBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQsIG5vIG1hdHRlciB0aGUgcGF0aCwgd2hldGhlciBhIHNwbGl0IG9jY3VycyBvciBub3QsIHRoZSBgcHN0YXJ0YCBhbmQgYHBlbmRgIHBvaW50ZXJzLCBpZiBwcm92aWRlZCwgZ2V0IGluaXRpYWxpemVkLiBUaGUgY2FsbGVyJiMzOTtzIGBzdGFydGAgYW5kIGBlbmRgIHdlcmUgcHJlLWluaXRpYWxpemVkLCBzbyB0aGlzIGF2b2lkcyB0aGUgaW5pdGlhbCB2YXJpYWJsZSBpc3N1ZSBlbnRpcmVseS4KCk5vdywgZm9yIEtNU0FOLiBUaGUgY3JpdGljYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnk/IExldCYjMzk7cyBnbyB0aHJvdWdoIHRoZSBLTVNBTiBjcml0ZXJpYS4gRmlyc3QsIGtlcm5lbCBzdHJ1Y3R1cmVzIHBhc3NlZCB0byB1c2VyIHNwYWNlOiBub3BlLCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHBhZ2UgY2FjaGUgb3BlcmF0aW9ucyDigJMgYWxsIHdpdGhpbiBrZXJuZWwgc3BhY2UuIFNlY29uZCwgY29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIExvY2FsIHZhcmlhYmxlcywgaW5jbHVkaW5nIHRoaW5ncyBsaWtlIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGFuZCB0aGUgZm9saW9zIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgY2FsbGVyIGluaXRpYWxpemVzIGBzdGFydGAgYW5kIGBlbmRgLiBObyByaXNrIHRoZXJlLiBUaGlyZCwgYWxsb2NhdGlvbiBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcz8gQWdhaW4sIG5vLiBBbmQgZm91cnRoLCBhbnkgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIGJ5dGVzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYm91bmRzIGNoZWNrcyBvciBsZW5ndGggY2FsY3VsYXRpb25zPyBUaGUgY29kZSBpcyBtb3N0bHkgYWJvdXQgbWVtb3J5IG1hbmFnZW1lbnQ6IHplcm9pbmcgcG9ydGlvbnMgb2YgZm9saW9zIHdpdGggYGZvbGlvX3plcm9fcmFuZ2VgLCBzcGxpdHRpbmcgdGhlbSwgYW5kIHRydW5jYXRpb24gaXRzZWxmLiBaZXJvaW5nIHBhZ2UgY29udGVudCBpcyBsZWdpdGltYXRlIGFuZCBleHBlY3RlZC4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJiMzOTtsbCBnbyB0aHJvdWdoIHRoZSB2YXJpYWJsZXMuIGBtaW5fbnJieXRlc2AgaXMgaW5pdGlhbGl6ZWQuIGB0YWlsX2lzb2xhdGVkYCBpcyBleHBsaWNpdGx5IGluaXRpYWxpemVkIHRvIGB0cnVlYC4gYGZvbGlvMmAgaXMgaW5pdGlhbGl6ZWQuIGBzcGxpdF9hdGAgYW5kIGBzcGxpdF9hdDJgIGFyZSBhbHNvIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFNvLCBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBiZWluZyB1c2VkLCBwZXJpb2QuCgpUaGVyZWZvcmUsIHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCByYWNlIGNvbmRpdGlvbnMsIGxvY2tpbmcsIG9yIG91dC1vZi1ib3VuZHMgdHJ1bmNhdGlvbiByYW5nZXMgd2lsbCBiZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBWTSBhc3NlcnRpb25zLiBUaW1lIHRvIG1vdmUgb24gYW5kIHByZXBhcmUgdGhlIGNhbGwgZm9yIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA3OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGZvbGlvIHNwbGl0dGluZyBhbmQgcmFuZ2UgY2FsY3VsYXRpb24gbG9naWMgaW4gdGhlIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiBjb2RlIChgbW0vdHJ1bmNhdGUuY2AsIGBtbS9zaG1lbS5jYCwgYW5kIGBtbS9pbnRlcm5hbC5oYCkgYnkgcmV0dXJuaW5nIHVwZGF0ZWQgcGFnZSByYW5nZSBib3VuZGFyaWVzIHZpYSBgcHN0YXJ0YCBhbmQgYHBlbmRgIHBvaW50ZXJzLlxuXG5BbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwb2ludGVycyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIChgbWluX25yYnl0ZXNgLCBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBgZm9saW8yYCwgYCpwc3RhcnRgLCBgKnBlbmRgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgY2FsbGVyIHZhcmlhYmxlcyAoYHN0YXJ0YCwgYGVuZGApIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkIHByaW9yIHRvIGludm9jYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVncyBpbiBwYWdlIGNhY2hlIHRydW5jYXRpb24sIGZvbGlvIHNwbGl0dGluZywgb3IgcmVmZXJlbmNlIGNvdW50aW5nIHdvdWxkIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgbG9ja2luZywgb3IgcGFnZSBzdGF0ZSBpbnZhbGlkYXRpb24sIHdoaWNoIGFyZSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHBhZ2UgY2FjaGUgYXNzZXJ0aW9ucyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBmb2xpbyBzcGxpdHRpbmcgYW5kIHJhbmdlIGNhbGN1bGF0aW9uIGxvZ2ljIGluIHRoZSBwYWdlIGNhY2hlIHRydW5jYXRpb24gY29kZSAoYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGApIGJ5IHJldHVybmluZyB1cGRhdGVkIHBhZ2UgcmFuZ2UgYm91bmRhcmllcyB2aWEgYHBzdGFydGAgYW5kIGBwZW5kYCBwb2ludGVycy5cblxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxMC44MDcxNDMwNTJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Nzg4NTc3OTg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MTAuODA3MTQ5NDgyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDgwMDY0ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBkODAzMGE0MWUwYjBiNjg2N2E0YjNlYzIyM2MxNjc5OTE1Y2I2NzcwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcXG5pbmRleCA2OGRiNWFiZDBhNGNlLi42ZTZhZDMxODczNzhhIDEwMDY0NFxcbi0tLSBhL21tL2ludGVybmFsLmhcXG4rKysgYi9tbS9pbnRlcm5hbC5oXFxuQEAgLTYyNyw4ICs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXFxuIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxcbiBcXHRcXHRwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpO1xcbiBpbnQgdHJ1bmNhdGVfaW5vZGVfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LFxcbi1cXHRcXHRsb2ZmX3QgZW5kKTtcXG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxuK1xcdFxcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbiB1bnNpZ25lZCBsb25nIG1hcHBpbmdfdHJ5X2ludmFsaWRhdGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdFxcdHBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kLCB1bnNpZ25lZCBsb25nICpucl9mYWlsZWQpO1xcbmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uY1xcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XFxuLS0tIGEvbW0vc2htZW0uY1xcbisrKyBiL21tL3NobWVtLmNcXG5AQCAtMTE3NSwxMSArMTE3NSw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXFxuIFxcdGlmIChmb2xpbykge1xcbiBcXHRcXHRzYW1lX2ZvbGlvID0gbGVuZCBcXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcXG4gXFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbi1cXHRcXHRcXHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xcbi1cXHRcXHRcXHRpZiAoc2FtZV9mb2xpbylcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbi1cXHRcXHR9XFxuK1xcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIFxcdFxcdGZvbGlvID0gTlVMTDtcXG5AQCAtMTE4OSw4ICsxMTg2LDcgQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcXG4gXFx0XFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4gXFx0aWYgKGZvbGlvKSB7XFxuIFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbi1cXHRcXHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXFxuLVxcdFxcdFxcdGVuZCA9IGZvbGlvLVxcdTAwM2VpbmRleDtcXG4rXFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG4gXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gXFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gXFx0fVxcbkBAIC0xMjU4LDcgKzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxcbiBcXG4gXFx0XFx0XFx0XFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xcbiBcXHRcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbitcXHRcXHRcXHRcXHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHtcXG4gXFx0XFx0XFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0XFx0XFx0ICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzb1xcbiBcXHRcXHRcXHRcXHRcXHQgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuXFxuZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jXFxuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcXG4tLS0gYS9tbS90cnVuY2F0ZS5jXFxuKysrIGIvbW0vdHJ1bmNhdGUuY1xcbkBAIC0yMDYsMzUgKzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCxcXG4gLypcXG4gICogSGFuZGxlIHBhcnRpYWwgZm9saW9zLiAgVGhlIGZvbGlvIG1heSBiZSBlbnRpcmVseSB3aXRoaW4gdGhlXFxuICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlXFxuLSAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXFxuKyAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtsc3RhcnQsIGxlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWZcXG4gICogaXQncyBsYXJnZS4gIHNwbGl0X3BhZ2VfcmFuZ2UoKSB3aWxsIGRpc2NhcmQgcGFnZXMgd2hpY2ggbm93IGxpZSBiZXlvbmRcXG4gICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhXFxuICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS5cXG4gICpcXG4tICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkXFxuLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuXFxuKyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcXG4rICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXFxuKyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmVcXG4rICogdG8gZGlzY2FyZC5cXG4rICpcXG4rICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuXFxuICAqL1xcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxcbitib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcXG4rXFx0XFx0XFx0XFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxcbiB7XFxuIFxcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xcbiBcXHRzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pO1xcbiBcXHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XFxuIFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcXG4rXFx0dW5zaWduZWQgbG9uZyBtaW5fbnJieXRlcztcXG4gXFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4gXFxuLVxcdGlmIChwb3MgXFx1MDAzYyBzdGFydClcXG4tXFx0XFx0b2Zmc2V0ID0gc3RhcnQgLSBwb3M7XFxuK1xcdGlmIChwb3MgXFx1MDAzYyBsc3RhcnQpXFxuK1xcdFxcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcXG4gXFx0ZWxzZVxcbiBcXHRcXHRvZmZzZXQgPSAwO1xcbi1cXHRpZiAocG9zICsgc2l6ZSBcXHUwMDNjPSAodTY0KWVuZClcXG4rXFx0aWYgKHBvcyArIHNpemUgXFx1MDAzYz0gKHU2NClsZW5kKVxcbiBcXHRcXHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xcbiBcXHRlbHNlXFxuLVxcdFxcdGxlbmd0aCA9IGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XFxuK1xcdFxcdGxlbmd0aCA9IGxlbmQgKyAxIC0gcG9zIC0gb2Zmc2V0O1xcbiBcXG4gXFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xcbiBcXHRpZiAobGVuZ3RoID09IHNpemUpIHtcXG4gXFx0XFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXFx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdGdvdG8gbm9fc3BsaXQ7XFxuIFxcdH1cXG4gXFxuIFxcdC8qXFxuQEAgLTI0OCw5ICsyNTQsMTAgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcXG4gXFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxcbiBcXHRcXHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XFxuIFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHRnb3RvIG5vX3NwbGl0O1xcbiBcXG4gXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbitcXHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbiBcXHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcXG4gXFx0aWYgKCFmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbywgc3BsaXRfYXQsIG1pbl9vcmRlcikpIHtcXG4gXFx0XFx0LypcXG5AQCAtMjU5LDM4ICsyNjYsNjcgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcXG4gXFx0XFx0ICogZm9yIHNobWVtIHRydW5jYXRlXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcXG4rXFx0XFx0Ym9vbCB0YWlsX2lzb2xhdGVkID0gdHJ1ZTtcXG4gXFxuLVxcdFxcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcXG4tXFx0XFx0XFx0Z290byBub19zcGxpdDtcXG4rXFx0XFx0aWYgKHBlbmQpXFxuK1xcdFxcdFxcdCpwZW5kID0gcm91bmRfZG93bihwb3MgKyBvZmZzZXQgKyBsZW5ndGgsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIG1pbl9ucmJ5dGVzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXG4rXFx0XFx0aWYgKG9mZnNldCArIGxlbmd0aCA9PSBzaXplKVxcbitcXHRcXHRcXHRnb3RvIHNwbGl0O1xcbityZXRyeTpcXG4gXFx0XFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcXG4gXFx0XFx0XFx0XFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xcbiBcXHRcXHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XFxuIFxcbiBcXHRcXHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcXG4tXFx0XFx0XFx0Z290byBub19zcGxpdDtcXG4rXFx0XFx0XFx0Z290byBzcGxpdDtcXG4gXFxuIFxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFxuLVxcdFxcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKVxcbitcXHRcXHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkge1xcbitcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50XFxuK1xcdFxcdCAqIHNwbGl0LiBSZXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGZvbGlvIGluIGNhc2UgaXQncyBzdGlsbFxcbitcXHRcXHQgKiBsYXJnZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XFxuK1xcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xcbitcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8yKTtcXG4rXFx0XFx0XFx0Z290byByZXRyeTtcXG4rXFx0XFx0fVxcbiBcXG4gXFx0XFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXFxuIFxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvMi1cXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cXHUwMDNlbWFwcGluZylcXG4tXFx0XFx0XFx0Zm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcik7XFxuK1xcdFxcdCAgICBmb2xpbzItXFx1MDAzZW1hcHBpbmcgPT0gZm9saW8tXFx1MDAzZW1hcHBpbmcgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKVxcbitcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIFxcbiBcXHRcXHRmb2xpb191bmxvY2soZm9saW8yKTtcXG4gb3V0OlxcbitcXHRcXHRpZiAoIXRhaWxfaXNvbGF0ZWQgXFx1MDAyNlxcdTAwMjYgcGVuZClcXG4rXFx0XFx0XFx0KnBlbmQgPSBmb2xpbzItXFx1MDAzZWluZGV4O1xcbiBcXHRcXHRmb2xpb19wdXQoZm9saW8yKTtcXG4tbm9fc3BsaXQ6XFxuK3NwbGl0OlxcbitcXHRcXHRpZiAocHN0YXJ0KVxcbitcXHRcXHRcXHQqcHN0YXJ0ID0gcm91bmRfdXAocG9zICsgb2Zmc2V0LFxcbitcXHRcXHRcXHRcXHRcXHQgICBtaW5fbnJieXRlcykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdH1cXG4tXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVxcdTAwM2VtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdHJldHVybiB0cnVlO1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxcbitcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cXHUwMDNlbWFwcGluZywgZm9saW8pO1xcbitub19zcGxpdDpcXG4rXFx0aWYgKHBzdGFydClcXG4rXFx0XFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXFx1MDAzZWluZGV4O1xcbitcXHRpZiAocGVuZClcXG4rXFx0XFx0KnBlbmQgPSAocG9zICsgc2l6ZSBcXHUwMDNlICh1NjQpbGVuZCkgPyBmb2xpby1cXHUwMDNlaW5kZXggOlxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MTMsMTEgKzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApO1xcbiBcXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcXG4gXFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxuLVxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbi1cXHRcXHRcXHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xcbi1cXHRcXHRcXHRpZiAoc2FtZV9mb2xpbylcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbi1cXHRcXHR9XFxuK1xcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIFxcdFxcdGZvbGlvID0gTlVMTDtcXG5AQCAtNDI3LDggKzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdEZHUF9MT0NLLCAwKTtcXG4gXFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSlcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbitcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFxcdTAwMjZlbmQpO1xcbiBcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiBcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbiBcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjExLjQxNjA3NTE1NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE0MTUzNDc5MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU0hNRU1cIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1wiLFxuICAgIFwic2htZW1fdW5kb19yYW5nZVwiLFxuICAgIFwidHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3RydW5jYXRlLmMgYW5kIG1tL3NobWVtLmMgZm9yIGhhbmRsaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIHdoZW4gdHJ1bmNhdGluZyBwYWdlY2FjaGUgYW5kIHNobWVtIHJhbmdlcy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCB0cnVuY2F0aW9uIGFuZCBob2xlLXB1bmNoaW5nIHN5c2NhbGxzIChlLmcuLCB0cnVuY2F0ZSwgZnRydW5jYXRlLCBmYWxsb2NhdGUpIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGZvbGlvIHNwbGl0dGluZyBhbmQgaW5kZXggYm91bmRhcnkgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZDgwMzBhNDFlMGIwYjY4NjdhNGIzZWMyMjNjMTY3OTkxNWNiNjc3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggNjhkYjVhYmQwYTRjZS4uNmU2YWQzMTg3Mzc4YSAxMDA2NDRcbi0tLSBhL21tL2ludGVybmFsLmhcbisrKyBiL21tL2ludGVybmFsLmhcbkBAIC02MjcsOCArNjI3LDggQEAgdW5zaWduZWQgZmluZF9sb2NrX2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxuIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxuIFx0XHRwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpO1xuIGludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCxcbi1cdFx0bG9mZl90IGVuZCk7XG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4rXHRcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xuIGxvbmcgbWFwcGluZ19ldmljdF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gdW5zaWduZWQgbG9uZyBtYXBwaW5nX3RyeV9pbnZhbGlkYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIFx0XHRwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwgdW5zaWduZWQgbG9uZyAqbnJfZmFpbGVkKTtcbmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uY1xuaW5kZXggODlhMTQ5NWU1NWY3ZS4uNGVmYmJiYmE1ZGE1OSAxMDA2NDRcbi0tLSBhL21tL3NobWVtLmNcbisrKyBiL21tL3NobWVtLmNcbkBAIC0xMTc1LDExICsxMTc1LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbiBcdGlmIChmb2xpbykge1xuIFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuIFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4rXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHRmb2xpbyA9IE5VTEw7XG5AQCAtMTE4OSw4ICsxMTg2LDcgQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbiBcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXHRpZiAoZm9saW8pIHtcbiBcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSlcbi1cdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbitcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0fVxuQEAgLTEyNTgsNyArMTI1NCw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXG4gXHRcdFx0XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4gXHRcdFx0XHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xuK1x0XHRcdFx0fSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLFxuK1x0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuIFx0XHRcdFx0XHQvKlxuIFx0XHRcdFx0XHQgKiBJZiB3ZSBzcGxpdCBhIHBhZ2UsIHJlc2V0IHRoZSBsb29wIHNvXG4gXHRcdFx0XHRcdCAqIHRoYXQgd2UgcGljayB1cCB0aGUgbmV3IHN1YiBwYWdlcy5cbmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuY1xuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcbi0tLSBhL21tL3RydW5jYXRlLmNcbisrKyBiL21tL3RydW5jYXRlLmNcbkBAIC0yMDYsMzUgKzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCxcbiAvKlxuICAqIEhhbmRsZSBwYXJ0aWFsIGZvbGlvcy4gIFRoZSBmb2xpbyBtYXkgYmUgZW50aXJlbHkgd2l0aGluIHRoZVxuICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlXG4tICogZm9saW8gdGhhdCdzIHdpdGhpbiB0aGUgW3N0YXJ0LCBlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWZcbisgKiBmb2xpbyB0aGF0J3Mgd2l0aGluIHRoZSBbbHN0YXJ0LCBsZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXG4gICogaXQncyBsYXJnZS4gIHNwbGl0X3BhZ2VfcmFuZ2UoKSB3aWxsIGRpc2NhcmQgcGFnZXMgd2hpY2ggbm93IGxpZSBiZXlvbmRcbiAgKiBpX3NpemUsIGFuZCB3ZSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gZGlzY2FyZCBwYWdlcyB3aGljaCBsaWUgd2l0aGluIGFcbiAgKiBuZXdseSBjcmVhdGVkIGhvbGUuXG4gICpcbi0gKiBSZXR1cm5zIGZhbHNlIGlmIHNwbGl0dGluZyBmYWlsZWQgc28gdGhlIGNhbGxlciBjYW4gYXZvaWRcbi0gKiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUgZm9saW8gd2hpY2ggaXMgc3R1YmJvcm5seSB1bnNwbGl0LlxuKyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcbisgKiBwYWdlIHJhbmdlIGZ1bGx5IGNvdmVyZWQgYnkgW2xzdGFydCwgbGVuZF0gYWZ0ZXIgYW55IHNwbGl0IChvciBub25lKSxcbisgKiBpLmUuIHRoZSByYW5nZSBvZiBwYWdlcyB0aGF0IGFyZSB3aG9sbHkgd2l0aGluIFtsc3RhcnQsIGxlbmRdIGFuZCBzbyBzYWZlXG4rICogdG8gZGlzY2FyZC5cbisgKlxuKyAqIFJldHVybiAldHJ1ZSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0LCAlZmFsc2Ugb3RoZXJ3aXNlLlxuICAqL1xuLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4rXHRcdFx0XHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXG4ge1xuIFx0bG9mZl90IHBvcyA9IGZvbGlvX3Bvcyhmb2xpbyk7XG4gXHRzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pO1xuIFx0dW5zaWduZWQgaW50IG9mZnNldCwgbGVuZ3RoO1xuIFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCAqc3BsaXRfYXQyO1xuK1x0dW5zaWduZWQgbG9uZyBtaW5fbnJieXRlcztcbiBcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4gXG4tXHRpZiAocG9zIFx1MDAzYyBzdGFydClcbi1cdFx0b2Zmc2V0ID0gc3RhcnQgLSBwb3M7XG4rXHRpZiAocG9zIFx1MDAzYyBsc3RhcnQpXG4rXHRcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcbiBcdGVsc2VcbiBcdFx0b2Zmc2V0ID0gMDtcbi1cdGlmIChwb3MgKyBzaXplIFx1MDAzYz0gKHU2NCllbmQpXG4rXHRpZiAocG9zICsgc2l6ZSBcdTAwM2M9ICh1NjQpbGVuZClcbiBcdFx0bGVuZ3RoID0gc2l6ZSAtIG9mZnNldDtcbiBcdGVsc2Vcbi1cdFx0bGVuZ3RoID0gZW5kICsgMSAtIHBvcyAtIG9mZnNldDtcbitcdFx0bGVuZ3RoID0gbGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XG4gXG4gXHRmb2xpb193YWl0X3dyaXRlYmFjayhmb2xpbyk7XG4gXHRpZiAobGVuZ3RoID09IHNpemUpIHtcbiBcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0Z290byBub19zcGxpdDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMjQ4LDkgKzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0Z290byBub19zcGxpdDtcbiBcbiBcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKGZvbGlvLVx1MDAzZW1hcHBpbmcpO1xuK1x0bWluX25yYnl0ZXMgPSBtYXBwaW5nX21pbl9mb2xpb19ucmJ5dGVzKGZvbGlvLVx1MDAzZW1hcHBpbmcpO1xuIFx0c3BsaXRfYXQgPSBmb2xpb19wYWdlKGZvbGlvLCBQQUdFX0FMSUdOX0RPV04ob2Zmc2V0KSAvIFBBR0VfU0laRSk7XG4gXHRpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkge1xuIFx0XHQvKlxuQEAgLTI1OSwzOCArMjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4gXHRcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxuIFx0XHQgKi9cbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbzI7XG4rXHRcdGJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7XG4gXG4tXHRcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcbi1cdFx0XHRnb3RvIG5vX3NwbGl0O1xuK1x0XHRpZiAocGVuZClcbitcdFx0XHQqcGVuZCA9IHJvdW5kX2Rvd24ocG9zICsgb2Zmc2V0ICsgbGVuZ3RoLFxuK1x0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXG4rXHRcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcbitcdFx0XHRnb3RvIHNwbGl0O1xuK3JldHJ5OlxuIFx0XHRzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLFxuIFx0XHRcdFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xuIFx0XHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XG4gXG4gXHRcdGlmICghZm9saW9fdHJ5X2dldChmb2xpbzIpKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4rXHRcdFx0Z290byBzcGxpdDtcbiBcbiBcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpXG4gXHRcdFx0Z290byBvdXQ7XG4gXG4tXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKVxuK1x0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkge1xuK1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHQvKlxuK1x0XHQgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50XG4rXHRcdCAqIHNwbGl0LiBSZXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGZvbGlvIGluIGNhc2UgaXQncyBzdGlsbFxuK1x0XHQgKiBsYXJnZS5cbitcdFx0ICovXG4rXHRcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4rXHRcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4rXHRcdFx0Z290byByZXRyeTtcbitcdFx0fVxuIFxuIFx0XHQvKiBtYWtlIHN1cmUgZm9saW8yIGlzIGxhcmdlIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaXRzIG1hcHBpbmcgKi9cbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvMi1cdTAwM2VtYXBwaW5nID09IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4tXHRcdFx0Zm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcik7XG4rXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpXG4rXHRcdFx0dGFpbF9pc29sYXRlZCA9IGZhbHNlO1xuIFxuIFx0XHRmb2xpb191bmxvY2soZm9saW8yKTtcbiBvdXQ6XG4rXHRcdGlmICghdGFpbF9pc29sYXRlZCBcdTAwMjZcdTAwMjYgcGVuZClcbitcdFx0XHQqcGVuZCA9IGZvbGlvMi1cdTAwM2VpbmRleDtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4tbm9fc3BsaXQ6XG4rc3BsaXQ6XG4rXHRcdGlmIChwc3RhcnQpXG4rXHRcdFx0KnBzdGFydCA9IHJvdW5kX3VwKHBvcyArIG9mZnNldCxcbitcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbi1cdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuLVx0cmV0dXJuIHRydWU7XG4rXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuK1x0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cdTAwM2VtYXBwaW5nLCBmb2xpbyk7XG4rbm9fc3BsaXQ6XG4rXHRpZiAocHN0YXJ0KVxuK1x0XHQqcHN0YXJ0ID0gb2Zmc2V0ID8gZm9saW9fbmV4dF9pbmRleChmb2xpbykgOiBmb2xpby1cdTAwM2VpbmRleDtcbitcdGlmIChwZW5kKVxuK1x0XHQqcGVuZCA9IChwb3MgKyBzaXplIFx1MDAzZSAodTY0KWxlbmQpID8gZm9saW8tXHUwMDNlaW5kZXggOlxuK1x0XHRcdFx0XHRcdCAgIGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuK1x0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbiAvKlxuQEAgLTQxMywxMSArNDQ5LDggQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsIEZHUF9MT0NLLCAwKTtcbiBcdGlmICghSVNfRVJSKGZvbGlvKSkge1xuIFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbi1cdFx0XHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuLVx0XHRcdGlmIChzYW1lX2ZvbGlvKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4tXHRcdH1cbitcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcdTAwMjZzdGFydCxcbitcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdGZvbGlvID0gTlVMTDtcbkBAIC00MjcsOCArNDYwLDcgQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsXG4gXHRcdFx0XHRcdFx0RkdQX0xPQ0ssIDApO1xuIFx0XHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbi1cdFx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXG4tXHRcdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbitcdFx0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFx1MDAyNmVuZCk7XG4gXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHR9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxMS40MTYwODI5MjRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MjEyNjQ1ODc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBUaGlzIFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyB0b3VjaGluZyBzb21lIHByZXR0eSBmdW5kYW1lbnRhbCBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBzcGVjaWZpY2FsbHkgd2l0aGluIGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzIGRlYWxpbmcgd2l0aCBjb3JlIHBhZ2VjYWNoZSB0cnVuY2F0aW9uIGxvZ2ljIOKAkyB0aGluZ3MgbGlrZSBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIGBzaG1lbV91bmRvX3JhbmdlYCwgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAuIEl0IGxvb2tzIGxpa2UgaXQncyBkaWdnaW5nIGludG8gaG93IHdlIGhhbmRsZSBwYXJ0aWFsIGZvbGlvcywgaG93IGZvbGlvcyBhcmUgc3BsaXQsIGFuZCBob3cgaW5kZXggcmFuZ2VzIGFyZSBtYW5hZ2VkIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLlxuXG5UaGUgaW1wb3J0YW50IHF1ZXN0aW9uIG5vdyBpcywgaXMgdGhpcyBjb2RlIHJlYWNoYWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBvciB3aXRoIGZ1enppbmc/IEdpdmVuIHRoYXQgdGhpcyBoaXRzIGBtbS90cnVuY2F0ZS5jYCBhbmQgYG1tL3NobWVtLmNgLCBjb3JlIExpbnV4IGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMsIGV4ZWN1dGVkIGR1cmluZyB0cnVuY2F0aW9uLCBob2xlIHB1bmNoaW5nIChlLmcuIGBmYWxsb2NhdGVgKSwgZXZpY3Rpb24sIGV0Yy4sIHRoZSBhbnN3ZXIgaXMgYSByZXNvdW5kaW5nIHllcy4gVGhpcyBpcyBkZWZpbml0ZWx5IGBXb3J0aEZ1enppbmdgLlxuXG5TbywgdG8gc3VtbWFyaXplOlxuXG4xLiAgKipXb3J0aEZ1enppbmc6IHRydWUqKiAtIERlZmluaXRlbHkuIFRoaXMgaGl0cyBjcml0aWNhbCBNTSBjb2RlLlxuMi4gICoqRm9jdXNTeW1ib2xzOioqIEkgbmVlZCB0byBwaW5wb2ludCBleGFjdGx5IHdoYXQgbG9naWMgaXMgYmVpbmcgdG91Y2hlZC4gVGhlIGtleSBzeW1ib2xzIHdpdGhpbiB0aGUgcGF0Y2ggYXJlOlxuICAgICogICBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgKGluIGBtbS90cnVuY2F0ZS5jYClcbiAgICAqICAgYHNobWVtX3VuZG9fcmFuZ2VgIChpbiBgbW0vc2htZW0uY2ApXG4gICAgKiAgIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgKGluIGBtbS90cnVuY2F0ZS5jYClcblxuTm93LCBJJ20gZ29pbmcgdG8gdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBkaXZlIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsZXJzIG9mIHRoZXNlIGZ1bmN0aW9ucywgbG9vayBhdCB0aGUgY29udGV4dCwgdmVyaWZ5IGFueSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcywgYW5kIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBob3cgdGhlc2UgY2hhbmdlcyBjb3VsZCBtYW5pZmVzdCB2dWxuZXJhYmlsaXRpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1OTYsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxOC42Mjg3MzIxMzhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQ2MTg2NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2ludGVybmFsLmg9NjI5PWludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XFxubW0vaW50ZXJuYWwuaDo2MzA6Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxubW0vaW50ZXJuYWwuaC02MzEtXFx0XFx0bG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCk7XFxuLS1cXG5tbS9zaG1lbS5jPTExMTk9c3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcXG4tLVxcbm1tL3NobWVtLmMtMTE3Ny1cXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG5tbS9zaG1lbS5jOjExNzg6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxubW0vc2htZW0uYy0xMTc5LVxcdFxcdFxcdFxcdFxcdCAgICAgc2FtZV9mb2xpbyA/IFxcdTAwMjZlbmQgOiBOVUxMKTtcXG4tLVxcbm1tL3NobWVtLmMtMTE4OC1cXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG5tbS9zaG1lbS5jOjExODk6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG5tbS9zaG1lbS5jLTExOTAtXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4tLVxcbm1tL3NobWVtLmMtMTIyNi1cXHRcXHRcXHRcXHRcXHQgKiBJZiBmb3VuZCBhIGxhcmdlIHN3YXAgZW50cnkgY3Jvc3MgdGhlIGVuZCBvciBzdGFydFxcbm1tL3NobWVtLmM6MTIyNzpcXHRcXHRcXHRcXHRcXHQgKiBib3JkZXIsIHNraXAgaXQgYXMgdGhlIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cXG5tbS9zaG1lbS5jLTEyMjgtXFx0XFx0XFx0XFx0XFx0ICogYWJvdmUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgemVyb2QgaXRzIGNvbnRlbnQgb25jZS5cXG4tLVxcbm1tL3NobWVtLmMtMTI1Ni1cXHRcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XFxubW0vc2htZW0uYzoxMjU3OlxcdFxcdFxcdFxcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbyxcXG5tbS9zaG1lbS5jLTEyNTgtXFx0XFx0XFx0XFx0XFx0XFx0XFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xcbi0tXFxubW0vdHJ1bmNhdGUuYz0xODA9c3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXFxuLS1cXG5tbS90cnVuY2F0ZS5jLTIyMC0gKi9cXG5tbS90cnVuY2F0ZS5jOjIyMTpib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcXG5tbS90cnVuY2F0ZS5jLTIyMi1cXHRcXHRcXHRcXHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXFxuLS1cXG5tbS90cnVuY2F0ZS5jPTQwMj12b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxubW0vdHJ1bmNhdGUuYy00NTEtXFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxubW0vdHJ1bmNhdGUuYzo0NTI6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxubW0vdHJ1bmNhdGUuYy00NTMtXFx0XFx0XFx0XFx0XFx0ICAgICBzYW1lX2ZvbGlvID8gXFx1MDAyNmVuZCA6IE5VTEwpO1xcbi0tXFxubW0vdHJ1bmNhdGUuYy00NjItXFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxubW0vdHJ1bmNhdGUuYzo0NjM6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG5tbS90cnVuY2F0ZS5jLTQ2NC1cXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxOC45NzQ5MjQ5OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDI0MDczODk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBUcnVuY2F0ZSBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIHdlJ3JlIHRhbGtpbmcgYWJvdXQgaW5vZGUgdHJ1bmNhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cnVuY2F0aW9uIHByb2Nlc3MgaXMgYWN0dWFsbHkgKmltcGxlbWVudGVkKiBhdCB0aGUgbG93ZXN0IGxldmVsLiBUaGF0IG1lYW5zIGNoZWNraW5nIG91dCB0aGUgY29yZSBmdW5jdGlvbnMgaGFuZGxpbmcgdGhpcywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGF5ZXIsIGdpdmVuIHRoYXQgd2UncmUgdGFsa2luZyBhYm91dCBwYWdlcyBhbmQgZm9saW9zLiBJJ20gdGhpbmtpbmcsIGJhc2VkIG9uIHBhc3QgZXhwZXJpZW5jZSwgdGhhdCBgbW0vdHJ1bmNhdGUuY2AgaXMgdGhlIGxpa2VseSBwbGFjZSBmb3IgdGhlc2UgbG93LWxldmVsIGltcGxlbWVudGF0aW9ucy4gTW9yZSBzcGVjaWZpY2FsbHksIEknbSB6ZXJvaW5nIGluIG9uIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBrZXkgcGxheWVycywgaGFuZGxpbmcgdGhlIHBhcnRpYWwgdHJ1bmNhdGlvbiBvZiBpbmRpdmlkdWFsIGZvbGlvcyBhbmQgdGhlIHJhbmdlLWJhc2VkIHRydW5jYXRpb24uIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZXkgaW50ZXJhY3QsIGhvdyB0aGV5IGhhbmRsZSBsb2NraW5nLCBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSBjYWNoZS4gSSdsbCBiZSBsb29raW5nIGZvciBudWFuY2VzIGluIGhvdyB0aGV5IGRlYWwgd2l0aCBwYXJ0aWFsbHkgZmlsbGVkIGZvbGlvcywgZGlydHkgcGFnZXMsIGFuZCB0aGUgb3ZlcmFsbCBjb29yZGluYXRpb24gb2YgdGhlIHRydW5jYXRpb24gb3BlcmF0aW9uLiBGcm9tIHRoZXJlLCBJJ2xsIGJlIGFibGUgdG8gaW5mZXIgdGhlIGNyaXRpY2FsIHBhdGgsIGFuZCBpZGVudGlmeSBhbnkgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTAwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjEuMzk5MDAyMzUxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1MzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3RydW5jYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjE1OlxcdCAqIHBhZ2UgcmFuZ2UgZnVsbHkgY292ZXJlZCBieSBbbHN0YXJ0LCBsZW5kXSBhZnRlciBhbnkgc3BsaXQgKG9yIG5vbmUpLFxcbiAyMTY6XFx0ICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxcbiAyMTc6XFx0ICogdG8gZGlzY2FyZC5cXG4gMjE4OlxcdCAqXFxuIDIxOTpcXHQgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cXG4gMjIwOlxcdCAqL1xcbiAyMjE6XFx0Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxuIDIyMjpcXHRcXHRcXHRcXHRcXHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXFxuIDIyMzpcXHR7XFxuIDIyNDpcXHRcXHRsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTtcXG4gMjI1OlxcdFxcdHNpemVfdCBzaXplID0gZm9saW9fc2l6ZShmb2xpbyk7XFxuIDIyNjpcXHRcXHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XFxuIDIyNzpcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7XFxuIDIyODpcXHRcXHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xcbiAyMjk6XFx0XFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4gMjMwOlxcdFxcbiAyMzE6XFx0XFx0aWYgKHBvcyBcXHUwMDNjIGxzdGFydClcXG4gMjMyOlxcdFxcdFxcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcXG4gMjMzOlxcdFxcdGVsc2VcXG4gMjM0OlxcdFxcdFxcdG9mZnNldCA9IDA7XFxuIDIzNTpcXHRcXHRpZiAocG9zICsgc2l6ZSBcXHUwMDNjPSAodTY0KWxlbmQpXFxuIDIzNjpcXHRcXHRcXHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xcbiAyMzc6XFx0XFx0ZWxzZVxcbiAyMzg6XFx0XFx0XFx0bGVuZ3RoID0gbGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XFxuIDIzOTpcXHRcXG4gMjQwOlxcdFxcdGZvbGlvX3dhaXRfd3JpdGViYWNrKGZvbGlvKTtcXG4gMjQxOlxcdFxcdGlmIChsZW5ndGggPT0gc2l6ZSkge1xcbiAyNDI6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXFx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcXG4gMjQzOlxcdFxcdFxcdGdvdG8gbm9fc3BsaXQ7XFxuIDI0NDpcXHRcXHR9XFxuIDI0NTpcXHRcXG4gMjQ2OlxcdFxcdC8qXFxuIDI0NzpcXHRcXHQgKiBXZSBtYXkgYmUgemVyb2luZyBwYWdlcyB3ZSdyZSBhYm91dCB0byBkaXNjYXJkLCBidXQgaXQgYXZvaWRzXFxuIDI0ODpcXHRcXHQgKiBkb2luZyBhIGNvbXBsZXggY2FsY3VsYXRpb24gaGVyZSwgYW5kIHRoZW4gZG9pbmcgdGhlIHplcm9pbmdcXG4gMjQ5OlxcdFxcdCAqIGFueXdheSBpZiB0aGUgcGFnZSBzcGxpdCBmYWlscy5cXG4gMjUwOlxcdFxcdCAqL1xcbiAyNTE6XFx0XFx0aWYgKCFtYXBwaW5nX2luYWNjZXNzaWJsZShmb2xpby1cXHUwMDNlbWFwcGluZykpXFxuIDI1MjpcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSlcXG4gMjU1OlxcdFxcdFxcdGZvbGlvX2ludmFsaWRhdGUoZm9saW8sIG9mZnNldCwgbGVuZ3RoKTtcXG4gMjU2OlxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuIDI1NzpcXHRcXHRcXHRnb3RvIG5vX3NwbGl0O1xcbiAyNTg6XFx0XFxuIDI1OTpcXHRcXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cXHUwMDNlbWFwcGluZyk7XFxuIDI2MDpcXHRcXHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbiAyNjE6XFx0XFx0c3BsaXRfYXQgPSBmb2xpb19wYWdlKGZvbGlvLCBQQUdFX0FMSUdOX0RPV04ob2Zmc2V0KSAvIFBBR0VfU0laRSk7XFxuIDI2MjpcXHRcXHRpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkge1xcbiAyNjM6XFx0XFx0XFx0LypcXG4gMjY0OlxcdFxcdFxcdCAqIHRyeSB0byBzcGxpdCBhdCBvZmZzZXQgKyBsZW5ndGggdG8gbWFrZSBzdXJlIGZvbGlvcyB3aXRoaW5cXG4gMjY1OlxcdFxcdFxcdCAqIHRoZSByYW5nZSBjYW4gYmUgZHJvcHBlZCwgZXNwZWNpYWxseSB0byBhdm9pZCBtZW1vcnkgd2FzdGVcXG4gMjY2OlxcdFxcdFxcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxcbiAyNjc6XFx0XFx0XFx0ICovXFxuIDI2ODpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcXG4gMjY5OlxcdFxcdFxcdGJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7XFxuIDI3MDpcXHRcXG4gMjcxOlxcdFxcdFxcdGlmIChwZW5kKVxcbiAyNzI6XFx0XFx0XFx0XFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyArIG9mZnNldCArIGxlbmd0aCxcXG4gMjczOlxcdFxcdFxcdFxcdFxcdFxcdCAgIG1pbl9ucmJ5dGVzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzQ6XFx0XFxuIDI3NTpcXHRcXHRcXHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXFxuIDI3NjpcXHRcXHRcXHRcXHRnb3RvIHNwbGl0O1xcbiAyNzc6XFx0cmV0cnk6XFxuIDI3ODpcXHRcXHRcXHRzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLFxcbiAyNzk6XFx0XFx0XFx0XFx0XFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xcbiAyODA6XFx0XFx0XFx0Zm9saW8yID0gcGFnZV9mb2xpbyhzcGxpdF9hdDIpO1xcbiAyODE6XFx0XFxuIDI4MjpcXHRcXHRcXHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcXG4gMjgzOlxcdFxcdFxcdFxcdGdvdG8gc3BsaXQ7XFxuIDI4NDpcXHRcXG4gMjg1OlxcdFxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxcbiAyODY6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDI4NzpcXHRcXG4gMjg4OlxcdFxcdFxcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XFxuIDI4OTpcXHRcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIDI5MDpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gMjkxOlxcdFxcdFxcdH1cXG4gMjkyOlxcdFxcbiAyOTM6XFx0XFx0XFx0LypcXG4gMjk0OlxcdFxcdFxcdCAqIHNwbGl0X2F0MiBtYXkgbm8gbG9uZ2VyIGJlbG9uZyB0byBmb2xpbzIgZHVlIHRvIGNvbmN1cnJlbnRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjEuMzk5MTIwMTQxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE0MTc2MDg5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgRGF0YSBDb3JydXB0aW9uIGluIFNoYXJlZCBNZW1vcnkqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGEgcG90ZW50aWFsIGlzc3VlLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gemVybyBpbiBvbiBgc2htZW1fdW5kb19yYW5nZWAgYW5kIHRyYWNlIGl0cyB1c2FnZS4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY2FsbGVycywgYW5kLCBjcnVjaWFsbHksIGhvdyB0aG9zZSBjYWxsZXJzIG1pZ2h0IGludGVyYWN0IHdpdGggYW55IGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGxlYWQgdG8gZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24gaW4gdGhlIHNoYXJlZCBtZW1vcnkgY29udGV4dCDigJMgbmFtZWx5LCBhbnl0aGluZyByZWxhdGVkIHRvIHRydW5jYXRpb24uIFRoZSBjb2RlJ3MgcHJvYmFibHkgZ290IHNvbWUgaW50ZXJlc3RpbmcgaW50ZXJhY3Rpb25zIHdpdGggaG93IGl0IGhhbmRsZXMgY2hhbmdlcyB0byBmaWxlIHNpemUgb3IgZGF0YSByZWdpb25zLCBzbyBJJ2xsIGJlIGxvb2tpbmcgYXQgYWxsIGNhbGxlcnMgb2YgYHRydW5jYXRlYCB3aXRoaW4gYHNobWVtLmNgIGFzIHdlbGwuIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgdHdvIGFyZWFzIGlzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgc29tZXRoaW5nIG9mIGludGVyZXN0LiBMZXQncyBzZWUgd2hhdCB0aGUgYXVkaXQgcmV2ZWFscy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODYwMSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjMuNTQwODgzODkyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyMjk1MjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNobWVtX3VuZG9fcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3NobWVtLmM9MTA4Nz1zdGF0aWMgc3RydWN0IGZvbGlvICpzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IGluZGV4KVxcbi0tXFxubW0vc2htZW0uYy0xMTE4LSAqL1xcbm1tL3NobWVtLmM6MTExOTpzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxcbm1tL3NobWVtLmMtMTEyMC1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgYm9vbCB1bmZhbGxvYylcXG4tLVxcbm1tL3NobWVtLmM9MTI4Mz12b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kKVxcbm1tL3NobWVtLmMtMTI4NC17XFxubW0vc2htZW0uYzoxMjg1OlxcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsIGxzdGFydCwgbGVuZCwgZmFsc2UpO1xcbm1tL3NobWVtLmMtMTI4Ni1cXHRpbm9kZV9zZXRfbXRpbWVfdG9fdHMoaW5vZGUsIGlub2RlX3NldF9jdGltZV9jdXJyZW50KGlub2RlKSk7XFxuLS1cXG5tbS9zaG1lbS5jPTI2MzA9c3RhdGljIGludCBzeW5jaHJvbm91c193YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcXG4tLVxcbm1tL3NobWVtLmMtMjY0Mi0gKiBmYXVsdGluZyBwYWdlcyBpbnRvIHRoZSBob2xlIHdoaWxlIGl0J3MgYmVpbmcgcHVuY2hlZC4gIEFsdGhvdWdoXFxubW0vc2htZW0uYzoyNjQzOiAqIHNobWVtX3VuZG9fcmFuZ2UoKSBkb2VzIHJlbW92ZSB0aGUgYWRkaXRpb25zLCBpdCBtYXkgYmUgdW5hYmxlIHRvXFxubW0vc2htZW0uYy0yNjQ0LSAqIGtlZXAgdXAsIGFzIGVhY2ggbmV3IHBhZ2UgbmVlZHMgaXRzIG93biB1bm1hcF9tYXBwaW5nX3JhbmdlKCkgY2FsbCxcXG4tLVxcbm1tL3NobWVtLmM9MzYwOT1zdGF0aWMgbG9uZyBzaG1lbV9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LFxcbi0tXFxubW0vc2htZW0uYy0zNzE5LVxcdFxcdFxcdGlmIChpbmRleCBcXHUwMDNlIHN0YXJ0KSB7XFxubW0vc2htZW0uYzozNzIwOlxcdFxcdFxcdFxcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsXFxubW0vc2htZW0uYy0zNzIxLVxcdFxcdFxcdFxcdCAgICAobG9mZl90KXN0YXJ0IFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjIzLjU5MzE4OTY5MVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxODU4NDg5MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjpcblxuKipJbnZlc3RpZ2F0aW5nIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgQ2FsbGVycyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIGlzIGJlaW5nIHVzZWQuIEdpdmVuIHRoYXQgaXQgZGVhbHMgd2l0aCBpbm9kZSBwYWdlIHJhbmdlcywgaXQncyBwcmV0dHkgY2xlYXIgdGhhdCBpdCBoYXMgc2lnbmlmaWNhbnQgaW1wbGljYXRpb25zIGZvciBib3RoIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgYW5kIHRoZSBmaWxlc3lzdGVtIChmcykgbGF5ZXJzLiBUaGVyZWZvcmUsIHRoZSBmaXJzdCBsb2dpY2FsIHN0ZXAgaXMgdG8gcGlucG9pbnQgaXRzIGNhbGxlcnMgd2l0aGluIHRob3NlIGFyZWFzIG9mIHRoZSBrZXJuZWwgY29kZWJhc2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoYXQnbGwgZ2l2ZSBtZSBpbnNpZ2h0IGludG8gd2hhdCdzIGJlaW5nIHRydW5jYXRlZCwgd2h5LCBhbmQgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBvciBjb3JyZWN0bmVzcyBpbXBsaWNhdGlvbnMgb2YgYW55IG1vZGlmaWNhdGlvbnMgSSBtaWdodCBiZSBjb25zaWRlcmluZy4gSSBzaG91bGQgc3RhcnQgYnkgc2VhcmNoaW5nIGZvciBjYWxscyBpbiB0aGUgYG1tYCBhbmQgYGZzYCBkaXJlY3Rvcmllcy4gS25vd2luZyB0aGUgY2FsbCBjb250ZXh0LCBlc3BlY2lhbGx5LCBpcyAqY3JpdGljYWwqLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzA5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjUuNzc5MDQwOTQzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjcyMjIwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc2htZW0uYz01NzU0PXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXFxubW0vc2htZW0uYy01NzU1LXtcXG5tbS9zaG1lbS5jOjU3NTY6XFx0dHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtXFx1MDAzZWlfbWFwcGluZywgbHN0YXJ0LCBsZW5kKTtcXG5tbS9zaG1lbS5jLTU3NTctfVxcbi0tXFxubW0vdHJ1bmNhdGUuYz0zNjE9bG9uZyBtYXBwaW5nX2V2aWN0X2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vdHJ1bmNhdGUuYy0zNzgtLyoqXFxubW0vdHJ1bmNhdGUuYzozNzk6ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgLSB0cnVuY2F0ZSByYW5nZSBvZiBwYWdlcyBzcGVjaWZpZWQgYnkgc3RhcnQgXFx1MDAyNiBlbmQgYnl0ZSBvZmZzZXRzXFxubW0vdHJ1bmNhdGUuYy0zODAtICogQG1hcHBpbmc6IG1hcHBpbmcgdG8gdHJ1bmNhdGVcXG4tLVxcbm1tL3RydW5jYXRlLmMtMzk4LSAqIE5vdGUgdGhhdCBzaW5jZSAtXFx1MDAzZWludmFsaWRhdGVfZm9saW8oKSBhY2NlcHRzIHJhbmdlIHRvIGludmFsaWRhdGVcXG5tbS90cnVuY2F0ZS5jOjM5OTogKiB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSBpcyBhYmxlIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsZW5kICsgMSBpcyBub3RcXG5tbS90cnVuY2F0ZS5jLTQwMC0gKiBwYWdlIGFsaWduZWQgcHJvcGVybHkuXFxubW0vdHJ1bmNhdGUuYy00MDEtICovXFxubW0vdHJ1bmNhdGUuYzo0MDI6dm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5tbS90cnVuY2F0ZS5jLTQwMy1cXHRcXHRcXHRcXHRsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcXG4tLVxcbm1tL3RydW5jYXRlLmMtNDk5LX1cXG5tbS90cnVuY2F0ZS5jOjUwMDpFWFBPUlRfU1lNQk9MKHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKTtcXG5tbS90cnVuY2F0ZS5jLTUwMS1cXG4tLVxcbm1tL3RydW5jYXRlLmM9NTE1PXZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpXFxubW0vdHJ1bmNhdGUuYy01MTYte1xcbm1tL3RydW5jYXRlLmM6NTE3OlxcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgKGxvZmZfdCktMSk7XFxubW0vdHJ1bmNhdGUuYy01MTgtfVxcbi0tXFxubW0vdHJ1bmNhdGUuYz05MzY9dm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpXFxuLS1cXG5tbS90cnVuY2F0ZS5jLTk1Ni1cXHRcXHRcXHRcXHQgICAgMSArIHVubWFwX2VuZCAtIHVubWFwX3N0YXJ0LCAwKTtcXG5tbS90cnVuY2F0ZS5jOjk1NzpcXHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBsc3RhcnQsIGxlbmQpO1xcbm1tL3RydW5jYXRlLmMtOTU4LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjUuODM1NzY5NjAyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzODUwNzEzMTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBzaG1lbS5jYCBhbmQgYHRydW5jYXRlLmNgIGFyZSBiZWluZyBpbmNvcnBvcmF0ZWQgaW50byB0aGlzIGJ1aWxkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGBDT05GSUdfU0hNRU1gIGFuZCBwb3RlbnRpYWxseSBvdGhlciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWlnaHQgYWZmZWN0IGBzaG1lbS5jYC4gSSBrbm93IHRoYXQgYHRydW5jYXRlLmNgIGlzIGVzc2VudGlhbGx5IGFsd2F5cyBwYXJ0IG9mIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgYW5kIGlzIGdvaW5nIHRvIGJlIGJ1aWx0IGluIGV2ZXJ5IGluc3RhbmNlLCBzbyBJJ20gbm90IGFzIGNvbmNlcm5lZCB3aXRoIGl0cyBidWlsZCBjb25kaXRpb25hbC4gSSBrbm93IHRoYXQgYHNobWVtLmNgIGlzIGNvbmRpdGlvbmFsbHkgYnVpbHQgd2l0aCBgQ09ORklHX1NITUVNYCAob3IgcG9zc2libHkgYENPTkZJR19UTVBGU2AgZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBlbnZpcm9ubWVudCkuIFRoZXJlZm9yZSwgSSBzaG91bGQgYmUgYWJsZSB0byBhc2NlcnRhaW4gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGJ1aWxkIGJ5IGV4YW1pbmluZyB0aGUgYG1tL01ha2VmaWxlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMjAsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToyOC4yMjA4NDM1NFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQyMzc1MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2htZW1cXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTUxPW9iai15XFx0XFx0XFx0Oj0gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcXFxcXFxuLS1cXG5tbS9NYWtlZmlsZS01My1cXHRcXHRcXHQgICByZWFkYWhlYWQubyBmb2xpby5vIHRydW5jYXRlLm8gdm1zY2FuLm8gc2hyaW5rZXIubyBcXFxcXFxubW0vTWFrZWZpbGU6NTQ6XFx0XFx0XFx0ICAgc2htZW0ubyB1dGlsLm8gbW16b25lLm8gdm1zdGF0Lm8gYmFja2luZy1kZXYubyBcXFxcXFxubW0vTWFrZWZpbGUtNTUtXFx0XFx0XFx0ICAgbW1faW5pdC5vIHBlcmNwdS5vIHNsYWJfY29tbW9uLm8gXFxcXFxcbi0tXFxubW0vc2htZW0uYz01MjA9c3RhdGljIGludCBzaG1lbV9jb25maXJtX3N3YXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgaW5kZXgsXFxuLS1cXG5tbS9zaG1lbS5jLTU2OS0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vc2htZW0uYzo1NzA6LyogaWZkZWYgaGVyZSB0byBhdm9pZCBibG9hdGluZyBzaG1lbS5vIHdoZW4gbm90IG5lY2Vzc2FyeSAqL1xcbm1tL3NobWVtLmMtNTcxLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToyOC4yNzUwODUyNjlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg4MjYwNTQzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbiBJbnZlc3RpZ2F0aW9uKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGVpdGhlciBgQ09ORklHX1NITUVNYCBvciBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcmUgcGVydGluZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdG8gcGlucG9pbnQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGNvbmZpZ3VyYXRpb25zLiBJJ20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSwgc3BlY2lmaWNhbGx5IGxvb2tpbmcgaW4gYG1tL0tjb25maWdgIG9yIGBpbml0L0tjb25maWdgIOKAkyB0aG9zZSBhcmUgdGhlIHVzdWFsIHN1c3BlY3RzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaW5pdGlhbGl6YXRpb24tcmVsYXRlZCBzZXR0aW5ncy4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgbG93ZG93biBvbiB3aGF0IHRoZXNlIG9wdGlvbnMgYWN0dWFsbHkgKmRvKiBhbmQgd2hldGhlciB0aGV5J3JlIGV2ZW4gcmVsZXZhbnQgdG8gd2hhdCBJJ20gY3VycmVudGx5IHdvcmtpbmcgb24uIEdvdHRhIHN0YXJ0IHdpdGggdGhlIGZ1bmRhbWVudGFscywgcmlnaHQ/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjI2LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MzAuMTU3NjkyNjU1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjExODkwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgU0hNRU1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTE4OTY9Y29uZmlnIEVWRU5URkRcXG4tLVxcbmluaXQvS2NvbmZpZy0xOTA0LVxcbmluaXQvS2NvbmZpZzoxOTA1OmNvbmZpZyBTSE1FTVxcbmluaXQvS2NvbmZpZy0xOTA2LVxcdGJvb2wgXFxcIlVzZSBmdWxsIHNobWVtIGZpbGVzeXN0ZW1cXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMC4yMDM4MTgyMDVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTk5MDkzOTE3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgTWVtb3J5IE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGludG8gcG90ZW50aWFsIG9wdGltaXphdGlvbnMgYW5kIGl0IHNlZW1zIGxpa2UgYENPTkZJR19TSE1FTWAgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFyZSB0aGUgb2J2aW91cyBwbGFjZXMgdG8gc3RhcnQgaWYgSSBuZWVkIHRvIGFkanVzdCBtZW1vcnkgYmVoYXZpb3IuIEkgYWxyZWFkeSBrbm93IHRoYXQgYENPTkZJR19TSE1FTWAgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3aGljaCBpcyBnb29kLiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBTSE1FTSBhbmQgVEhQLCBlc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGhvdyB0aGV5IGhhbmRsZSBsYXJnZSBmb2xpb3MgYW5kIHBhZ2VjYWNoZSwgaXMgd2hhdCBJJ20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gcmlnaHQgbm93LiBJJ20gZ29pbmcgdG8gZGlnIGludG8gdGhlIHJlbGF0aW9uc2hpcCwgYW5kIG5lZWQgdG8gY2hlY2sgdGhpbmdzIGxpa2UgYG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyYCBhbmQgYG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXNgLCBvciBhbnkgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhhdCBwZXJ0YWluIHRvIFRIUCBhbmQgbGFyZ2UgZm9saW9zLiBUaG9zZSBhcmUgcHJvYmFibHkgdGhlIGtleXMgdG8gZ2V0dGluZyB0aGlzIHJpZ2h0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk0MSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMi4xOTQ3NjAxNjhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0OTk1NTM5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtYXBwaW5nX21pbl9mb2xpb19vcmRlclwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaD00Njg9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnRcXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo0Njk6bWFwcGluZ19taW5fZm9saW9fb3JkZXIoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDcwLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTQ3Nz1tYXBwaW5nX21pbl9mb2xpb19ucnBhZ2VzKGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTQ3OC17XFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmg6NDc5OlxcdHJldHVybiAxVUwgXFx1MDAzY1xcdTAwM2MgbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDgwLX1cXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTUyOD1zdGF0aWMgaW5saW5lIGJvb2wgbWFwcGluZ19wbWRfZm9saW9fc3VwcG9ydChjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZylcXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTUzMi1cXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo1MzM6XFx0cmV0dXJuIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpIFxcdTAwM2M9IFBNRF9PUkRFUiBcXHUwMDI2XFx1MDAyNlxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTUzNC1cXHQgICAgICAgbWFwcGluZ19tYXhfZm9saW9fb3JkZXIobWFwcGluZykgXFx1MDAzZT0gUE1EX09SREVSO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMi4zNDQ3MjA3NTZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA0MDY0MzM2OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9jdXMgU3ltYm9scyBmb3IgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIHRha2UgYSBsb29rIGF0IHRoZXNlIGBGb2N1c1N5bWJvbHNgLiBJIHNlZSB3ZSdyZSBleGFtaW5pbmc6IGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gR29vZCwgSSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlIHF1aXRlIHRhcmdldGVkLiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgaXMgZGVmaW5pdGVseSBzcGVjaWZpYyB0byB0aGUgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIHN0dWZmLCB3aGljaCBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQsIGFuZCBpcyBub3QgZ29pbmcgdG8gaW1wYWN0IG11Y2ggYmV5b25kIHRoYXQuIFRoZW4gdGhlcmUncyBgc2htZW1fdW5kb19yYW5nZWAgd2hpY2ggZGVhbHMgd2l0aCBzaG1lbSB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLiBBbmQgZmluYWxseSBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIHdoaWNoIGhhbmRsZXMgcGFnZSBjYWNoZSB0cnVuY2F0aW9uLiBBbGwgdmVyeSBmb2N1c2VkIGFyZWFzIG9mIGNvbmNlcm4uXG5cbk5vdywgbGV0J3MganVzdCBxdWlja2x5IHNjYW4gYG1tL3RydW5jYXRlLmNgIGFuZCBgbW0vc2htZW0uY2AgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBtaXNzaW5nIGFueXRoaW5nIG9idmlvdXMgdGhhdCBzaG91bGQgb3Igc2hvdWxkbid0IGJlIGluY2x1ZGVkLiBMb29rcyBsaWtlIHdlJ3ZlIGdvdCB0aGUgZGlyZWN0bHkgbW9kaWZpZWQgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLCBgc2htZW1fdW5kb19yYW5nZWAgdGhhdCdzIGEgZGlyZWN0bHkgbW9kaWZpZWQgY2FsbGVyLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCBhbHNvIGEgZGlyZWN0bHkgbW9kaWZpZWQgY2FsbGVyLiBObyByZWQgZmxhZ3MgdGhlcmUuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayB0aGUgY29uZmlncy4gV2UncmUgbG9va2luZyBhdCBgQ09ORklHX1NITUVNYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9yIGBTSE1FTWAgYW5kIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuXG5cbkFscmlnaHQsIHRpbWUgdG8gbWFrZSBzdXJlIEknbSBzZXR0aW5nIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnMgY29ycmVjdGx5LiBMZXQncyBzZWUuLi4gd2UgbmVlZCBgV29ydGhGdXp6aW5nYCwgYFJlYXNvbmluZ2AsIGBGb2N1c1N5bWJvbHNgLCBhbmQgYEVuYWJsZUNvbmZpZ3NgLlxuXG5GaW5hbGx5LCBhIHF1aWNrIHNhbml0eSBjaGVjayBvZiBhbGwgdGhlIGluc3RydWN0aW9ucy4gSXQncyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhbWQ2NCBRRU1VLiBgV29ydGhGdXp6aW5nYCBzaG91bGQgYmUgYHRydWVgIGJlY2F1c2Ugd2UgYXJlIGluZGVlZCB0b3VjaGluZyBtZW1vcnkgbWFuYWdlbWVudCAoYG1tL2ApIGFuZCByZWZhY3RvcmluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyBsb2dpYy4gRm9yIGBGb2N1c1N5bWJvbHNgLCB3ZSd2ZSBnb3QgdGhvc2Ugd2VsbC1kZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCB1YmlxdWl0b3VzIGFuZCBhcmUgc3BlY2lmaWMgdG8gdGhlIGFyZWFzIGJlaW5nIG1vZGlmaWVkLiBgRW5hYmxlQ29uZmlnc2AgbmVlZHMgdG8gaGF2ZSB0aGUgYENPTkZJR19gIHByZWZpeCBzdHJpcHBlZC5cblxuT2theSwgSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE1MzQsIk91dHB1dFRva2VucyI6MTUxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjQyLjc1MTE1NzMxMVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwMjYxNjc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMxNDI2OTJaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1ODYxNDgzMjY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMyMDE3NDFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1NTg2MDg4Njk1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGQ4MDMwYTQxZTBiMGI2ODY3YTRiM2VjMjIzYzE2Nzk5MTVjYjY3NzBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDA2OjU5OjEwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNjI3LDggKzYyNyw4IEBAIHVuc2lnbmVkIGZpbmRfbG9ja19lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCxcbiB1bnNpZ25lZCBmaW5kX2dldF9lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCxcbiBcdFx0cGdvZmZfdCBlbmQsIHN0cnVjdCBmb2xpb19iYXRjaCAqZmJhdGNoLCBwZ29mZl90ICppbmRpY2VzKTtcbiBpbnQgdHJ1bmNhdGVfaW5vZGVfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsXG4tXHRcdGxvZmZfdCBlbmQpO1xuK2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxuK1x0XHRsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKTtcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0cGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7XG5kaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmNcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XG4tLS0gYS9tbS9zaG1lbS5jXG4rKysgYi9tbS9zaG1lbS5jXG5AQCAtMTE3NSwxMSArMTE3NSw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXHRpZiAoZm9saW8pIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbiBcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xuLVx0XHRcdHN0YXJ0ID0gZm9saW9fbmV4dF9pbmRleChmb2xpbyk7XG4tXHRcdFx0aWYgKHNhbWVfZm9saW8pXG4tXHRcdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbi1cdFx0fVxuK1x0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIFx1MDAyNnN0YXJ0LFxuK1x0XHRcdFx0XHQgICAgIHNhbWVfZm9saW8gPyBcdTAwMjZlbmQgOiBOVUxMKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0Zm9saW8gPSBOVUxMO1xuQEAgLTExODksOCArMTE4Niw3IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXHRcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuIFx0aWYgKGZvbGlvKSB7XG4gXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXG4tXHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdH1cbkBAIC0xMjU4LDcgKzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFxuIFx0XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuIFx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbitcdFx0XHRcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbyxcbitcdFx0XHRcdFx0XHRcdGxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHtcbiBcdFx0XHRcdFx0LypcbiBcdFx0XHRcdFx0ICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzb1xuIFx0XHRcdFx0XHQgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuXG5kaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmNcbmluZGV4IGI1OGJhOTQwYmU0NzQuLmQ4OGExYjE1OTA4NDUgMTAwNjQ0XG4tLS0gYS9tbS90cnVuY2F0ZS5jXG4rKysgYi9tbS90cnVuY2F0ZS5jXG5AQCAtMjA2LDM1ICsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXG4gLypcbiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGVcbiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZVxuLSAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXG4rICogZm9saW8gdGhhdCdzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuICAqIGl0J3MgbGFyZ2UuICBzcGxpdF9wYWdlX3JhbmdlKCkgd2lsbCBkaXNjYXJkIHBhZ2VzIHdoaWNoIG5vdyBsaWUgYmV5b25kXG4gICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhXG4gICogbmV3bHkgY3JlYXRlZCBob2xlLlxuICAqXG4tICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkXG4tICogZGlzY2FyZGluZyB0aGUgZW50aXJlIGZvbGlvIHdoaWNoIGlzIHN0dWJib3JubHkgdW5zcGxpdC5cbisgKiBXaGVuIEBwc3RhcnQgYW5kL29yIEBwZW5kIGFyZSBub24tTlVMTCB0aGV5IHJlY2VpdmUgdGhlIGluZGV4ZXMgb2YgdGhlXG4rICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4rICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxuKyAqIHRvIGRpc2NhcmQuXG4rICpcbisgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cbiAgKi9cbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuK2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxuK1x0XHRcdFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxuIHtcbiBcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xuIFx0c2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDtcbiBcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcbitcdHVuc2lnbmVkIGxvbmcgbWluX25yYnl0ZXM7XG4gXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuIFxuLVx0aWYgKHBvcyBcdTAwM2Mgc3RhcnQpXG4tXHRcdG9mZnNldCA9IHN0YXJ0IC0gcG9zO1xuK1x0aWYgKHBvcyBcdTAwM2MgbHN0YXJ0KVxuK1x0XHRvZmZzZXQgPSBsc3RhcnQgLSBwb3M7XG4gXHRlbHNlXG4gXHRcdG9mZnNldCA9IDA7XG4tXHRpZiAocG9zICsgc2l6ZSBcdTAwM2M9ICh1NjQpZW5kKVxuK1x0aWYgKHBvcyArIHNpemUgXHUwMDNjPSAodTY0KWxlbmQpXG4gXHRcdGxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7XG4gXHRlbHNlXG4tXHRcdGxlbmd0aCA9IGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XG4rXHRcdGxlbmd0aCA9IGxlbmQgKyAxIC0gcG9zIC0gb2Zmc2V0O1xuIFxuIFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xuIFx0aWYgKGxlbmd0aCA9PSBzaXplKSB7XG4gXHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4rXHRcdGdvdG8gbm9fc3BsaXQ7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTI0OCw5ICsyNTQsMTAgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcbiBcdGlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSlcbiBcdFx0Zm9saW9faW52YWxpZGF0ZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpO1xuIFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4rXHRcdGdvdG8gbm9fc3BsaXQ7XG4gXG4gXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cdTAwM2VtYXBwaW5nKTtcbitcdG1pbl9ucmJ5dGVzID0gbWFwcGluZ19taW5fZm9saW9fbnJieXRlcyhmb2xpby1cdTAwM2VtYXBwaW5nKTtcbiBcdHNwbGl0X2F0ID0gZm9saW9fcGFnZShmb2xpbywgUEFHRV9BTElHTl9ET1dOKG9mZnNldCkgLyBQQUdFX1NJWkUpO1xuIFx0aWYgKCFmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbywgc3BsaXRfYXQsIG1pbl9vcmRlcikpIHtcbiBcdFx0LypcbkBAIC0yNTksMzggKzI2Niw2NyBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0XHQgKiBmb3Igc2htZW0gdHJ1bmNhdGVcbiBcdFx0ICovXG4gXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8yO1xuK1x0XHRib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlO1xuIFxuLVx0XHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXG4tXHRcdFx0Z290byBub19zcGxpdDtcbitcdFx0aWYgKHBlbmQpXG4rXHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyArIG9mZnNldCArIGxlbmd0aCxcbitcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuK1x0XHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXG4rXHRcdFx0Z290byBzcGxpdDtcbityZXRyeTpcbiBcdFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcbiBcdFx0XHRcdFBBR0VfQUxJR05fRE9XTihvZmZzZXQgKyBsZW5ndGgpIC8gUEFHRV9TSVpFKTtcbiBcdFx0Zm9saW8yID0gcGFnZV9mb2xpbyhzcGxpdF9hdDIpO1xuIFxuIFx0XHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcbi1cdFx0XHRnb3RvIG5vX3NwbGl0O1xuK1x0XHRcdGdvdG8gc3BsaXQ7XG4gXG4gXHRcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxuIFx0XHRcdGdvdG8gb3V0O1xuIFxuLVx0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSlcbitcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvMikpIHtcbitcdFx0XHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XG4gXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0LypcbitcdFx0ICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudFxuK1x0XHQgKiBzcGxpdC4gUmV0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBmb2xpbyBpbiBjYXNlIGl0J3Mgc3RpbGxcbitcdFx0ICogbGFyZ2UuXG4rXHRcdCAqL1xuK1x0XHRpZiAocGFnZV9mb2xpbyhzcGxpdF9hdDIpICE9IGZvbGlvMikge1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xuK1x0XHRcdGZvbGlvX3B1dChmb2xpbzIpO1xuK1x0XHRcdGdvdG8gcmV0cnk7XG4rXHRcdH1cbiBcbiBcdFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nKVxuLVx0XHRcdGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpO1xuK1x0XHQgICAgZm9saW8yLVx1MDAzZW1hcHBpbmcgPT0gZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKVxuK1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4gb3V0OlxuK1x0XHRpZiAoIXRhaWxfaXNvbGF0ZWQgXHUwMDI2XHUwMDI2IHBlbmQpXG4rXHRcdFx0KnBlbmQgPSBmb2xpbzItXHUwMDNlaW5kZXg7XG4gXHRcdGZvbGlvX3B1dChmb2xpbzIpO1xuLW5vX3NwbGl0OlxuK3NwbGl0OlxuK1x0XHRpZiAocHN0YXJ0KVxuK1x0XHRcdCpwc3RhcnQgPSByb3VuZF91cChwb3MgKyBvZmZzZXQsXG4rXHRcdFx0XHRcdCAgIG1pbl9ucmJ5dGVzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0cmV0dXJuIHRydWU7XG4gXHR9XG4tXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdHJldHVybiB0cnVlO1xuK1x0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbitcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuK25vX3NwbGl0OlxuK1x0aWYgKHBzdGFydClcbitcdFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRpZiAocGVuZClcbitcdFx0KnBlbmQgPSAocG9zICsgc2l6ZSBcdTAwM2UgKHU2NClsZW5kKSA/IGZvbGlvLVx1MDAzZWluZGV4IDpcbitcdFx0XHRcdFx0XHQgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbitcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4gLypcbkBAIC00MTMsMTEgKzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XG4gXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4rXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHRmb2xpbyA9IE5VTEw7XG5AQCAtNDI3LDggKzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuIFx0XHRcdFx0XHRcdEZHUF9MT0NLLCAwKTtcbiBcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0fVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMyMDE4MjZaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA3OTUxNDQ3NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgRnV6emluZyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBmb2N1c2VkIG9uIHdoZXRoZXIgd2UgbmVlZCB0byBjb25zaWRlciBLTVNBTiBmdXp6aW5nIG9yIGlmIEtBU0FOIGlzIGFkZXF1YXRlIGZvciB0aGlzIHBhdGNoLiBJIHNlZSB0aGF0IGl0IHRvdWNoZXMgYG1tL2ludGVybmFsLmhgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vdHJ1bmNhdGUuY2Ag4oCTIHRoYXQncyBhIGtleSBhcmVhIHRvIHdhdGNoLiBTcGVjaWZpY2FsbHksIGl0J3MgbW9kaWZ5aW5nIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgaXRzIGNhbGxlcnMgaW4gYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLlxuXG5Mb29raW5nIGF0IHRoZSBjaGFuZ2VzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIEkgc2VlIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGFsdGVyYXRpb25zLiBUaGUgYWRkaXRpb24gb2YgYHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZGAgdG8gcmV0dXJuIHBhZ2UgaW5kaWNlcyBpcyBpbnRlcmVzdGluZywgYW5kIHRoZSBjaGFuZ2VzIGluIGluZGV4IGNvbXB1dGF0aW9uIHJlbGF0ZWQgdG8gZm9saW8gc3BsaXR0aW5nIGFyZSBpbW1lZGlhdGVseSByYWlzaW5nIGEgZmxhZy4gSSdtIGFsc28gbm90aW5nIHRoZSBjaGFuZ2UgaW4gdGhlIHJldHVybiB2YWx1ZSBzZW1hbnRpY3Mg4oCTIHJldHVybmluZyBgdHJ1ZWAgb25seSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0IG5vdyDigJMgdGhhdCdzIHNvbWV0aGluZyB0aGF0IGNvdWxkIHN1YnRseSBjaGFuZ2UgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgY2FsbGVycy4gVGhlIHVwZGF0ZXMgdG8gdGhvc2UgY2FsbGVycywgc3BlY2lmaWNhbGx5IGBzaG1lbV91bmRvX3JhbmdlYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCwgdG8gcGFzcyBgXHUwMDI2c3RhcnRgIGFuZCBgXHUwMDI2ZW5kYCBwb2ludGVycywgYXJlIGFsc28gaW1wb3J0YW50IHRvIGV4YW1pbmUuXG5cbk5vdywgSSdtIGdvaW5nIHRvIGRpZyBpbnRvIHRoZSBjYWxsZXJzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZSB2YXJpYWJsZXMgYmVpbmcgcGFzc2VkIHRvIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYC4gSSdtIHN0YXJ0aW5nIGJ5IGV4YW1pbmluZyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCBhcyBJIGNhbiBmaW5kIGl0IGluIGBtbS90cnVuY2F0ZS5jYCBhcm91bmQgbGluZSA0MTMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgYXJlIHVzZWQsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIG9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIHRoYXQgbWlnaHQgYmUgZXhwb3NlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSBtb3JlIGFnZ3Jlc3NpdmUgZnV6emluZyBhcHByb2FjaCB0byBjYXRjaCBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gdGhpcyBjcml0aWNhbCBwYXRoLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODA4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NTMuNjI3MTcyMVoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzM3NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdHJ1bmNhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzOTUsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzOTU6XFx0ICogbWFwcGluZyBpcyBsYXJnZSwgaXQgaXMgcHJvYmFibHkgdGhlIGNhc2UgdGhhdCB0aGUgZmluYWwgcGFnZXMgYXJlIHRoZSBtb3N0XFxuIDM5NjpcXHQgKiByZWNlbnRseSB0b3VjaGVkLCBhbmQgZnJlZWluZyBoYXBwZW5zIGluIGFzY2VuZGluZyBmaWxlIG9mZnNldCBvcmRlci5cXG4gMzk3OlxcdCAqXFxuIDM5ODpcXHQgKiBOb3RlIHRoYXQgc2luY2UgLVxcdTAwM2VpbnZhbGlkYXRlX2ZvbGlvKCkgYWNjZXB0cyByYW5nZSB0byBpbnZhbGlkYXRlXFxuIDM5OTpcXHQgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSBpcyBhYmxlIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsZW5kICsgMSBpcyBub3RcXG4gNDAwOlxcdCAqIHBhZ2UgYWxpZ25lZCBwcm9wZXJseS5cXG4gNDAxOlxcdCAqL1xcbiA0MDI6XFx0dm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4gNDAzOlxcdFxcdFxcdFxcdFxcdGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kKVxcbiA0MDQ6XFx0e1xcbiA0MDU6XFx0XFx0cGdvZmZfdFxcdFxcdHN0YXJ0O1xcdFxcdC8qIGluY2x1c2l2ZSAqL1xcbiA0MDY6XFx0XFx0cGdvZmZfdFxcdFxcdGVuZDtcXHRcXHQvKiBleGNsdXNpdmUgKi9cXG4gNDA3OlxcdFxcdHN0cnVjdCBmb2xpb19iYXRjaCBmYmF0Y2g7XFxuIDQwODpcXHRcXHRwZ29mZl90XFx0XFx0aW5kaWNlc1tGT0xJT19CQVRDSF9TSVpFXTtcXG4gNDA5OlxcdFxcdHBnb2ZmX3RcXHRcXHRpbmRleDtcXG4gNDEwOlxcdFxcdGludFxcdFxcdGk7XFxuIDQxMTpcXHRcXHRzdHJ1Y3QgZm9saW9cXHQqZm9saW87XFxuIDQxMjpcXHRcXHRib29sXFx0XFx0c2FtZV9mb2xpbztcXG4gNDEzOlxcdFxcbiA0MTQ6XFx0XFx0aWYgKG1hcHBpbmdfZW1wdHkobWFwcGluZykpXFxuIDQxNTpcXHRcXHRcXHRyZXR1cm47XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdC8qXFxuIDQxODpcXHRcXHQgKiAnc3RhcnQnIGFuZCAnZW5kJyBhbHdheXMgY292ZXJzIHRoZSByYW5nZSBvZiBwYWdlcyB0byBiZSBmdWxseVxcbiA0MTk6XFx0XFx0ICogdHJ1bmNhdGVkLiBQYXJ0aWFsIHBhZ2VzIGFyZSBjb3ZlcmVkIHdpdGggJ3BhcnRpYWxfc3RhcnQnIGF0IHRoZVxcbiA0MjA6XFx0XFx0ICogc3RhcnQgb2YgdGhlIHJhbmdlIGFuZCAncGFydGlhbF9lbmQnIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlLlxcbiA0MjE6XFx0XFx0ICogTm90ZSB0aGF0ICdlbmQnIGlzIGV4Y2x1c2l2ZSB3aGlsZSAnbGVuZCcgaXMgaW5jbHVzaXZlLlxcbiA0MjI6XFx0XFx0ICovXFxuIDQyMzpcXHRcXHRzdGFydCA9IChsc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA0MjQ6XFx0XFx0aWYgKGxlbmQgPT0gLTEpXFxuIDQyNTpcXHRcXHRcXHQvKlxcbiA0MjY6XFx0XFx0XFx0ICogbGVuZCA9PSAtMSBpbmRpY2F0ZXMgZW5kLW9mLWZpbGUgc28gd2UgaGF2ZSB0byBzZXQgJ2VuZCdcXG4gNDI3OlxcdFxcdFxcdCAqIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHBnb2ZmX3QgYW5kIHNpbmNlIHRoZSB0eXBlIGlzXFxuIDQyODpcXHRcXHRcXHQgKiB1bnNpZ25lZCB3ZSdyZSB1c2luZyAtMS5cXG4gNDI5OlxcdFxcdFxcdCAqL1xcbiA0MzA6XFx0XFx0XFx0ZW5kID0gLTE7XFxuIDQzMTpcXHRcXHRlbHNlXFxuIDQzMjpcXHRcXHRcXHRlbmQgPSAobGVuZCArIDEpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDQzMzpcXHRcXG4gNDM0OlxcdFxcdGZvbGlvX2JhdGNoX2luaXQoXFx1MDAyNmZiYXRjaCk7XFxuIDQzNTpcXHRcXHRpbmRleCA9IHN0YXJ0O1xcbiA0MzY6XFx0XFx0d2hpbGUgKGluZGV4IFxcdTAwM2MgZW5kIFxcdTAwMjZcXHUwMDI2IGZpbmRfbG9ja19lbnRyaWVzKG1hcHBpbmcsIFxcdTAwMjZpbmRleCwgZW5kIC0gMSxcXG4gNDM3OlxcdFxcdFxcdFxcdFxcdTAwMjZmYmF0Y2gsIGluZGljZXMpKSB7XFxuIDQzODpcXHRcXHRcXHR0cnVuY2F0ZV9mb2xpb19iYXRjaF9leGNlcHRpb25hbHMobWFwcGluZywgXFx1MDAyNmZiYXRjaCwgaW5kaWNlcyk7XFxuIDQzOTpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZm9saW9fYmF0Y2hfY291bnQoXFx1MDAyNmZiYXRjaCk7IGkrKylcXG4gNDQwOlxcdFxcdFxcdFxcdHRydW5jYXRlX2NsZWFudXBfZm9saW8oZmJhdGNoLmZvbGlvc1tpXSk7XFxuIDQ0MTpcXHRcXHRcXHRkZWxldGVfZnJvbV9wYWdlX2NhY2hlX2JhdGNoKG1hcHBpbmcsIFxcdTAwMjZmYmF0Y2gpO1xcbiA0NDI6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFxcdTAwMjZmYmF0Y2gpOyBpKyspXFxuIDQ0MzpcXHRcXHRcXHRcXHRmb2xpb191bmxvY2soZmJhdGNoLmZvbGlvc1tpXSk7XFxuIDQ0NDpcXHRcXHRcXHRmb2xpb19iYXRjaF9yZWxlYXNlKFxcdTAwMjZmYmF0Y2gpO1xcbiA0NDU6XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIDQ0NjpcXHRcXHR9XFxuIDQ0NzpcXHRcXG4gNDQ4OlxcdFxcdHNhbWVfZm9saW8gPSAobHN0YXJ0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpID09IChsZW5kIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbiA0NDk6XFx0XFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XFxuIDQ1MDpcXHRcXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcXG4gNDUxOlxcdFxcdFxcdHNhbWVfZm9saW8gPSBsZW5kIFxcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xcbiA0NTI6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxuIDQ1MzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIDQ1NDpcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiA0NTU6XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gNDU2OlxcdFxcdFxcdGZvbGlvID0gTlVMTDtcXG4gNDU3OlxcdFxcdH1cXG4gNDU4OlxcdFxcbiA0NTk6XFx0XFx0aWYgKCFzYW1lX2ZvbGlvKSB7XFxuIDQ2MDpcXHRcXHRcXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULFxcbiA0NjE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0RkdQX0xPQ0ssIDApO1xcbiA0NjI6XFx0XFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxuIDQ2MzpcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFxcdTAwMjZlbmQpO1xcbiA0NjQ6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gNDY1OlxcdFxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIDQ2NjpcXHRcXHRcXHR9XFxuIDQ2NzpcXHRcXHR9XFxuIDQ2ODpcXHRcXG4gNDY5OlxcdFxcdGluZGV4ID0gc3RhcnQ7XFxuIDQ3MDpcXHRcXHR3aGlsZSAoaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4gNDcxOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiA0NzI6XFx0XFx0XFx0aWYgKCFmaW5kX2dldF9lbnRyaWVzKG1hcHBpbmcsIFxcdTAwMjZpbmRleCwgZW5kIC0gMSwgXFx1MDAyNmZiYXRjaCxcXG4gNDczOlxcdFxcdFxcdFxcdFxcdGluZGljZXMpKSB7XFxuIDQ3NDpcXHRcXHRcXHRcXHQvKiBJZiBhbGwgZ29uZSBmcm9tIHN0YXJ0IG9ud2FyZHMsIHdlJ3JlIGRvbmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NTMuNjI3MzA4NDUxWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4Nzc2NTgwOTE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYG1tL3NobWVtLmNgKipcblxuT2theSwgSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgZnVydGhlci4gQmFzZWQgb24gdGhlIGN1cnJlbnQgaXNzdWUsIG15IGludHVpdGlvbiBpcyBwb2ludGluZyBtZSB0b3dhcmRzIHRoZSBzaGFyZWQgbWVtb3J5IGNvZGUuIExldCdzIHN0YXJ0IHdpdGggYG1tL3NobWVtLmNgLCBiZWNhdXNlIHRoYXQgc2VlbXMgbGlrZSBhIGxpa2VseSBjYW5kaWRhdGUgZm9yIHRoZSB0eXBlIG9mIG1lbW9yeSBpbnRlcmFjdGlvbiB0aGUgaXNzdWUgaXMgcmVsYXRlZCB0by4gVGhlIGJlaGF2aW9yIHJlcG9ydGVkIGhhcyBhIGNlcnRhaW4gbnVhbmNlIGFuZCB0aGUgc2hhcmVkIG1lbW9yeSBpbXBsZW1lbnRhdGlvbnMgc29tZXRpbWVzIGhhdmUgc3VidGxlIGlzc3Vlcy4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8gYWxsb2NhdGlvbiBvciBzeW5jaHJvbml6YXRpb24gdGhlcmUuIE5vdywgc3BlY2lmaWNhbGx5LCBnaXZlbiB3aGF0IEknbSBzZWVpbmcsIGxldCdzIHplcm8gaW4gb24gdGhlIGFyZWEgYXJvdW5kIGxpbmUgMTE3NS4gVGhhdCBmZWVscyBsaWtlIGEgZ29vZCBzdGFydGluZyBwb2ludCB0byBkaWcgaW4gYW5kIHNlZSB3aGF0J3MgaGFwcGVuaW5nLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBzcGVjaWZpYyBsaW5lIGFuZCB3aGF0IGl0J3MgZG9pbmcsIGFuZCBzZWUgaWYgaXQncyBjb250cmlidXRpbmcgdG8gdGhpcyBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgzNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MjIuNDAzODkyMjI1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM2MjA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9zaG1lbS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNTAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNTA6XFx0XFx0XFx0XFx0XFx0bnJfc3dhcHNfZnJlZWQgKz0gc2htZW1fZnJlZV9zd2FwKG1hcHBpbmcsIGluZGljZXNbaV0sXFxuMTE1MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGVuZCAtIDEsIGZvbGlvKTtcXG4xMTUyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjExNTM6XFx0XFx0XFx0XFx0fVxcbjExNTQ6XFx0XFxuMTE1NTpcXHRcXHRcXHRcXHRpZiAoIXVuZmFsbG9jIHx8ICFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSlcXG4xMTU2OlxcdFxcdFxcdFxcdFxcdHRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTtcXG4xMTU3OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTE1ODpcXHRcXHRcXHR9XFxuMTE1OTpcXHRcXHRcXHRmb2xpb19iYXRjaF9yZW1vdmVfZXhjZXB0aW9uYWxzKFxcdTAwMjZmYmF0Y2gpO1xcbjExNjA6XFx0XFx0XFx0Zm9saW9fYmF0Y2hfcmVsZWFzZShcXHUwMDI2ZmJhdGNoKTtcXG4xMTYxOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjExNjI6XFx0XFx0fVxcbjExNjM6XFx0XFxuMTE2NDpcXHRcXHQvKlxcbjExNjU6XFx0XFx0ICogV2hlbiB1bmRvaW5nIGEgZmFpbGVkIGZhbGxvY2F0ZSwgd2Ugd2FudCBub25lIG9mIHRoZSBwYXJ0aWFsIGZvbGlvXFxuMTE2NjpcXHRcXHQgKiB6ZXJvaW5nIGFuZCBzcGxpdHRpbmcgYmVsb3csIGJ1dCBzaGFsbCB3YW50IHRvIHRydW5jYXRlIHRoZSB3aG9sZVxcbjExNjc6XFx0XFx0ICogZm9saW8gd2hlbiAhdXB0b2RhdGUgaW5kaWNhdGVzIHRoYXQgaXQgd2FzIGFkZGVkIGJ5IHRoaXMgZmFsbG9jYXRlLFxcbjExNjg6XFx0XFx0ICogZXZlbiB3aGVuIFtsc3RhcnQsIGxlbmRdIGNvdmVycyBvbmx5IGEgcGFydCBvZiB0aGUgZm9saW8uXFxuMTE2OTpcXHRcXHQgKi9cXG4xMTcwOlxcdFxcdGlmICh1bmZhbGxvYylcXG4xMTcxOlxcdFxcdFxcdGdvdG8gd2hvbGVfZm9saW9zO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSA9PSAobGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4xMTc0OlxcdFxcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4xMTc1OlxcdFxcdGlmIChmb2xpbykge1xcbjExNzY6XFx0XFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxuMTE3NzpcXHRcXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG4xMTc4OlxcdFxcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbjExNzk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzYW1lX2ZvbGlvID8gXFx1MDAyNmVuZCA6IE5VTEwpO1xcbjExODA6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xMTgxOlxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuMTE4MjpcXHRcXHRcXHRmb2xpbyA9IE5VTEw7XFxuMTE4MzpcXHRcXHR9XFxuMTE4NDpcXHRcXG4xMTg1OlxcdFxcdGlmICghc2FtZV9mb2xpbylcXG4xMTg2OlxcdFxcdFxcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuMTE4NzpcXHRcXHRpZiAoZm9saW8pIHtcXG4xMTg4OlxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbjExODk6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG4xMTkwOlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTE5MTpcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbjExOTI6XFx0XFx0fVxcbjExOTM6XFx0XFxuMTE5NDpcXHR3aG9sZV9mb2xpb3M6XFxuMTE5NTpcXHRcXG4xMTk2OlxcdFxcdGluZGV4ID0gc3RhcnQ7XFxuMTE5NzpcXHRcXHR3aGlsZSAoaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4xMTk4OlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjExOTk6XFx0XFxuMTIwMDpcXHRcXHRcXHRpZiAoIWZpbmRfZ2V0X2VudHJpZXMobWFwcGluZywgXFx1MDAyNmluZGV4LCBlbmQgLSAxLCBcXHUwMDI2ZmJhdGNoLFxcbjEyMDE6XFx0XFx0XFx0XFx0XFx0aW5kaWNlcykpIHtcXG4xMjAyOlxcdFxcdFxcdFxcdC8qIElmIGFsbCBnb25lIG9yIGhvbGUtcHVuY2ggb3IgdW5mYWxsb2MsIHdlJ3JlIGRvbmUgKi9cXG4xMjAzOlxcdFxcdFxcdFxcdGlmIChpbmRleCA9PSBzdGFydCB8fCBlbmQgIT0gLTEpXFxuMTIwNDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xMjA1OlxcdFxcdFxcdFxcdC8qIEJ1dCBpZiB0cnVuY2F0aW5nLCByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBhbGwgZ29uZSAqL1xcbjEyMDY6XFx0XFx0XFx0XFx0aW5kZXggPSBzdGFydDtcXG4xMjA3OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjEyMDg6XFx0XFx0XFx0fVxcbjEyMDk6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFxcdTAwMjZmYmF0Y2gpOyBpKyspIHtcXG4xMjEwOlxcdFxcdFxcdFxcdGZvbGlvID0gZmJhdGNoLmZvbGlvc1tpXTtcXG4xMjExOlxcdFxcbjEyMTI6XFx0XFx0XFx0XFx0aWYgKHhhX2lzX3ZhbHVlKGZvbGlvKSkge1xcbjEyMTM6XFx0XFx0XFx0XFx0XFx0aW50IG9yZGVyO1xcbjEyMTQ6XFx0XFx0XFx0XFx0XFx0bG9uZyBzd2Fwc19mcmVlZDtcXG4xMjE1OlxcdFxcbjEyMTY6XFx0XFx0XFx0XFx0XFx0aWYgKHVuZmFsbG9jKVxcbjEyMTc6XFx0XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTIxODpcXHRcXHRcXHRcXHRcXHRzd2Fwc19mcmVlZCA9IHNobWVtX2ZyZWVfc3dhcChtYXBwaW5nLCBpbmRpY2VzW2ldLFxcbjEyMTk6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZW5kIC0gMSwgZm9saW8pO1xcbjEyMjA6XFx0XFx0XFx0XFx0XFx0aWYgKCFzd2Fwc19mcmVlZCkge1xcbjEyMjE6XFx0XFx0XFx0XFx0XFx0XFx0cGdvZmZfdCBiYXNlID0gaW5kaWNlc1tpXTtcXG4xMjIyOlxcdFxcbjEyMjM6XFx0XFx0XFx0XFx0XFx0XFx0b3JkZXIgPSBzaG1lbV9jb25maXJtX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcXG4xMjI0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHJhZGl4X3RvX3N3cF9lbnRyeShmb2xpbykpO1xcbjEyMjU6XFx0XFx0XFx0XFx0XFx0XFx0LypcXG4xMjI2OlxcdFxcdFxcdFxcdFxcdFxcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XFxuMTIyNzpcXHRcXHRcXHRcXHRcXHRcXHQgKiBib3JkZXIsIHNraXAgaXQgYXMgdGhlIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cXG4xMjI4OlxcdFxcdFxcdFxcdFxcdFxcdCAqIGFib3ZlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHplcm9kIGl0cyBjb250ZW50IG9uY2UuXFxuMTIyOTpcXHRcXHRcXHRcXHRcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MjIuNDA0MjU2Mjc1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE2Mjg4NjE5MDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaXMgY2xlYXJseSBmb2N1c2VkIG9uIHJlZmluaW5nIGhvdyB3ZSBoYW5kbGUgcGFydGlhbCBmb2xpb3MgZHVyaW5nIHRydW5jYXRpb24gYW5kIGhvbGUgcHVuY2hpbmcuIFNwZWNpZmljYWxseSwgaXQncyBjbGVhbmluZyB1cCB0aGUgaW50ZXJmYWNlIHRvIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYC4gSW5zdGVhZCBvZiB0aGUgY2FsbGVyIGhhdmluZyB0byBmaWd1cmUgb3V0IHN0YXJ0IGFuZCBlbmQgcGFnZSBvZmZzZXRzIGJhc2VkIG9uIHJldHVybiB2YWx1ZXMsIHRoZSBmdW5jdGlvbiBub3cgZGlyZWN0bHkgdXBkYXRlcyBgKnBzdGFydGAgYW5kIGAqcGVuZGAuIE1ha2VzIHNlbnNlIOKAkyBtb3JlIGV4cGxpY2l0IGlzIGdlbmVyYWxseSBiZXR0ZXIsIGFuZCBpdCBzaW1wbGlmaWVzIHRoZSBsb2dpYyBvbiB0aGUgY2FsbGVyJ3Mgc2lkZS5cblxuVGhlIG1haW4gY2hhbmdlcyBzZWVtIHRvIGJlIGluIGhvdyBpdCBkZWFscyB3aXRoIGxhcmdlIGZvbGlvIHNwbGl0cy4gSXQgbG9va3MgbGlrZSBgcHN0YXJ0YCBhbmQgYHBlbmRgIGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgd2l0aGluIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgb3IgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgdGhlbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgZG9lcyB0aGUgYXNzaWdubWVudHMuIEkgc2VlIHRoZSBhc3NpZ25tZW50cyBhcmUgYmFzZWQgb24gd2hldGhlciBmb2xpbyBzcGxpdHRpbmcgaXMgc3VjY2Vzc2Z1bDogaWYgYGZvbGlvX3NwbGl0X29yX3VubWFwYCB3b3Jrcywgd2UgdXBkYXRlIGAqcGVuZGAgYW5kIGAqcHN0YXJ0YCB3aXRoIHRoZSBjb3JyZWN0bHkgcm91bmRlZCB2YWx1ZXMuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCwgbm8gbWF0dGVyIHRoZSBwYXRoLCB3aGV0aGVyIGEgc3BsaXQgb2NjdXJzIG9yIG5vdCwgdGhlIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMsIGlmIHByb3ZpZGVkLCBnZXQgaW5pdGlhbGl6ZWQuIFRoZSBjYWxsZXIncyBgc3RhcnRgIGFuZCBgZW5kYCB3ZXJlIHByZS1pbml0aWFsaXplZCwgc28gdGhpcyBhdm9pZHMgdGhlIGluaXRpYWwgdmFyaWFibGUgaXNzdWUgZW50aXJlbHkuXG5cbk5vdywgZm9yIEtNU0FOLiBUaGUgY3JpdGljYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnk/IExldCdzIGdvIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhLiBGaXJzdCwga2VybmVsIHN0cnVjdHVyZXMgcGFzc2VkIHRvIHVzZXIgc3BhY2U6IG5vcGUsIHdlJ3JlIGRlYWxpbmcgd2l0aCBwYWdlIGNhY2hlIG9wZXJhdGlvbnMg4oCTIGFsbCB3aXRoaW4ga2VybmVsIHNwYWNlLiBTZWNvbmQsIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLiBMb2NhbCB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGluZ3MgbGlrZSBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBhbmQgdGhlIGZvbGlvcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIGNhbGxlciBpbml0aWFsaXplcyBgc3RhcnRgIGFuZCBgZW5kYC4gTm8gcmlzayB0aGVyZS4gVGhpcmQsIGFsbG9jYXRpb24gb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBmaWVsZHM/IEFnYWluLCBuby4gQW5kIGZvdXJ0aCwgYW55IHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBieXRlcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGJvdW5kcyBjaGVja3Mgb3IgbGVuZ3RoIGNhbGN1bGF0aW9ucz8gVGhlIGNvZGUgaXMgbW9zdGx5IGFib3V0IG1lbW9yeSBtYW5hZ2VtZW50OiB6ZXJvaW5nIHBvcnRpb25zIG9mIGZvbGlvcyB3aXRoIGBmb2xpb196ZXJvX3JhbmdlYCwgc3BsaXR0aW5nIHRoZW0sIGFuZCB0cnVuY2F0aW9uIGl0c2VsZi4gWmVyb2luZyBwYWdlIGNvbnRlbnQgaXMgbGVnaXRpbWF0ZSBhbmQgZXhwZWN0ZWQuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIGdvIHRocm91Z2ggdGhlIHZhcmlhYmxlcy4gYG1pbl9ucmJ5dGVzYCBpcyBpbml0aWFsaXplZC4gYHRhaWxfaXNvbGF0ZWRgIGlzIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgdG8gYHRydWVgLiBgZm9saW8yYCBpcyBpbml0aWFsaXplZC4gYHNwbGl0X2F0YCBhbmQgYHNwbGl0X2F0MmAgYXJlIGFsc28gaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gU28sIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGJlaW5nIHVzZWQsIHBlcmlvZC5cblxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCByYWNlIGNvbmRpdGlvbnMsIGxvY2tpbmcsIG9yIG91dC1vZi1ib3VuZHMgdHJ1bmNhdGlvbiByYW5nZXMgd2lsbCBiZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBWTSBhc3NlcnRpb25zLiBUaW1lIHRvIG1vdmUgb24gYW5kIHByZXBhcmUgdGhlIGNhbGwgZm9yIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgyODAsIk91dHB1dFRva2VucyI6MjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MzguNjkyODc4NTc2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBmb2xpbyBzcGxpdHRpbmcgYW5kIHJhbmdlIGNhbGN1bGF0aW9uIGxvZ2ljIGluIHRoZSBwYWdlIGNhY2hlIHRydW5jYXRpb24gY29kZSAoYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGApIGJ5IHJldHVybmluZyB1cGRhdGVkIHBhZ2UgcmFuZ2UgYm91bmRhcmllcyB2aWEgYHBzdGFydGAgYW5kIGBwZW5kYCBwb2ludGVycy5cXG5cXG5BbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwb2ludGVycyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIChgbWluX25yYnl0ZXNgLCBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBgZm9saW8yYCwgYCpwc3RhcnRgLCBgKnBlbmRgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgY2FsbGVyIHZhcmlhYmxlcyAoYHN0YXJ0YCwgYGVuZGApIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkIHByaW9yIHRvIGludm9jYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVncyBpbiBwYWdlIGNhY2hlIHRydW5jYXRpb24sIGZvbGlvIHNwbGl0dGluZywgb3IgcmVmZXJlbmNlIGNvdW50aW5nIHdvdWxkIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgbG9ja2luZywgb3IgcGFnZSBzdGF0ZSBpbnZhbGlkYXRpb24sIHdoaWNoIGFyZSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHBhZ2UgY2FjaGUgYXNzZXJ0aW9ucyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-09 06:36:49 +0000 UTC FinishedAt: 2026-09-09 07:00:40 +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": "ba9572bc43d04d71ba52ae7f20645f1eafe86875", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SHMEM", "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": "ba9572bc43d04d71ba52ae7f20645f1eafe86875", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "SHMEM", "TRANSPARENT_HUGEPAGE" ], "series_id": "5ec407be-c4b7-489c-b9af-9127f439c9d3" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "truncate_inode_partial_folio", "shmem_undo_range", "truncate_inode_pages_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NITUVNJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtzaG1lbV91bmRvX3JhbmdlJiMzNDssCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXG5cbkFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXJzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgKGBtaW5fbnJieXRlc2AsIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGBmb2xpbzJgLCBgKnBzdGFydGAsIGAqcGVuZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBjYWxsZXIgdmFyaWFibGVzIChgc3RhcnRgLCBgZW5kYCkgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBidWdzIGluIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiwgZm9saW8gc3BsaXR0aW5nLCBvciByZWZlcmVuY2UgY291bnRpbmcgd291bGQgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBsb2NraW5nLCBvciBwYWdlIHN0YXRlIGludmFsaWRhdGlvbiwgd2hpY2ggYXJlIGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgcGFnZSBjYWNoZSBhc3NlcnRpb25zIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS90cnVuY2F0ZS5jIGFuZCBtbS9zaG1lbS5jIGZvciBoYW5kbGluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyB3aGVuIHRydW5jYXRpbmcgcGFnZWNhY2hlIGFuZCBzaG1lbSByYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgdHJ1bmNhdGlvbiBhbmQgaG9sZS1wdW5jaGluZyBzeXNjYWxscyAoZS5nLiwgdHJ1bmNhdGUsIGZ0cnVuY2F0ZSwgZmFsbG9jYXRlKSBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBmb2xpbyBzcGxpdHRpbmcgYW5kIGluZGV4IGJvdW5kYXJ5IGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZDgwMzBhNDFlMGIwYjY4NjdhNGIzZWMyMjNjMTY3OTkxNWNiNjc3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNjI3LDggJiM0Mzs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXG4gdW5zaWduZWQgZmluZF9nZXRfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXG4gXHRcdHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgZm9saW9fYmF0Y2ggKmZiYXRjaCwgcGdvZmZfdCAqaW5kaWNlcyk7XG4gaW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LFxuLVx0XHRsb2ZmX3QgZW5kKTtcbiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4mIzQzO1x0XHRsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKTtcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0cGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7XG5kaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmNcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XG4tLS0gYS9tbS9zaG1lbS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zaG1lbS5jXG5AQCAtMTE3NSwxMSAmIzQzOzExNzUsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFx0aWYgKGZvbGlvKSB7XG4gXHRcdHNhbWVfZm9saW8gPSBsZW5kIFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XG4gXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbi1cdFx0XHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuLVx0XHRcdGlmIChzYW1lX2ZvbGlvKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4tXHRcdH1cbiYjNDM7XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHNhbWVfZm9saW8gPyBcdTAwMjZlbmQgOiBOVUxMKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0Zm9saW8gPSBOVUxMO1xuQEAgLTExODksOCAmIzQzOzExODYsNyBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFx0XHRmb2xpbyA9IHNobWVtX2dldF9wYXJ0aWFsX2ZvbGlvKGlub2RlLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbiBcdGlmIChmb2xpbykge1xuIFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuJiM0MztcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0fVxuQEAgLTEyNTgsNyAmIzQzOzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFxuIFx0XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuIFx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbiYjNDM7XHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sXG4mIzQzO1x0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuIFx0XHRcdFx0XHQvKlxuIFx0XHRcdFx0XHQgKiBJZiB3ZSBzcGxpdCBhIHBhZ2UsIHJlc2V0IHRoZSBsb29wIHNvXG4gXHRcdFx0XHRcdCAqIHRoYXQgd2UgcGljayB1cCB0aGUgbmV3IHN1YiBwYWdlcy5cbmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuY1xuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcbi0tLSBhL21tL3RydW5jYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3RydW5jYXRlLmNcbkBAIC0yMDYsMzUgJiM0MzsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXG4gLypcbiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGVcbiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZVxuLSAqIGZvbGlvIHRoYXQmIzM5O3Mgd2l0aGluIHRoZSBbc3RhcnQsIGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuJiM0MzsgKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuICAqIGl0JiMzOTtzIGxhcmdlLiAgc3BsaXRfcGFnZV9yYW5nZSgpIHdpbGwgZGlzY2FyZCBwYWdlcyB3aGljaCBub3cgbGllIGJleW9uZFxuICAqIGlfc2l6ZSwgYW5kIHdlIHJlbHkgb24gdGhlIGNhbGxlciB0byBkaXNjYXJkIHBhZ2VzIHdoaWNoIGxpZSB3aXRoaW4gYVxuICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS5cbiAgKlxuLSAqIFJldHVybnMgZmFsc2UgaWYgc3BsaXR0aW5nIGZhaWxlZCBzbyB0aGUgY2FsbGVyIGNhbiBhdm9pZFxuLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuXG4mIzQzOyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcbiYjNDM7ICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4mIzQzOyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmVcbiYjNDM7ICogdG8gZGlzY2FyZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuXG4gICovXG4tYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcbiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4mIzQzO1x0XHRcdFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxuIHtcbiBcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xuIFx0c2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDtcbiBcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xuIFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbiBcbi1cdGlmIChwb3MgXHUwMDNjIHN0YXJ0KVxuLVx0XHRvZmZzZXQgPSBzdGFydCAtIHBvcztcbiYjNDM7XHRpZiAocG9zIFx1MDAzYyBsc3RhcnQpXG4mIzQzO1x0XHRvZmZzZXQgPSBsc3RhcnQgLSBwb3M7XG4gXHRlbHNlXG4gXHRcdG9mZnNldCA9IDA7XG4tXHRpZiAocG9zICYjNDM7IHNpemUgXHUwMDNjPSAodTY0KWVuZClcbiYjNDM7XHRpZiAocG9zICYjNDM7IHNpemUgXHUwMDNjPSAodTY0KWxlbmQpXG4gXHRcdGxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7XG4gXHRlbHNlXG4tXHRcdGxlbmd0aCA9IGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0O1xuJiM0MztcdFx0bGVuZ3RoID0gbGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0O1xuIFxuIFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xuIFx0aWYgKGxlbmd0aCA9PSBzaXplKSB7XG4gXHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRnb3RvIG5vX3NwbGl0O1xuIFx0fVxuIFxuIFx0LypcbkBAIC0yNDgsOSAmIzQzOzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdGdvdG8gbm9fc3BsaXQ7XG4gXG4gXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cdTAwM2VtYXBwaW5nKTtcbiYjNDM7XHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gXHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcbiBcdGlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7XG4gXHRcdC8qXG5AQCAtMjU5LDM4ICYjNDM7MjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4gXHRcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxuIFx0XHQgKi9cbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbzI7XG4mIzQzO1x0XHRib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlO1xuIFxuLVx0XHRpZiAob2Zmc2V0ICYjNDM7IGxlbmd0aCA9PSBzaXplKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4mIzQzO1x0XHRpZiAocGVuZClcbiYjNDM7XHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLFxuJiM0MztcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuJiM0MztcdFx0aWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSlcbiYjNDM7XHRcdFx0Z290byBzcGxpdDtcbiYjNDM7cmV0cnk6XG4gXHRcdHNwbGl0X2F0MiA9IGZvbGlvX3BhZ2UoZm9saW8sXG4gXHRcdFx0XHRQQUdFX0FMSUdOX0RPV04ob2Zmc2V0ICYjNDM7IGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xuIFx0XHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XG4gXG4gXHRcdGlmICghZm9saW9fdHJ5X2dldChmb2xpbzIpKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4mIzQzO1x0XHRcdGdvdG8gc3BsaXQ7XG4gXG4gXHRcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxuIFx0XHRcdGdvdG8gb3V0O1xuIFxuLVx0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSlcbiYjNDM7XHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XG4mIzQzO1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudFxuJiM0MztcdFx0ICogc3BsaXQuIFJldHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgZm9saW8gaW4gY2FzZSBpdCYjMzk7cyBzdGlsbFxuJiM0MztcdFx0ICogbGFyZ2UuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XG4mIzQzO1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xuJiM0MztcdFx0XHRmb2xpb19wdXQoZm9saW8yKTtcbiYjNDM7XHRcdFx0Z290byByZXRyeTtcbiYjNDM7XHRcdH1cbiBcbiBcdFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nKVxuLVx0XHRcdGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpO1xuJiM0MztcdFx0ICAgIGZvbGlvMi1cdTAwM2VtYXBwaW5nID09IGZvbGlvLVx1MDAzZW1hcHBpbmcgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpXG4mIzQzO1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4gb3V0OlxuJiM0MztcdFx0aWYgKCF0YWlsX2lzb2xhdGVkIFx1MDAyNlx1MDAyNiBwZW5kKVxuJiM0MztcdFx0XHQqcGVuZCA9IGZvbGlvMi1cdTAwM2VpbmRleDtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4tbm9fc3BsaXQ6XG4mIzQzO3NwbGl0OlxuJiM0MztcdFx0aWYgKHBzdGFydClcbiYjNDM7XHRcdFx0KnBzdGFydCA9IHJvdW5kX3VwKHBvcyAmIzQzOyBvZmZzZXQsXG4mIzQzO1x0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXHRcdHJldHVybiB0cnVlO1xuIFx0fVxuLVx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cdTAwM2VtYXBwaW5nLCBmb2xpbyk7XG4tXHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuJiM0MztcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuJiM0Mztub19zcGxpdDpcbiYjNDM7XHRpZiAocHN0YXJ0KVxuJiM0MztcdFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXHUwMDNlaW5kZXg7XG4mIzQzO1x0aWYgKHBlbmQpXG4mIzQzO1x0XHQqcGVuZCA9IChwb3MgJiM0Mzsgc2l6ZSBcdTAwM2UgKHU2NClsZW5kKSA/IGZvbGlvLVx1MDAzZWluZGV4IDpcbiYjNDM7XHRcdFx0XHRcdFx0ICAgZm9saW9fbmV4dF9pbmRleChmb2xpbyk7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbiAvKlxuQEAgLTQxMywxMSAmIzQzOzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XG4gXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4mIzQzO1x0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIFx1MDAyNnN0YXJ0LFxuJiM0MztcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdGZvbGlvID0gTlVMTDtcbkBAIC00MjcsOCAmIzQzOzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuIFx0XHRcdFx0XHRcdEZHUF9MT0NLLCAwKTtcbiBcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4mIzQzO1x0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbiBcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtTSE1FTSYjMzQ7LAogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8mIzM0OywKICAgICYjMzQ7c2htZW1fdW5kb19yYW5nZSYjMzQ7LAogICAgJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3RydW5jYXRlLmMgYW5kIG1tL3NobWVtLmMgZm9yIGhhbmRsaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIHdoZW4gdHJ1bmNhdGluZyBwYWdlY2FjaGUgYW5kIHNobWVtIHJhbmdlcy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCB0cnVuY2F0aW9uIGFuZCBob2xlLXB1bmNoaW5nIHN5c2NhbGxzIChlLmcuLCB0cnVuY2F0ZSwgZnRydW5jYXRlLCBmYWxsb2NhdGUpIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGZvbGlvIHNwbGl0dGluZyBhbmQgaW5kZXggYm91bmRhcnkgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBkODAzMGE0MWUwYjBiNjg2N2E0YjNlYzIyM2MxNjc5OTE1Y2I2NzcwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAwNjo1OToxMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaApAQCAtNjI3LDggJiM0Mzs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsCiB1bnNpZ25lZCBmaW5kX2dldF9lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCwKIAkJcGdvZmZfdCBlbmQsIHN0cnVjdCBmb2xpb19iYXRjaCAqZmJhdGNoLCBwZ29mZl90ICppbmRpY2VzKTsKIGludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7Ci1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LAotCQlsb2ZmX3QgZW5kKTsKJiM0Mztib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCwKJiM0MzsJCWxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpOwogbG9uZyBtYXBwaW5nX2V2aWN0X2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA4OWExNDk1ZTU1ZjdlLi40ZWZiYmJiYTVkYTU5IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3NobWVtLmMKQEAgLTExNzUsMTEgJiM0MzsxMTc1LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCwKIAlpZiAoZm9saW8pIHsKIAkJc2FtZV9mb2xpbyA9IGxlbmQgJmx0OyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7CiAJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQlpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHsKLQkJCXN0YXJ0ID0gZm9saW9fbmV4dF9pbmRleChmb2xpbyk7Ci0JCQlpZiAoc2FtZV9mb2xpbykKLQkJCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7Ci0JCX0KJiM0MzsJCXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgJmFtcDtzdGFydCwKJiM0MzsJCQkJCSAgICAgc2FtZV9mb2xpbyA/ICZhbXA7ZW5kIDogTlVMTCk7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCWZvbGlvX3B1dChmb2xpbyk7CiAJCWZvbGlvID0gTlVMTDsKQEAgLTExODksOCAmIzQzOzExODYsNyBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLAogCQlmb2xpbyA9IHNobWVtX2dldF9wYXJ0aWFsX2ZvbGlvKGlub2RlLCBsZW5kICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwogCWlmIChmb2xpbykgewogCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKQotCQkJZW5kID0gZm9saW8tJmd0O2luZGV4OwomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCAmYW1wO2VuZCk7CiAJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCWZvbGlvX3B1dChmb2xpbyk7CiAJfQpAQCAtMTI1OCw3ICYjNDM7MTI1NCw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsCiAKIAkJCQlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7CiAJCQkJCXRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTsKLQkJCQl9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHsKJiM0MzsJCQkJfSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLAomIzQzOwkJCQkJCQlsc3RhcnQsIGxlbmQsIE5VTEwsIE5VTEwpKSB7CiAJCQkJCS8qCiAJCQkJCSAqIElmIHdlIHNwbGl0IGEgcGFnZSwgcmVzZXQgdGhlIGxvb3Agc28KIAkJCQkJICogdGhhdCB3ZSBwaWNrIHVwIHRoZSBuZXcgc3ViIHBhZ2VzLgpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS90cnVuY2F0ZS5jCkBAIC0yMDYsMzUgJiM0MzsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsCiAvKgogICogSGFuZGxlIHBhcnRpYWwgZm9saW9zLiAgVGhlIGZvbGlvIG1heSBiZSBlbnRpcmVseSB3aXRoaW4gdGhlCiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZQotICogZm9saW8gdGhhdCYjMzk7cyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmCiYjNDM7ICogZm9saW8gdGhhdCYjMzk7cyB3aXRoaW4gdGhlIFtsc3RhcnQsIGxlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWYKICAqIGl0JiMzOTtzIGxhcmdlLiAgc3BsaXRfcGFnZV9yYW5nZSgpIHdpbGwgZGlzY2FyZCBwYWdlcyB3aGljaCBub3cgbGllIGJleW9uZAogICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhCiAgKiBuZXdseSBjcmVhdGVkIGhvbGUuCiAgKgotICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkCi0gKiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUgZm9saW8gd2hpY2ggaXMgc3R1YmJvcm5seSB1bnNwbGl0LgomIzQzOyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGUKJiM0MzsgKiBwYWdlIHJhbmdlIGZ1bGx5IGNvdmVyZWQgYnkgW2xzdGFydCwgbGVuZF0gYWZ0ZXIgYW55IHNwbGl0IChvciBub25lKSwKJiM0MzsgKiBpLmUuIHRoZSByYW5nZSBvZiBwYWdlcyB0aGF0IGFyZSB3aG9sbHkgd2l0aGluIFtsc3RhcnQsIGxlbmRdIGFuZCBzbyBzYWZlCiYjNDM7ICogdG8gZGlzY2FyZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybiAldHJ1ZSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0LCAlZmFsc2Ugb3RoZXJ3aXNlLgogICovCi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQomIzQzO2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LAomIzQzOwkJCQkgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpCiB7CiAJbG9mZl90IHBvcyA9IGZvbGlvX3Bvcyhmb2xpbyk7CiAJc2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7CiAJc3RydWN0IHBhZ2UgKnNwbGl0X2F0LCAqc3BsaXRfYXQyOwomIzQzOwl1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzOwogCXVuc2lnbmVkIGludCBtaW5fb3JkZXI7CiAKLQlpZiAocG9zICZsdDsgc3RhcnQpCi0JCW9mZnNldCA9IHN0YXJ0IC0gcG9zOwomIzQzOwlpZiAocG9zICZsdDsgbHN0YXJ0KQomIzQzOwkJb2Zmc2V0ID0gbHN0YXJ0IC0gcG9zOwogCWVsc2UKIAkJb2Zmc2V0ID0gMDsKLQlpZiAocG9zICYjNDM7IHNpemUgJmx0Oz0gKHU2NCllbmQpCiYjNDM7CWlmIChwb3MgJiM0Mzsgc2l6ZSAmbHQ7PSAodTY0KWxlbmQpCiAJCWxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7CiAJZWxzZQotCQlsZW5ndGggPSBlbmQgJiM0MzsgMSAtIHBvcyAtIG9mZnNldDsKJiM0MzsJCWxlbmd0aCA9IGxlbmQgJiM0MzsgMSAtIHBvcyAtIG9mZnNldDsKIAogCWZvbGlvX3dhaXRfd3JpdGViYWNrKGZvbGlvKTsKIAlpZiAobGVuZ3RoID09IHNpemUpIHsKIAkJdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlnb3RvIG5vX3NwbGl0OwogCX0KIAogCS8qCkBAIC0yNDgsOSAmIzQzOzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQogCWlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSkKIAkJZm9saW9faW52YWxpZGF0ZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpOwogCWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCi0JCXJldHVybiB0cnVlOwomIzQzOwkJZ290byBub19zcGxpdDsKIAogCW1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKGZvbGlvLSZndDttYXBwaW5nKTsKJiM0MzsJbWluX25yYnl0ZXMgPSBtYXBwaW5nX21pbl9mb2xpb19ucmJ5dGVzKGZvbGlvLSZndDttYXBwaW5nKTsKIAlzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTsKIAlpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkgewogCQkvKgpAQCAtMjU5LDM4ICYjNDM7MjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiAJCSAqIGZvciBzaG1lbSB0cnVuY2F0ZQogCQkgKi8KIAkJc3RydWN0IGZvbGlvICpmb2xpbzI7CiYjNDM7CQlib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlOwogCi0JCWlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpCi0JCQlnb3RvIG5vX3NwbGl0OwomIzQzOwkJaWYgKHBlbmQpCiYjNDM7CQkJKnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLAomIzQzOwkJCQkJICAgbWluX25yYnl0ZXMpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAKJiM0MzsJCWlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpCiYjNDM7CQkJZ290byBzcGxpdDsKJiM0MztyZXRyeToKIAkJc3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbywKIAkJCQlQQUdFX0FMSUdOX0RPV04ob2Zmc2V0ICYjNDM7IGxlbmd0aCkgLyBQQUdFX1NJWkUpOwogCQlmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7CiAKIAkJaWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvMikpCi0JCQlnb3RvIG5vX3NwbGl0OwomIzQzOwkJCWdvdG8gc3BsaXQ7CiAKIAkJaWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkKJiM0MzsJCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7CiYjNDM7CQkJdGFpbF9pc29sYXRlZCA9IGZhbHNlOwogCQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudAomIzQzOwkJICogc3BsaXQuIFJldHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgZm9saW8gaW4gY2FzZSBpdCYjMzk7cyBzdGlsbAomIzQzOwkJICogbGFyZ2UuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7CiYjNDM7CQkJZm9saW9fdW5sb2NrKGZvbGlvMik7CiYjNDM7CQkJZm9saW9fcHV0KGZvbGlvMik7CiYjNDM7CQkJZ290byByZXRyeTsKJiM0MzsJCX0KIAogCQkvKiBtYWtlIHN1cmUgZm9saW8yIGlzIGxhcmdlIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaXRzIG1hcHBpbmcgKi8KIAkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSAmYW1wOyZhbXA7Ci0JCSAgICBmb2xpbzItJmd0O21hcHBpbmcgPT0gZm9saW8tJmd0O21hcHBpbmcpCi0JCQlmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbzIsIHNwbGl0X2F0MiwgbWluX29yZGVyKTsKJiM0MzsJCSAgICBmb2xpbzItJmd0O21hcHBpbmcgPT0gZm9saW8tJmd0O21hcHBpbmcgJmFtcDsmYW1wOwomIzQzOwkJICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKQomIzQzOwkJCXRhaWxfaXNvbGF0ZWQgPSBmYWxzZTsKIAogCQlmb2xpb191bmxvY2soZm9saW8yKTsKIG91dDoKJiM0MzsJCWlmICghdGFpbF9pc29sYXRlZCAmYW1wOyZhbXA7IHBlbmQpCiYjNDM7CQkJKnBlbmQgPSBmb2xpbzItJmd0O2luZGV4OwogCQlmb2xpb19wdXQoZm9saW8yKTsKLW5vX3NwbGl0OgomIzQzO3NwbGl0OgomIzQzOwkJaWYgKHBzdGFydCkKJiM0MzsJCQkqcHN0YXJ0ID0gcm91bmRfdXAocG9zICYjNDM7IG9mZnNldCwKJiM0MzsJCQkJCSAgIG1pbl9ucmJ5dGVzKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKLQlyZXR1cm4gdHJ1ZTsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSkKJiM0MzsJCXRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLSZndDttYXBwaW5nLCBmb2xpbyk7CiYjNDM7bm9fc3BsaXQ6CiYjNDM7CWlmIChwc3RhcnQpCiYjNDM7CQkqcHN0YXJ0ID0gb2Zmc2V0ID8gZm9saW9fbmV4dF9pbmRleChmb2xpbykgOiBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CWlmIChwZW5kKQomIzQzOwkJKnBlbmQgPSAocG9zICYjNDM7IHNpemUgJmd0OyAodTY0KWxlbmQpID8gZm9saW8tJmd0O2luZGV4IDoKJiM0MzsJCQkJCQkgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtNDEzLDExICYjNDM7NDQ5LDggQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAlmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0ICZndDsmZ3Q7IFBBR0VfU0hJRlQsIEZHUF9MT0NLLCAwKTsKIAlpZiAoIUlTX0VSUihmb2xpbykpIHsKIAkJc2FtZV9mb2xpbyA9IGxlbmQgJmx0OyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7Ci0JCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewotCQkJc3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKLQkJCWlmIChzYW1lX2ZvbGlvKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKLQkJfQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCAmYW1wO3N0YXJ0LAomIzQzOwkJCQkJICAgICBzYW1lX2ZvbGlvID8gJmFtcDtlbmQgOiBOVUxMKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAkJZm9saW8gPSBOVUxMOwpAQCAtNDI3LDggJiM0Mzs0NjAsNyBAQCB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQlmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbGVuZCAmZ3Q7Jmd0OyBQQUdFX1NISUZULAogCQkJCQkJRkdQX0xPQ0ssIDApOwogCQlpZiAoIUlTX0VSUihmb2xpbykpIHsKLQkJCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkKLQkJCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CQkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCAmYW1wO2VuZCk7CiAJCQlmb2xpb191bmxvY2soZm9saW8pOwogCQkJZm9saW9fcHV0KGZvbGlvKTsKIAkJfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTk2CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBUaGlzIFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIHNvbWUgcHJldHR5IGZ1bmRhbWVudGFsIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUsIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGAuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgZGVhbGluZyB3aXRoIGNvcmUgcGFnZWNhY2hlIHRydW5jYXRpb24gbG9naWMg4oCTIHRoaW5ncyBsaWtlIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBkaWdnaW5nIGludG8gaG93IHdlIGhhbmRsZSBwYXJ0aWFsIGZvbGlvcywgaG93IGZvbGlvcyBhcmUgc3BsaXQsIGFuZCBob3cgaW5kZXggcmFuZ2VzIGFyZSBtYW5hZ2VkIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLgoKVGhlIGltcG9ydGFudCBxdWVzdGlvbiBub3cgaXMsIGlzIHRoaXMgY29kZSByZWFjaGFibGUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgb3Igd2l0aCBmdXp6aW5nPyBHaXZlbiB0aGF0IHRoaXMgaGl0cyBgbW0vdHJ1bmNhdGUuY2AgYW5kIGBtbS9zaG1lbS5jYCwgY29yZSBMaW51eCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLCBleGVjdXRlZCBkdXJpbmcgdHJ1bmNhdGlvbiwgaG9sZSBwdW5jaGluZyAoZS5nLiBgZmFsbG9jYXRlYCksIGV2aWN0aW9uLCBldGMuLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyB5ZXMuIFRoaXMgaXMgZGVmaW5pdGVseSBgV29ydGhGdXp6aW5nYC4KClNvLCB0byBzdW1tYXJpemU6CgoxLiAgKipXb3J0aEZ1enppbmc6IHRydWUqKiAtIERlZmluaXRlbHkuIFRoaXMgaGl0cyBjcml0aWNhbCBNTSBjb2RlLgoyLiAgKipGb2N1c1N5bWJvbHM6KiogSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgd2hhdCBsb2dpYyBpcyBiZWluZyB0b3VjaGVkLiBUaGUga2V5IHN5bWJvbHMgd2l0aGluIHRoZSBwYXRjaCBhcmU6CiAgICAqICAgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIChpbiBgbW0vdHJ1bmNhdGUuY2ApCiAgICAqICAgYHNobWVtX3VuZG9fcmFuZ2VgIChpbiBgbW0vc2htZW0uY2ApCiAgICAqICAgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCAoaW4gYG1tL3RydW5jYXRlLmNgKQoKTm93LCBJJiMzOTttIGdvaW5nIHRvIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gZGl2ZSBpbnRvIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbGVycyBvZiB0aGVzZSBmdW5jdGlvbnMsIGxvb2sgYXQgdGhlIGNvbnRleHQsIHZlcmlmeSBhbnkgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMsIGFuZCBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoZXNlIGNoYW5nZXMgY291bGQgbWFuaWZlc3QgdnVsbmVyYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vaW50ZXJuYWwuaD02Mjk9aW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbm1tL2ludGVybmFsLmg6NjMwOmJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxubW0vaW50ZXJuYWwuaC02MzEtXHRcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xuLS1cbm1tL3NobWVtLmM9MTExOT1zdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuLS1cbm1tL3NobWVtLmMtMTE3Ny1cdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5tbS9zaG1lbS5jOjExNzg6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG5tbS9zaG1lbS5jLTExNzktXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuLS1cbm1tL3NobWVtLmMtMTE4OC1cdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5tbS9zaG1lbS5jOjExODk6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbm1tL3NobWVtLmMtMTE5MC1cdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbi0tXG5tbS9zaG1lbS5jLTEyMjYtXHRcdFx0XHRcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XG5tbS9zaG1lbS5jOjEyMjc6XHRcdFx0XHRcdCAqIGJvcmRlciwgc2tpcCBpdCBhcyB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1xubW0vc2htZW0uYy0xMjI4LVx0XHRcdFx0XHQgKiBhYm92ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB6ZXJvZCBpdHMgY29udGVudCBvbmNlLlxuLS1cbm1tL3NobWVtLmMtMTI1Ni1cdFx0XHRcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8obWFwcGluZywgZm9saW8pO1xubW0vc2htZW0uYzoxMjU3Olx0XHRcdFx0fSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLFxubW0vc2htZW0uYy0xMjU4LVx0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuLS1cbm1tL3RydW5jYXRlLmM9MTgwPXN0YXRpYyBpbnQgZm9saW9fc3BsaXRfb3JfdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKnNwbGl0X2F0LFxuLS1cbm1tL3RydW5jYXRlLmMtMjIwLSAqL1xubW0vdHJ1bmNhdGUuYzoyMjE6Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG5tbS90cnVuY2F0ZS5jLTIyMi1cdFx0XHRcdCAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZClcbi0tXG5tbS90cnVuY2F0ZS5jPTQwMj12b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuLS1cbm1tL3RydW5jYXRlLmMtNDUxLVx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xubW0vdHJ1bmNhdGUuYzo0NTI6XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG5tbS90cnVuY2F0ZS5jLTQ1My1cdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4tLVxubW0vdHJ1bmNhdGUuYy00NjItXHRcdGlmICghSVNfRVJSKGZvbGlvKSkge1xubW0vdHJ1bmNhdGUuYzo0NjM6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xubW0vdHJ1bmNhdGUuYy00NjQtXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTAwCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgVHJ1bmNhdGUgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgaW5vZGUgdHJ1bmNhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cnVuY2F0aW9uIHByb2Nlc3MgaXMgYWN0dWFsbHkgKmltcGxlbWVudGVkKiBhdCB0aGUgbG93ZXN0IGxldmVsLiBUaGF0IG1lYW5zIGNoZWNraW5nIG91dCB0aGUgY29yZSBmdW5jdGlvbnMgaGFuZGxpbmcgdGhpcywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGF5ZXIsIGdpdmVuIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgcGFnZXMgYW5kIGZvbGlvcy4gSSYjMzk7bSB0aGlua2luZywgYmFzZWQgb24gcGFzdCBleHBlcmllbmNlLCB0aGF0IGBtbS90cnVuY2F0ZS5jYCBpcyB0aGUgbGlrZWx5IHBsYWNlIGZvciB0aGVzZSBsb3ctbGV2ZWwgaW1wbGVtZW50YXRpb25zLiBNb3JlIHNwZWNpZmljYWxseSwgSSYjMzk7bSB6ZXJvaW5nIGluIG9uIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBrZXkgcGxheWVycywgaGFuZGxpbmcgdGhlIHBhcnRpYWwgdHJ1bmNhdGlvbiBvZiBpbmRpdmlkdWFsIGZvbGlvcyBhbmQgdGhlIHJhbmdlLWJhc2VkIHRydW5jYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gc2VlIGhvdyB0aGV5IGludGVyYWN0LCBob3cgdGhleSBoYW5kbGUgbG9ja2luZywgYW5kIGhvdyB0aGV5IGludGVyYWN0IHdpdGggdGhlIHBhZ2UgY2FjaGUuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIG51YW5jZXMgaW4gaG93IHRoZXkgZGVhbCB3aXRoIHBhcnRpYWxseSBmaWxsZWQgZm9saW9zLCBkaXJ0eSBwYWdlcywgYW5kIHRoZSBvdmVyYWxsIGNvb3JkaW5hdGlvbiBvZiB0aGUgdHJ1bmNhdGlvbiBvcGVyYXRpb24uIEZyb20gdGhlcmUsIEkmIzM5O2xsIGJlIGFibGUgdG8gaW5mZXIgdGhlIGNyaXRpY2FsIHBhdGgsIGFuZCBpZGVudGlmeSBhbnkgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdHJ1bmNhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjE1Olx0ICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4gMjE2Olx0ICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxuIDIxNzpcdCAqIHRvIGRpc2NhcmQuXG4gMjE4Olx0ICpcbiAyMTk6XHQgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cbiAyMjA6XHQgKi9cbiAyMjE6XHRib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcbiAyMjI6XHRcdFx0XHRcdCAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZClcbiAyMjM6XHR7XG4gMjI0Olx0XHRsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTtcbiAyMjU6XHRcdHNpemVfdCBzaXplID0gZm9saW9fc2l6ZShmb2xpbyk7XG4gMjI2Olx0XHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XG4gMjI3Olx0XHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7XG4gMjI4Olx0XHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xuIDIyOTpcdFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcbiAyMzA6XHRcbiAyMzE6XHRcdGlmIChwb3MgXHUwMDNjIGxzdGFydClcbiAyMzI6XHRcdFx0b2Zmc2V0ID0gbHN0YXJ0IC0gcG9zO1xuIDIzMzpcdFx0ZWxzZVxuIDIzNDpcdFx0XHRvZmZzZXQgPSAwO1xuIDIzNTpcdFx0aWYgKHBvcyAmIzQzOyBzaXplIFx1MDAzYz0gKHU2NClsZW5kKVxuIDIzNjpcdFx0XHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xuIDIzNzpcdFx0ZWxzZVxuIDIzODpcdFx0XHRsZW5ndGggPSBsZW5kICYjNDM7IDEgLSBwb3MgLSBvZmZzZXQ7XG4gMjM5Olx0XG4gMjQwOlx0XHRmb2xpb193YWl0X3dyaXRlYmFjayhmb2xpbyk7XG4gMjQxOlx0XHRpZiAobGVuZ3RoID09IHNpemUpIHtcbiAyNDI6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuIDI0MzpcdFx0XHRnb3RvIG5vX3NwbGl0O1xuIDI0NDpcdFx0fVxuIDI0NTpcdFxuIDI0NjpcdFx0LypcbiAyNDc6XHRcdCAqIFdlIG1heSBiZSB6ZXJvaW5nIHBhZ2VzIHdlJiMzOTtyZSBhYm91dCB0byBkaXNjYXJkLCBidXQgaXQgYXZvaWRzXG4gMjQ4Olx0XHQgKiBkb2luZyBhIGNvbXBsZXggY2FsY3VsYXRpb24gaGVyZSwgYW5kIHRoZW4gZG9pbmcgdGhlIHplcm9pbmdcbiAyNDk6XHRcdCAqIGFueXdheSBpZiB0aGUgcGFnZSBzcGxpdCBmYWlscy5cbiAyNTA6XHRcdCAqL1xuIDI1MTpcdFx0aWYgKCFtYXBwaW5nX2luYWNjZXNzaWJsZShmb2xpby1cdTAwM2VtYXBwaW5nKSlcbiAyNTI6XHRcdFx0Zm9saW9femVyb19yYW5nZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpO1xuIDI1MzpcdFxuIDI1NDpcdFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIDI1NTpcdFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gMjU2Olx0XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIDI1NzpcdFx0XHRnb3RvIG5vX3NwbGl0O1xuIDI1ODpcdFxuIDI1OTpcdFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gMjYwOlx0XHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXHUwMDNlbWFwcGluZyk7XG4gMjYxOlx0XHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcbiAyNjI6XHRcdGlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7XG4gMjYzOlx0XHRcdC8qXG4gMjY0Olx0XHRcdCAqIHRyeSB0byBzcGxpdCBhdCBvZmZzZXQgJiM0MzsgbGVuZ3RoIHRvIG1ha2Ugc3VyZSBmb2xpb3Mgd2l0aGluXG4gMjY1Olx0XHRcdCAqIHRoZSByYW5nZSBjYW4gYmUgZHJvcHBlZCwgZXNwZWNpYWxseSB0byBhdm9pZCBtZW1vcnkgd2FzdGVcbiAyNjY6XHRcdFx0ICogZm9yIHNobWVtIHRydW5jYXRlXG4gMjY3Olx0XHRcdCAqL1xuIDI2ODpcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcbiAyNjk6XHRcdFx0Ym9vbCB0YWlsX2lzb2xhdGVkID0gdHJ1ZTtcbiAyNzA6XHRcbiAyNzE6XHRcdFx0aWYgKHBlbmQpXG4gMjcyOlx0XHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyAmIzQzOyBvZmZzZXQgJiM0MzsgbGVuZ3RoLFxuIDI3MzpcdFx0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gMjc0Olx0XG4gMjc1Olx0XHRcdGlmIChvZmZzZXQgJiM0MzsgbGVuZ3RoID09IHNpemUpXG4gMjc2Olx0XHRcdFx0Z290byBzcGxpdDtcbiAyNzc6XHRyZXRyeTpcbiAyNzg6XHRcdFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcbiAyNzk6XHRcdFx0XHRcdFBBR0VfQUxJR05fRE9XTihvZmZzZXQgJiM0MzsgbGVuZ3RoKSAvIFBBR0VfU0laRSk7XG4gMjgwOlx0XHRcdGZvbGlvMiA9IHBhZ2VfZm9saW8oc3BsaXRfYXQyKTtcbiAyODE6XHRcbiAyODI6XHRcdFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvMikpXG4gMjgzOlx0XHRcdFx0Z290byBzcGxpdDtcbiAyODQ6XHRcbiAyODU6XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpXG4gMjg2Olx0XHRcdFx0Z290byBvdXQ7XG4gMjg3Olx0XG4gMjg4Olx0XHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XG4gMjg5Olx0XHRcdFx0dGFpbF9pc29sYXRlZCA9IGZhbHNlO1xuIDI5MDpcdFx0XHRcdGdvdG8gb3V0O1xuIDI5MTpcdFx0XHR9XG4gMjkyOlx0XG4gMjkzOlx0XHRcdC8qXG4gMjk0Olx0XHRcdCAqIHNwbGl0X2F0MiBtYXkgbm8gbG9uZ2VyIGJlbG9uZyB0byBmb2xpbzIgZHVlIHRvIGNvbmN1cnJlbnRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjAxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgRGF0YSBDb3JydXB0aW9uIGluIFNoYXJlZCBNZW1vcnkqKgoKT2theSwgdGltZSB0byBkaWcgaW50byBhIHBvdGVudGlhbCBpc3N1ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCB0cmFjZSBpdHMgdXNhZ2UuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNhbGxlcnMsIGFuZCwgY3J1Y2lhbGx5LCBob3cgdGhvc2UgY2FsbGVycyBtaWdodCBpbnRlcmFjdCB3aXRoIGFueSBmdW5jdGlvbnMgdGhhdCBjb3VsZCBsZWFkIHRvIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uIGluIHRoZSBzaGFyZWQgbWVtb3J5IGNvbnRleHQg4oCTIG5hbWVseSwgYW55dGhpbmcgcmVsYXRlZCB0byB0cnVuY2F0aW9uLiBUaGUgY29kZSYjMzk7cyBwcm9iYWJseSBnb3Qgc29tZSBpbnRlcmVzdGluZyBpbnRlcmFjdGlvbnMgd2l0aCBob3cgaXQgaGFuZGxlcyBjaGFuZ2VzIHRvIGZpbGUgc2l6ZSBvciBkYXRhIHJlZ2lvbnMsIHNvIEkmIzM5O2xsIGJlIGxvb2tpbmcgYXQgYWxsIGNhbGxlcnMgb2YgYHRydW5jYXRlYCB3aXRoaW4gYHNobWVtLmNgIGFzIHdlbGwuIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgdHdvIGFyZWFzIGlzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgc29tZXRoaW5nIG9mIGludGVyZXN0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGF1ZGl0IHJldmVhbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2htZW1fdW5kb19yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zaG1lbS5jPTEwODc9c3RhdGljIHN0cnVjdCBmb2xpbyAqc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpbmRleClcbi0tXG5tbS9zaG1lbS5jLTExMTgtICovXG5tbS9zaG1lbS5jOjExMTk6c3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbm1tL3NobWVtLmMtMTEyMC1cdFx0XHRcdFx0XHRcdFx0IGJvb2wgdW5mYWxsb2MpXG4tLVxubW0vc2htZW0uYz0xMjgzPXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXG5tbS9zaG1lbS5jLTEyODQte1xubW0vc2htZW0uYzoxMjg1Olx0c2htZW1fdW5kb19yYW5nZShpbm9kZSwgbHN0YXJ0LCBsZW5kLCBmYWxzZSk7XG5tbS9zaG1lbS5jLTEyODYtXHRpbm9kZV9zZXRfbXRpbWVfdG9fdHMoaW5vZGUsIGlub2RlX3NldF9jdGltZV9jdXJyZW50KGlub2RlKSk7XG4tLVxubW0vc2htZW0uYz0yNjMwPXN0YXRpYyBpbnQgc3luY2hyb25vdXNfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX2VudHJ5X3QgKndhaXQsXG4tLVxubW0vc2htZW0uYy0yNjQyLSAqIGZhdWx0aW5nIHBhZ2VzIGludG8gdGhlIGhvbGUgd2hpbGUgaXQmIzM5O3MgYmVpbmcgcHVuY2hlZC4gIEFsdGhvdWdoXG5tbS9zaG1lbS5jOjI2NDM6ICogc2htZW1fdW5kb19yYW5nZSgpIGRvZXMgcmVtb3ZlIHRoZSBhZGRpdGlvbnMsIGl0IG1heSBiZSB1bmFibGUgdG9cbm1tL3NobWVtLmMtMjY0NC0gKiBrZWVwIHVwLCBhcyBlYWNoIG5ldyBwYWdlIG5lZWRzIGl0cyBvd24gdW5tYXBfbWFwcGluZ19yYW5nZSgpIGNhbGwsXG4tLVxubW0vc2htZW0uYz0zNjA5PXN0YXRpYyBsb25nIHNobWVtX2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsXG4tLVxubW0vc2htZW0uYy0zNzE5LVx0XHRcdGlmIChpbmRleCBcdTAwM2Ugc3RhcnQpIHtcbm1tL3NobWVtLmM6MzcyMDpcdFx0XHRcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsXG5tbS9zaG1lbS5jLTM3MjEtXHRcdFx0XHQgICAgKGxvZmZfdClzdGFydCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MzA5CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKkludmVzdGlnYXRpbmcgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCBDYWxsZXJzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIGlzIGJlaW5nIHVzZWQuIEdpdmVuIHRoYXQgaXQgZGVhbHMgd2l0aCBpbm9kZSBwYWdlIHJhbmdlcywgaXQmIzM5O3MgcHJldHR5IGNsZWFyIHRoYXQgaXQgaGFzIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgYm90aCBtZW1vcnkgbWFuYWdlbWVudCAobW0pIGFuZCB0aGUgZmlsZXN5c3RlbSAoZnMpIGxheWVycy4gVGhlcmVmb3JlLCB0aGUgZmlyc3QgbG9naWNhbCBzdGVwIGlzIHRvIHBpbnBvaW50IGl0cyBjYWxsZXJzIHdpdGhpbiB0aG9zZSBhcmVhcyBvZiB0aGUga2VybmVsIGNvZGViYXNlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGF0JiMzOTtsbCBnaXZlIG1lIGluc2lnaHQgaW50byB3aGF0JiMzOTtzIGJlaW5nIHRydW5jYXRlZCwgd2h5LCBhbmQgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBvciBjb3JyZWN0bmVzcyBpbXBsaWNhdGlvbnMgb2YgYW55IG1vZGlmaWNhdGlvbnMgSSBtaWdodCBiZSBjb25zaWRlcmluZy4gSSBzaG91bGQgc3RhcnQgYnkgc2VhcmNoaW5nIGZvciBjYWxscyBpbiB0aGUgYG1tYCBhbmQgYGZzYCBkaXJlY3Rvcmllcy4gS25vd2luZyB0aGUgY2FsbCBjb250ZXh0LCBlc3BlY2lhbGx5LCBpcyAqY3JpdGljYWwqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zaG1lbS5jPTU3NTQ9dm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcbm1tL3NobWVtLmMtNTc1NS17XG5tbS9zaG1lbS5jOjU3NTY6XHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS1cdTAwM2VpX21hcHBpbmcsIGxzdGFydCwgbGVuZCk7XG5tbS9zaG1lbS5jLTU3NTctfVxuLS1cbm1tL3RydW5jYXRlLmM9MzYxPWxvbmcgbWFwcGluZ19ldmljdF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS90cnVuY2F0ZS5jLTM3OC0vKipcbm1tL3RydW5jYXRlLmM6Mzc5OiAqIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlIC0gdHJ1bmNhdGUgcmFuZ2Ugb2YgcGFnZXMgc3BlY2lmaWVkIGJ5IHN0YXJ0IFx1MDAyNiBlbmQgYnl0ZSBvZmZzZXRzXG5tbS90cnVuY2F0ZS5jLTM4MC0gKiBAbWFwcGluZzogbWFwcGluZyB0byB0cnVuY2F0ZVxuLS1cbm1tL3RydW5jYXRlLmMtMzk4LSAqIE5vdGUgdGhhdCBzaW5jZSAtXHUwMDNlaW52YWxpZGF0ZV9mb2xpbygpIGFjY2VwdHMgcmFuZ2UgdG8gaW52YWxpZGF0ZVxubW0vdHJ1bmNhdGUuYzozOTk6ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgaXMgYWJsZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGVuZCAmIzQzOyAxIGlzIG5vdFxubW0vdHJ1bmNhdGUuYy00MDAtICogcGFnZSBhbGlnbmVkIHByb3Blcmx5LlxubW0vdHJ1bmNhdGUuYy00MDEtICovXG5tbS90cnVuY2F0ZS5jOjQwMjp2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxubW0vdHJ1bmNhdGUuYy00MDMtXHRcdFx0XHRsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcbi0tXG5tbS90cnVuY2F0ZS5jLTQ5OS19XG5tbS90cnVuY2F0ZS5jOjUwMDpFWFBPUlRfU1lNQk9MKHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKTtcbm1tL3RydW5jYXRlLmMtNTAxLVxuLS1cbm1tL3RydW5jYXRlLmM9NTE1PXZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpXG5tbS90cnVuY2F0ZS5jLTUxNi17XG5tbS90cnVuY2F0ZS5jOjUxNzpcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgKGxvZmZfdCktMSk7XG5tbS90cnVuY2F0ZS5jLTUxOC19XG4tLVxubW0vdHJ1bmNhdGUuYz05MzY9dm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpXG4tLVxubW0vdHJ1bmNhdGUuYy05NTYtXHRcdFx0XHQgICAgMSAmIzQzOyB1bm1hcF9lbmQgLSB1bm1hcF9zdGFydCwgMCk7XG5tbS90cnVuY2F0ZS5jOjk1NzpcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgbGVuZCk7XG5tbS90cnVuY2F0ZS5jLTk1OC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTIwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgc2htZW0uY2AgYW5kIGB0cnVuY2F0ZS5jYCBhcmUgYmVpbmcgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBidWlsZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGNoZWNrIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYENPTkZJR19TSE1FTWAgYW5kIHBvdGVudGlhbGx5IG90aGVyIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBhZmZlY3QgYHNobWVtLmNgLiBJIGtub3cgdGhhdCBgdHJ1bmNhdGUuY2AgaXMgZXNzZW50aWFsbHkgYWx3YXlzIHBhcnQgb2YgdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgKG1tKSBhbmQgaXMgZ29pbmcgdG8gYmUgYnVpbHQgaW4gZXZlcnkgaW5zdGFuY2UsIHNvIEkmIzM5O20gbm90IGFzIGNvbmNlcm5lZCB3aXRoIGl0cyBidWlsZCBjb25kaXRpb25hbC4gSSBrbm93IHRoYXQgYHNobWVtLmNgIGlzIGNvbmRpdGlvbmFsbHkgYnVpbHQgd2l0aCBgQ09ORklHX1NITUVNYCAob3IgcG9zc2libHkgYENPTkZJR19UTVBGU2AgZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBlbnZpcm9ubWVudCkuIFRoZXJlZm9yZSwgSSBzaG91bGQgYmUgYWJsZSB0byBhc2NlcnRhaW4gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGJ1aWxkIGJ5IGV4YW1pbmluZyB0aGUgYG1tL01ha2VmaWxlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2htZW1cXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTUxPW9iai15XHRcdFx0Oj0gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcXFxuLS1cbm1tL01ha2VmaWxlLTUzLVx0XHRcdCAgIHJlYWRhaGVhZC5vIGZvbGlvLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBzaHJpbmtlci5vIFxcXG5tbS9NYWtlZmlsZTo1NDpcdFx0XHQgICBzaG1lbS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFxcXG5tbS9NYWtlZmlsZS01NS1cdFx0XHQgICBtbV9pbml0Lm8gcGVyY3B1Lm8gc2xhYl9jb21tb24ubyBcXFxuLS1cbm1tL3NobWVtLmM9NTIwPXN0YXRpYyBpbnQgc2htZW1fY29uZmlybV9zd2FwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90IGluZGV4LFxuLS1cbm1tL3NobWVtLmMtNTY5LSNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL3NobWVtLmM6NTcwOi8qIGlmZGVmIGhlcmUgdG8gYXZvaWQgYmxvYXRpbmcgc2htZW0ubyB3aGVuIG5vdCBuZWNlc3NhcnkgKi9cbm1tL3NobWVtLmMtNTcxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDYyNgoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDY2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIEludmVzdGlnYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiBlaXRoZXIgYENPTkZJR19TSE1FTWAgb3IgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAgYXJlIHBlcnRpbmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHBpbnBvaW50IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBjb25maWd1cmF0aW9ucy4gSSYjMzk7bSBnb2luZyB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBpbiBgbW0vS2NvbmZpZ2Agb3IgYGluaXQvS2NvbmZpZ2Ag4oCTIHRob3NlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBpbml0aWFsaXphdGlvbi1yZWxhdGVkIHNldHRpbmdzLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBsb3dkb3duIG9uIHdoYXQgdGhlc2Ugb3B0aW9ucyBhY3R1YWxseSAqZG8qIGFuZCB3aGV0aGVyIHRoZXkmIzM5O3JlIGV2ZW4gcmVsZXZhbnQgdG8gd2hhdCBJJiMzOTttIGN1cnJlbnRseSB3b3JraW5nIG9uLiBHb3R0YSBzdGFydCB3aXRoIHRoZSBmdW5kYW1lbnRhbHMsIHJpZ2h0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgU0hNRU0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTg5Nj1jb25maWcgRVZFTlRGRFxuLS1cbmluaXQvS2NvbmZpZy0xOTA0LVxuaW5pdC9LY29uZmlnOjE5MDU6Y29uZmlnIFNITUVNXG5pbml0L0tjb25maWctMTkwNi1cdGJvb2wgXCYjMzQ7VXNlIGZ1bGwgc2htZW0gZmlsZXN5c3RlbVwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA5NDEKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXhhbWluaW5nIE1lbW9yeSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gcG90ZW50aWFsIG9wdGltaXphdGlvbnMgYW5kIGl0IHNlZW1zIGxpa2UgYENPTkZJR19TSE1FTWAgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFyZSB0aGUgb2J2aW91cyBwbGFjZXMgdG8gc3RhcnQgaWYgSSBuZWVkIHRvIGFkanVzdCBtZW1vcnkgYmVoYXZpb3IuIEkgYWxyZWFkeSBrbm93IHRoYXQgYENPTkZJR19TSE1FTWAgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3aGljaCBpcyBnb29kLiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBTSE1FTSBhbmQgVEhQLCBlc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGhvdyB0aGV5IGhhbmRsZSBsYXJnZSBmb2xpb3MgYW5kIHBhZ2VjYWNoZSwgaXMgd2hhdCBJJiMzOTttIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHJpZ2h0IG5vdy4gSSYjMzk7bSBnb2luZyB0byBkaWcgaW50byB0aGUgcmVsYXRpb25zaGlwLCBhbmQgbmVlZCB0byBjaGVjayB0aGluZ3MgbGlrZSBgbWFwcGluZ19taW5fZm9saW9fb3JkZXJgIGFuZCBgbWFwcGluZ19taW5fZm9saW9fbnJieXRlc2AsIG9yIGFueSBvdGhlciBjb25maWd1cmF0aW9ucyB0aGF0IHBlcnRhaW4gdG8gVEhQIGFuZCBsYXJnZSBmb2xpb3MuIFRob3NlIGFyZSBwcm9iYWJseSB0aGUga2V5cyB0byBnZXR0aW5nIHRoaXMgcmlnaHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21hcHBpbmdfbWluX2ZvbGlvX29yZGVyJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9wYWdlbWFwLmg9NDY4PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50XG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo0Njk6bWFwcGluZ19taW5fZm9saW9fb3JkZXIoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaC00NzAte1xuLS1cbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTQ3Nz1tYXBwaW5nX21pbl9mb2xpb19ucnBhZ2VzKGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDc4LXtcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oOjQ3OTpcdHJldHVybiAxVUwgXHUwMDNjXHUwMDNjIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpO1xuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDgwLX1cbi0tXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaD01Mjg9c3RhdGljIGlubGluZSBib29sIG1hcHBpbmdfcG1kX2ZvbGlvX3N1cHBvcnQoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXG4tLVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNTMyLVxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmg6NTMzOlx0cmV0dXJuIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpIFx1MDAzYz0gUE1EX09SREVSIFx1MDAyNlx1MDAyNlxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNTM0LVx0ICAgICAgIG1hcHBpbmdfbWF4X2ZvbGlvX29yZGVyKG1hcHBpbmcpIFx1MDAzZT0gUE1EX09SREVSO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTUzNAoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiAzODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9jdXMgU3ltYm9scyBmb3IgRnV6emluZyoqCgpPa2F5LCBsZXQmIzM5O3MgdGFrZSBhIGxvb2sgYXQgdGhlc2UgYEZvY3VzU3ltYm9sc2AuIEkgc2VlIHdlJiMzOTtyZSBleGFtaW5pbmc6IGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gR29vZCwgSSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlIHF1aXRlIHRhcmdldGVkLiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgaXMgZGVmaW5pdGVseSBzcGVjaWZpYyB0byB0aGUgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIHN0dWZmLCB3aGljaCBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQsIGFuZCBpcyBub3QgZ29pbmcgdG8gaW1wYWN0IG11Y2ggYmV5b25kIHRoYXQuIFRoZW4gdGhlcmUmIzM5O3MgYHNobWVtX3VuZG9fcmFuZ2VgIHdoaWNoIGRlYWxzIHdpdGggc2htZW0gdHJ1bmNhdGlvbiBhbmQgaG9sZSBwdW5jaGluZy4gQW5kIGZpbmFsbHkgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCB3aGljaCBoYW5kbGVzIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbi4gQWxsIHZlcnkgZm9jdXNlZCBhcmVhcyBvZiBjb25jZXJuLgoKTm93LCBsZXQmIzM5O3MganVzdCBxdWlja2x5IHNjYW4gYG1tL3RydW5jYXRlLmNgIGFuZCBgbW0vc2htZW0uY2AgdG8gbWFrZSBzdXJlIHdlJiMzOTtyZSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzIHRoYXQgc2hvdWxkIG9yIHNob3VsZG4mIzM5O3QgYmUgaW5jbHVkZWQuIExvb2tzIGxpa2Ugd2UmIzM5O3ZlIGdvdCB0aGUgZGlyZWN0bHkgbW9kaWZpZWQgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLCBgc2htZW1fdW5kb19yYW5nZWAgdGhhdCYjMzk7cyBhIGRpcmVjdGx5IG1vZGlmaWVkIGNhbGxlciwgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgYWxzbyBhIGRpcmVjdGx5IG1vZGlmaWVkIGNhbGxlci4gTm8gcmVkIGZsYWdzIHRoZXJlLgoKTmV4dCwgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWdzLiBXZSYjMzk7cmUgbG9va2luZyBhdCBgQ09ORklHX1NITUVNYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9yIGBTSE1FTWAgYW5kIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuCgpBbHJpZ2h0LCB0aW1lIHRvIG1ha2Ugc3VyZSBJJiMzOTttIHNldHRpbmcgdGhlIGBzZXQtcmVzdWx0c2AgcGFyYW1ldGVycyBjb3JyZWN0bHkuIExldCYjMzk7cyBzZWUuLi4gd2UgbmVlZCBgV29ydGhGdXp6aW5nYCwgYFJlYXNvbmluZ2AsIGBGb2N1c1N5bWJvbHNgLCBhbmQgYEVuYWJsZUNvbmZpZ3NgLgoKRmluYWxseSwgYSBxdWljayBzYW5pdHkgY2hlY2sgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMuIEl0JiMzOTtzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGluIGFtZDY0IFFFTVUuIGBXb3J0aEZ1enppbmdgIHNob3VsZCBiZSBgdHJ1ZWAgYmVjYXVzZSB3ZSBhcmUgaW5kZWVkIHRvdWNoaW5nIG1lbW9yeSBtYW5hZ2VtZW50IChgbW0vYCkgYW5kIHJlZmFjdG9yaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIGxvZ2ljLiBGb3IgYEZvY3VzU3ltYm9sc2AsIHdlJiMzOTt2ZSBnb3QgdGhvc2Ugd2VsbC1kZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZW4mIzM5O3QgdWJpcXVpdG91cyBhbmQgYXJlIHNwZWNpZmljIHRvIHRoZSBhcmVhcyBiZWluZyBtb2RpZmllZC4gYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGhhdmUgdGhlIGBDT05GSUdfYCBwcmVmaXggc3RyaXBwZWQuCgpPa2F5LCBJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDY6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1NITUVNJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyYjMzQ7LAogICAgJiMzNDtzaG1lbV91bmRvX3JhbmdlJiMzNDssCiAgICAmIzM0O3RydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7U0hNRU0mIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvJiMzNDssCiAgICAmIzM0O3NobWVtX3VuZG9fcmFuZ2UmIzM0OywKICAgICYjMzQ7dHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS90cnVuY2F0ZS5jIGFuZCBtbS9zaG1lbS5jIGZvciBoYW5kbGluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyB3aGVuIHRydW5jYXRpbmcgcGFnZWNhY2hlIGFuZCBzaG1lbSByYW5nZXMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgc3RhbmRhcmQgdHJ1bmNhdGlvbiBhbmQgaG9sZS1wdW5jaGluZyBzeXNjYWxscyAoZS5nLiwgdHJ1bmNhdGUsIGZ0cnVuY2F0ZSwgZmFsbG9jYXRlKSBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBmb2xpbyBzcGxpdHRpbmcgYW5kIGluZGV4IGJvdW5kYXJ5IGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXG5cbkFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXJzIGludHJvZHVjZWQgb3IgbW9kaWZpZWQgKGBtaW5fbnJieXRlc2AsIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGBmb2xpbzJgLCBgKnBzdGFydGAsIGAqcGVuZGApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBjYWxsZXIgdmFyaWFibGVzIChgc3RhcnRgLCBgZW5kYCkgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBidWdzIGluIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiwgZm9saW8gc3BsaXR0aW5nLCBvciByZWZlcmVuY2UgY291bnRpbmcgd291bGQgaW52b2x2ZSB1c2UtYWZ0ZXItZnJlZSwgY29uY3VycmVudCBsb2NraW5nLCBvciBwYWdlIHN0YXRlIGludmFsaWRhdGlvbiwgd2hpY2ggYXJlIGRldGVjdGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgcGFnZSBjYWNoZSBhc3NlcnRpb25zIHJhdGhlciB0aGFuIEtNU0FOLiBUaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGQ4MDMwYTQxZTBiMGI2ODY3YTRiM2VjMjIzYzE2Nzk5MTVjYjY3NzAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgV2VkIFNlcCA5IDA2OjU5OjEwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmgKaW5kZXggNjhkYjVhYmQwYTRjZS4uNmU2YWQzMTg3Mzc4YSAxMDA2NDQKLS0tIGEvbW0vaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oCkBAIC02MjcsOCAmIzQzOzYyNyw4IEBAIHVuc2lnbmVkIGZpbmRfbG9ja19lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCwKIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LAogCQlwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpOwogaW50IHRydW5jYXRlX2lub2RlX2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKTsKLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsCi0JCWxvZmZfdCBlbmQpOwomIzQzO2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LAomIzQzOwkJbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCk7CiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pOwogdW5zaWduZWQgbG9uZyBtYXBwaW5nX3RyeV9pbnZhbGlkYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwgdW5zaWduZWQgbG9uZyAqbnJfZmFpbGVkKTsKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vc2htZW0uYwpAQCAtMTE3NSwxMSAmIzQzOzExNzUsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLAogCWlmIChmb2xpbykgewogCQlzYW1lX2ZvbGlvID0gbGVuZCAmbHQ7IGZvbGlvX25leHRfcG9zKGZvbGlvKTsKIAkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7Ci0JCWlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewotCQkJc3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTsKLQkJCWlmIChzYW1lX2ZvbGlvKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKLQkJfQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCAmYW1wO3N0YXJ0LAomIzQzOwkJCQkJICAgICBzYW1lX2ZvbGlvID8gJmFtcDtlbmQgOiBOVUxMKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAkJZm9saW8gPSBOVUxMOwpAQCAtMTE4OSw4ICYjNDM7MTE4Niw3IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsCiAJCWZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgJmd0OyZndDsgUEFHRV9TSElGVCk7CiAJaWYgKGZvbGlvKSB7CiAJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQlpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpCi0JCQllbmQgPSBmb2xpby0mZ3Q7aW5kZXg7CiYjNDM7CQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsICZhbXA7ZW5kKTsKIAkJZm9saW9fdW5sb2NrKGZvbGlvKTsKIAkJZm9saW9fcHV0KGZvbGlvKTsKIAl9CkBAIC0xMjU4LDcgJiM0MzsxMjU0LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCwKIAogCQkJCWlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpIHsKIAkJCQkJdHJ1bmNhdGVfaW5vZGVfZm9saW8obWFwcGluZywgZm9saW8pOwotCQkJCX0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkgewomIzQzOwkJCQl9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sCiYjNDM7CQkJCQkJCWxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHsKIAkJCQkJLyoKIAkJCQkJICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzbwogCQkJCQkgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCBiNThiYTk0MGJlNDc0Li5kODhhMWIxNTkwODQ1IDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3RydW5jYXRlLmMKQEAgLTIwNiwzNSAmIzQzOzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCwKIC8qCiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGUKICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlCi0gKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW3N0YXJ0LCBlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWYKJiM0MzsgKiBmb2xpbyB0aGF0JiMzOTtzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZgogICogaXQmIzM5O3MgbGFyZ2UuICBzcGxpdF9wYWdlX3JhbmdlKCkgd2lsbCBkaXNjYXJkIHBhZ2VzIHdoaWNoIG5vdyBsaWUgYmV5b25kCiAgKiBpX3NpemUsIGFuZCB3ZSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gZGlzY2FyZCBwYWdlcyB3aGljaCBsaWUgd2l0aGluIGEKICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS4KICAqCi0gKiBSZXR1cm5zIGZhbHNlIGlmIHNwbGl0dGluZyBmYWlsZWQgc28gdGhlIGNhbGxlciBjYW4gYXZvaWQKLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuCiYjNDM7ICogV2hlbiBAcHN0YXJ0IGFuZC9vciBAcGVuZCBhcmUgbm9uLU5VTEwgdGhleSByZWNlaXZlIHRoZSBpbmRleGVzIG9mIHRoZQomIzQzOyAqIHBhZ2UgcmFuZ2UgZnVsbHkgY292ZXJlZCBieSBbbHN0YXJ0LCBsZW5kXSBhZnRlciBhbnkgc3BsaXQgKG9yIG5vbmUpLAomIzQzOyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmUKJiM0MzsgKiB0byBkaXNjYXJkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuCiAgKi8KLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiYjNDM7Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsCiYjNDM7CQkJCSAgbG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCkKIHsKIAlsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTsKIAlzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pOwogCXVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDsKIAlzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbWluX25yYnl0ZXM7CiAJdW5zaWduZWQgaW50IG1pbl9vcmRlcjsKIAotCWlmIChwb3MgJmx0OyBzdGFydCkKLQkJb2Zmc2V0ID0gc3RhcnQgLSBwb3M7CiYjNDM7CWlmIChwb3MgJmx0OyBsc3RhcnQpCiYjNDM7CQlvZmZzZXQgPSBsc3RhcnQgLSBwb3M7CiAJZWxzZQogCQlvZmZzZXQgPSAwOwotCWlmIChwb3MgJiM0Mzsgc2l6ZSAmbHQ7PSAodTY0KWVuZCkKJiM0MzsJaWYgKHBvcyAmIzQzOyBzaXplICZsdDs9ICh1NjQpbGVuZCkKIAkJbGVuZ3RoID0gc2l6ZSAtIG9mZnNldDsKIAllbHNlCi0JCWxlbmd0aCA9IGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0OwomIzQzOwkJbGVuZ3RoID0gbGVuZCAmIzQzOyAxIC0gcG9zIC0gb2Zmc2V0OwogCiAJZm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pOwogCWlmIChsZW5ndGggPT0gc2l6ZSkgewogCQl0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby0mZ3Q7bWFwcGluZywgZm9saW8pOwotCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCWdvdG8gbm9fc3BsaXQ7CiAJfQogCiAJLyoKQEAgLTI0OCw5ICYjNDM7MjU0LDEwIEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiAJaWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKQogCQlmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7CiAJaWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkKLQkJcmV0dXJuIHRydWU7CiYjNDM7CQlnb3RvIG5vX3NwbGl0OwogCiAJbWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tJmd0O21hcHBpbmcpOwomIzQzOwltaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tJmd0O21hcHBpbmcpOwogCXNwbGl0X2F0ID0gZm9saW9fcGFnZShmb2xpbywgUEFHRV9BTElHTl9ET1dOKG9mZnNldCkgLyBQQUdFX1NJWkUpOwogCWlmICghZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8sIHNwbGl0X2F0LCBtaW5fb3JkZXIpKSB7CiAJCS8qCkBAIC0yNTksMzggJiM0MzsyNjYsNjcgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKIAkJICogZm9yIHNobWVtIHRydW5jYXRlCiAJCSAqLwogCQlzdHJ1Y3QgZm9saW8gKmZvbGlvMjsKJiM0MzsJCWJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7CiAKLQkJaWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSkKLQkJCWdvdG8gbm9fc3BsaXQ7CiYjNDM7CQlpZiAocGVuZCkKJiM0MzsJCQkqcGVuZCA9IHJvdW5kX2Rvd24ocG9zICYjNDM7IG9mZnNldCAmIzQzOyBsZW5ndGgsCiYjNDM7CQkJCQkgICBtaW5fbnJieXRlcykgJmd0OyZndDsgUEFHRV9TSElGVDsKIAomIzQzOwkJaWYgKG9mZnNldCAmIzQzOyBsZW5ndGggPT0gc2l6ZSkKJiM0MzsJCQlnb3RvIHNwbGl0OwomIzQzO3JldHJ5OgogCQlzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLAogCQkJCVBBR0VfQUxJR05fRE9XTihvZmZzZXQgJiM0MzsgbGVuZ3RoKSAvIFBBR0VfU0laRSk7CiAJCWZvbGlvMiA9IHBhZ2VfZm9saW8oc3BsaXRfYXQyKTsKIAogCQlpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSkKLQkJCWdvdG8gbm9fc3BsaXQ7CiYjNDM7CQkJZ290byBzcGxpdDsKIAogCQlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSkKIAkJCWdvdG8gb3V0OwogCi0JCWlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKQomIzQzOwkJaWYgKCFmb2xpb190cnlsb2NrKGZvbGlvMikpIHsKJiM0MzsJCQl0YWlsX2lzb2xhdGVkID0gZmFsc2U7CiAJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50CiYjNDM7CQkgKiBzcGxpdC4gUmV0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBmb2xpbyBpbiBjYXNlIGl0JiMzOTtzIHN0aWxsCiYjNDM7CQkgKiBsYXJnZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHBhZ2VfZm9saW8oc3BsaXRfYXQyKSAhPSBmb2xpbzIpIHsKJiM0MzsJCQlmb2xpb191bmxvY2soZm9saW8yKTsKJiM0MzsJCQlmb2xpb19wdXQoZm9saW8yKTsKJiM0MzsJCQlnb3RvIHJldHJ5OwomIzQzOwkJfQogCiAJCS8qIG1ha2Ugc3VyZSBmb2xpbzIgaXMgbGFyZ2UgYW5kIGRvZXMgbm90IGNoYW5nZSBpdHMgbWFwcGluZyAqLwogCQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpICZhbXA7JmFtcDsKLQkJICAgIGZvbGlvMi0mZ3Q7bWFwcGluZyA9PSBmb2xpby0mZ3Q7bWFwcGluZykKLQkJCWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpOwomIzQzOwkJICAgIGZvbGlvMi0mZ3Q7bWFwcGluZyA9PSBmb2xpby0mZ3Q7bWFwcGluZyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpCiYjNDM7CQkJdGFpbF9pc29sYXRlZCA9IGZhbHNlOwogCiAJCWZvbGlvX3VubG9jayhmb2xpbzIpOwogb3V0OgomIzQzOwkJaWYgKCF0YWlsX2lzb2xhdGVkICZhbXA7JmFtcDsgcGVuZCkKJiM0MzsJCQkqcGVuZCA9IGZvbGlvMi0mZ3Q7aW5kZXg7CiAJCWZvbGlvX3B1dChmb2xpbzIpOwotbm9fc3BsaXQ6CiYjNDM7c3BsaXQ6CiYjNDM7CQlpZiAocHN0YXJ0KQomIzQzOwkJCSpwc3RhcnQgPSByb3VuZF91cChwb3MgJiM0Mzsgb2Zmc2V0LAomIzQzOwkJCQkJICAgbWluX25yYnl0ZXMpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiAJCXJldHVybiB0cnVlOwogCX0KLQlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpCi0JCXJldHVybiBmYWxzZTsKLQl0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby0mZ3Q7bWFwcGluZywgZm9saW8pOwotCXJldHVybiB0cnVlOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKQomIzQzOwkJdHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tJmd0O21hcHBpbmcsIGZvbGlvKTsKJiM0Mztub19zcGxpdDoKJiM0MzsJaWYgKHBzdGFydCkKJiM0MzsJCSpwc3RhcnQgPSBvZmZzZXQgPyBmb2xpb19uZXh0X2luZGV4KGZvbGlvKSA6IGZvbGlvLSZndDtpbmRleDsKJiM0MzsJaWYgKHBlbmQpCiYjNDM7CQkqcGVuZCA9IChwb3MgJiM0Mzsgc2l6ZSAmZ3Q7ICh1NjQpbGVuZCkgPyBmb2xpby0mZ3Q7aW5kZXggOgomIzQzOwkJCQkJCSAgIGZvbGlvX25leHRfaW5kZXgoZm9saW8pOwomIzQzOwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC00MTMsMTEgJiM0Mzs0NDksOCBAQCB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCWZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgJmd0OyZndDsgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApOwogCWlmICghSVNfRVJSKGZvbGlvKSkgewogCQlzYW1lX2ZvbGlvID0gbGVuZCAmbHQ7IGZvbGlvX25leHRfcG9zKGZvbGlvKTsKLQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7Ci0JCQlzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pOwotCQkJaWYgKHNhbWVfZm9saW8pCi0JCQkJZW5kID0gZm9saW8tJmd0O2luZGV4OwotCQl9CiYjNDM7CQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsICZhbXA7c3RhcnQsCiYjNDM7CQkJCQkgICAgIHNhbWVfZm9saW8gPyAmYW1wO2VuZCA6IE5VTEwpOwogCQlmb2xpb191bmxvY2soZm9saW8pOwogCQlmb2xpb19wdXQoZm9saW8pOwogCQlmb2xpbyA9IE5VTEw7CkBAIC00MjcsOCAmIzQzOzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCWZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kICZndDsmZ3Q7IFBBR0VfU0hJRlQsCiAJCQkJCQlGR1BfTE9DSywgMCk7CiAJCWlmICghSVNfRVJSKGZvbGlvKSkgewotCQkJaWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKQotCQkJCWVuZCA9IGZvbGlvLSZndDtpbmRleDsKJiM0MzsJCQl0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsICZhbXA7ZW5kKTsKIAkJCWZvbGlvX3VubG9jayhmb2xpbyk7CiAJCQlmb2xpb19wdXQoZm9saW8pOwogCQl9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODA4CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgSW1wbGljYXRpb25zKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBmb2N1c2VkIG9uIHdoZXRoZXIgd2UgbmVlZCB0byBjb25zaWRlciBLTVNBTiBmdXp6aW5nIG9yIGlmIEtBU0FOIGlzIGFkZXF1YXRlIGZvciB0aGlzIHBhdGNoLiBJIHNlZSB0aGF0IGl0IHRvdWNoZXMgYG1tL2ludGVybmFsLmhgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vdHJ1bmNhdGUuY2Ag4oCTIHRoYXQmIzM5O3MgYSBrZXkgYXJlYSB0byB3YXRjaC4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBtb2RpZnlpbmcgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIGFuZCBpdHMgY2FsbGVycyBpbiBgc2htZW1fdW5kb19yYW5nZWAgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAuCgpMb29raW5nIGF0IHRoZSBjaGFuZ2VzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIEkgc2VlIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGFsdGVyYXRpb25zLiBUaGUgYWRkaXRpb24gb2YgYHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZGAgdG8gcmV0dXJuIHBhZ2UgaW5kaWNlcyBpcyBpbnRlcmVzdGluZywgYW5kIHRoZSBjaGFuZ2VzIGluIGluZGV4IGNvbXB1dGF0aW9uIHJlbGF0ZWQgdG8gZm9saW8gc3BsaXR0aW5nIGFyZSBpbW1lZGlhdGVseSByYWlzaW5nIGEgZmxhZy4gSSYjMzk7bSBhbHNvIG5vdGluZyB0aGUgY2hhbmdlIGluIHRoZSByZXR1cm4gdmFsdWUgc2VtYW50aWNzIOKAkyByZXR1cm5pbmcgYHRydWVgIG9ubHkgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCBub3cg4oCTIHRoYXQmIzM5O3Mgc29tZXRoaW5nIHRoYXQgY291bGQgc3VidGx5IGNoYW5nZSB0aGUgY29udHJvbCBmbG93IGluIHRoZSBjYWxsZXJzLiBUaGUgdXBkYXRlcyB0byB0aG9zZSBjYWxsZXJzLCBzcGVjaWZpY2FsbHkgYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCB0byBwYXNzIGAmYW1wO3N0YXJ0YCBhbmQgYCZhbXA7ZW5kYCBwb2ludGVycywgYXJlIGFsc28gaW1wb3J0YW50IHRvIGV4YW1pbmUuCgpOb3csIEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGNhbGxlcnMgYW5kIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhlIHZhcmlhYmxlcyBiZWluZyBwYXNzZWQgdG8gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLiBJJiMzOTttIHN0YXJ0aW5nIGJ5IGV4YW1pbmluZyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCBhcyBJIGNhbiBmaW5kIGl0IGluIGBtbS90cnVuY2F0ZS5jYCBhcm91bmQgbGluZSA0MTMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgYXJlIHVzZWQsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIG9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIHRoYXQgbWlnaHQgYmUgZXhwb3NlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSBtb3JlIGFnZ3Jlc3NpdmUgZnV6emluZyBhcHByb2FjaCB0byBjYXRjaCBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gdGhpcyBjcml0aWNhbCBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3RydW5jYXRlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzOTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM5NTpcdCAqIG1hcHBpbmcgaXMgbGFyZ2UsIGl0IGlzIHByb2JhYmx5IHRoZSBjYXNlIHRoYXQgdGhlIGZpbmFsIHBhZ2VzIGFyZSB0aGUgbW9zdFxuIDM5NjpcdCAqIHJlY2VudGx5IHRvdWNoZWQsIGFuZCBmcmVlaW5nIGhhcHBlbnMgaW4gYXNjZW5kaW5nIGZpbGUgb2Zmc2V0IG9yZGVyLlxuIDM5NzpcdCAqXG4gMzk4Olx0ICogTm90ZSB0aGF0IHNpbmNlIC1cdTAwM2VpbnZhbGlkYXRlX2ZvbGlvKCkgYWNjZXB0cyByYW5nZSB0byBpbnZhbGlkYXRlXG4gMzk5Olx0ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgaXMgYWJsZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGVuZCAmIzQzOyAxIGlzIG5vdFxuIDQwMDpcdCAqIHBhZ2UgYWxpZ25lZCBwcm9wZXJseS5cbiA0MDE6XHQgKi9cbiA0MDI6XHR2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIDQwMzpcdFx0XHRcdFx0bG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXG4gNDA0Olx0e1xuIDQwNTpcdFx0cGdvZmZfdFx0XHRzdGFydDtcdFx0LyogaW5jbHVzaXZlICovXG4gNDA2Olx0XHRwZ29mZl90XHRcdGVuZDtcdFx0LyogZXhjbHVzaXZlICovXG4gNDA3Olx0XHRzdHJ1Y3QgZm9saW9fYmF0Y2ggZmJhdGNoO1xuIDQwODpcdFx0cGdvZmZfdFx0XHRpbmRpY2VzW0ZPTElPX0JBVENIX1NJWkVdO1xuIDQwOTpcdFx0cGdvZmZfdFx0XHRpbmRleDtcbiA0MTA6XHRcdGludFx0XHRpO1xuIDQxMTpcdFx0c3RydWN0IGZvbGlvXHQqZm9saW87XG4gNDEyOlx0XHRib29sXHRcdHNhbWVfZm9saW87XG4gNDEzOlx0XG4gNDE0Olx0XHRpZiAobWFwcGluZ19lbXB0eShtYXBwaW5nKSlcbiA0MTU6XHRcdFx0cmV0dXJuO1xuIDQxNjpcdFxuIDQxNzpcdFx0LypcbiA0MTg6XHRcdCAqICYjMzk7c3RhcnQmIzM5OyBhbmQgJiMzOTtlbmQmIzM5OyBhbHdheXMgY292ZXJzIHRoZSByYW5nZSBvZiBwYWdlcyB0byBiZSBmdWxseVxuIDQxOTpcdFx0ICogdHJ1bmNhdGVkLiBQYXJ0aWFsIHBhZ2VzIGFyZSBjb3ZlcmVkIHdpdGggJiMzOTtwYXJ0aWFsX3N0YXJ0JiMzOTsgYXQgdGhlXG4gNDIwOlx0XHQgKiBzdGFydCBvZiB0aGUgcmFuZ2UgYW5kICYjMzk7cGFydGlhbF9lbmQmIzM5OyBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZS5cbiA0MjE6XHRcdCAqIE5vdGUgdGhhdCAmIzM5O2VuZCYjMzk7IGlzIGV4Y2x1c2l2ZSB3aGlsZSAmIzM5O2xlbmQmIzM5OyBpcyBpbmNsdXNpdmUuXG4gNDIyOlx0XHQgKi9cbiA0MjM6XHRcdHN0YXJ0ID0gKGxzdGFydCAmIzQzOyBQQUdFX1NJWkUgLSAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA0MjQ6XHRcdGlmIChsZW5kID09IC0xKVxuIDQyNTpcdFx0XHQvKlxuIDQyNjpcdFx0XHQgKiBsZW5kID09IC0xIGluZGljYXRlcyBlbmQtb2YtZmlsZSBzbyB3ZSBoYXZlIHRvIHNldCAmIzM5O2VuZCYjMzk7XG4gNDI3Olx0XHRcdCAqIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHBnb2ZmX3QgYW5kIHNpbmNlIHRoZSB0eXBlIGlzXG4gNDI4Olx0XHRcdCAqIHVuc2lnbmVkIHdlJiMzOTtyZSB1c2luZyAtMS5cbiA0Mjk6XHRcdFx0ICovXG4gNDMwOlx0XHRcdGVuZCA9IC0xO1xuIDQzMTpcdFx0ZWxzZVxuIDQzMjpcdFx0XHRlbmQgPSAobGVuZCAmIzQzOyAxKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiA0MzM6XHRcbiA0MzQ6XHRcdGZvbGlvX2JhdGNoX2luaXQoXHUwMDI2ZmJhdGNoKTtcbiA0MzU6XHRcdGluZGV4ID0gc3RhcnQ7XG4gNDM2Olx0XHR3aGlsZSAoaW5kZXggXHUwMDNjIGVuZCBcdTAwMjZcdTAwMjYgZmluZF9sb2NrX2VudHJpZXMobWFwcGluZywgXHUwMDI2aW5kZXgsIGVuZCAtIDEsXG4gNDM3Olx0XHRcdFx0XHUwMDI2ZmJhdGNoLCBpbmRpY2VzKSkge1xuIDQzODpcdFx0XHR0cnVuY2F0ZV9mb2xpb19iYXRjaF9leGNlcHRpb25hbHMobWFwcGluZywgXHUwMDI2ZmJhdGNoLCBpbmRpY2VzKTtcbiA0Mzk6XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgZm9saW9fYmF0Y2hfY291bnQoXHUwMDI2ZmJhdGNoKTsgaSYjNDM7JiM0MzspXG4gNDQwOlx0XHRcdFx0dHJ1bmNhdGVfY2xlYW51cF9mb2xpbyhmYmF0Y2guZm9saW9zW2ldKTtcbiA0NDE6XHRcdFx0ZGVsZXRlX2Zyb21fcGFnZV9jYWNoZV9iYXRjaChtYXBwaW5nLCBcdTAwMjZmYmF0Y2gpO1xuIDQ0MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBmb2xpb19iYXRjaF9jb3VudChcdTAwMjZmYmF0Y2gpOyBpJiM0MzsmIzQzOylcbiA0NDM6XHRcdFx0XHRmb2xpb191bmxvY2soZmJhdGNoLmZvbGlvc1tpXSk7XG4gNDQ0Olx0XHRcdGZvbGlvX2JhdGNoX3JlbGVhc2UoXHUwMDI2ZmJhdGNoKTtcbiA0NDU6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gNDQ2Olx0XHR9XG4gNDQ3Olx0XG4gNDQ4Olx0XHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgPT0gKGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuIDQ0OTpcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApO1xuIDQ1MDpcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4gNDUxOlx0XHRcdHNhbWVfZm9saW8gPSBsZW5kIFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XG4gNDUyOlx0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4gNDUzOlx0XHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIDQ1NDpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDQ1NTpcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDQ1NjpcdFx0XHRmb2xpbyA9IE5VTEw7XG4gNDU3Olx0XHR9XG4gNDU4Olx0XG4gNDU5Olx0XHRpZiAoIXNhbWVfZm9saW8pIHtcbiA0NjA6XHRcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsXG4gNDYxOlx0XHRcdFx0XHRcdFx0RkdQX0xPQ0ssIDApO1xuIDQ2MjpcdFx0XHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiA0NjM6XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFx1MDAyNmVuZCk7XG4gNDY0Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiA0NjU6XHRcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDQ2NjpcdFx0XHR9XG4gNDY3Olx0XHR9XG4gNDY4Olx0XG4gNDY5Olx0XHRpbmRleCA9IHN0YXJ0O1xuIDQ3MDpcdFx0d2hpbGUgKGluZGV4IFx1MDAzYyBlbmQpIHtcbiA0NzE6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gNDcyOlx0XHRcdGlmICghZmluZF9nZXRfZW50cmllcyhtYXBwaW5nLCBcdTAwMjZpbmRleCwgZW5kIC0gMSwgXHUwMDI2ZmJhdGNoLFxuIDQ3MzpcdFx0XHRcdFx0aW5kaWNlcykpIHtcbiA0NzQ6XHRcdFx0XHQvKiBJZiBhbGwgZ29uZSBmcm9tIHN0YXJ0IG9ud2FyZHMsIHdlJiMzOTtyZSBkb25lICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA2OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4MzUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIGludG8gYG1tL3NobWVtLmNgKioKCk9rYXksIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIuIEJhc2VkIG9uIHRoZSBjdXJyZW50IGlzc3VlLCBteSBpbnR1aXRpb24gaXMgcG9pbnRpbmcgbWUgdG93YXJkcyB0aGUgc2hhcmVkIG1lbW9yeSBjb2RlLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgbW0vc2htZW0uY2AsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IGNhbmRpZGF0ZSBmb3IgdGhlIHR5cGUgb2YgbWVtb3J5IGludGVyYWN0aW9uIHRoZSBpc3N1ZSBpcyByZWxhdGVkIHRvLiBUaGUgYmVoYXZpb3IgcmVwb3J0ZWQgaGFzIGEgY2VydGFpbiBudWFuY2UgYW5kIHRoZSBzaGFyZWQgbWVtb3J5IGltcGxlbWVudGF0aW9ucyBzb21ldGltZXMgaGF2ZSBzdWJ0bGUgaXNzdWVzLiBJ4oCZbSB0aGlua2luZyB0aGVyZSBtaWdodCBiZSBzb21ldGhpbmcgcmVsYXRlZCB0byBhbGxvY2F0aW9uIG9yIHN5bmNocm9uaXphdGlvbiB0aGVyZS4gTm93LCBzcGVjaWZpY2FsbHksIGdpdmVuIHdoYXQgSSYjMzk7bSBzZWVpbmcsIGxldCYjMzk7cyB6ZXJvIGluIG9uIHRoZSBhcmVhIGFyb3VuZCBsaW5lIDExNzUuIFRoYXQgZmVlbHMgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBzcGVjaWZpYyBsaW5lIGFuZCB3aGF0IGl0JiMzOTtzIGRvaW5nLCBhbmQgc2VlIGlmIGl0JiMzOTtzIGNvbnRyaWJ1dGluZyB0byB0aGlzIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAwNzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3NobWVtLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTA6XHRcdFx0XHRcdG5yX3N3YXBzX2ZyZWVkICYjNDM7PSBzaG1lbV9mcmVlX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjExNTE6XHRcdFx0XHRcdFx0XHRcdFx0ICBlbmQgLSAxLCBmb2xpbyk7XG4xMTUyOlx0XHRcdFx0XHRjb250aW51ZTtcbjExNTM6XHRcdFx0XHR9XG4xMTU0Olx0XG4xMTU1Olx0XHRcdFx0aWYgKCF1bmZhbGxvYyB8fCAhZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpXG4xMTU2Olx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4xMTU3Olx0XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbjExNTg6XHRcdFx0fVxuMTE1OTpcdFx0XHRmb2xpb19iYXRjaF9yZW1vdmVfZXhjZXB0aW9uYWxzKFx1MDAyNmZiYXRjaCk7XG4xMTYwOlx0XHRcdGZvbGlvX2JhdGNoX3JlbGVhc2UoXHUwMDI2ZmJhdGNoKTtcbjExNjE6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4xMTYyOlx0XHR9XG4xMTYzOlx0XG4xMTY0Olx0XHQvKlxuMTE2NTpcdFx0ICogV2hlbiB1bmRvaW5nIGEgZmFpbGVkIGZhbGxvY2F0ZSwgd2Ugd2FudCBub25lIG9mIHRoZSBwYXJ0aWFsIGZvbGlvXG4xMTY2Olx0XHQgKiB6ZXJvaW5nIGFuZCBzcGxpdHRpbmcgYmVsb3csIGJ1dCBzaGFsbCB3YW50IHRvIHRydW5jYXRlIHRoZSB3aG9sZVxuMTE2NzpcdFx0ICogZm9saW8gd2hlbiAhdXB0b2RhdGUgaW5kaWNhdGVzIHRoYXQgaXQgd2FzIGFkZGVkIGJ5IHRoaXMgZmFsbG9jYXRlLFxuMTE2ODpcdFx0ICogZXZlbiB3aGVuIFtsc3RhcnQsIGxlbmRdIGNvdmVycyBvbmx5IGEgcGFydCBvZiB0aGUgZm9saW8uXG4xMTY5Olx0XHQgKi9cbjExNzA6XHRcdGlmICh1bmZhbGxvYylcbjExNzE6XHRcdFx0Z290byB3aG9sZV9mb2xpb3M7XG4xMTcyOlx0XG4xMTczOlx0XHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgPT0gKGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMTE3NDpcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbjExNzU6XHRcdGlmIChmb2xpbykge1xuMTE3NjpcdFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuMTE3NzpcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbjExNzg6XHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcdTAwMjZzdGFydCxcbjExNzk6XHRcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4xMTgwOlx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4xMTgxOlx0XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4xMTgyOlx0XHRcdGZvbGlvID0gTlVMTDtcbjExODM6XHRcdH1cbjExODQ6XHRcbjExODU6XHRcdGlmICghc2FtZV9mb2xpbylcbjExODY6XHRcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4xMTg3Olx0XHRpZiAoZm9saW8pIHtcbjExODg6XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4xMTg5Olx0XHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbjExOTA6XHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbjExOTE6XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjExOTI6XHRcdH1cbjExOTM6XHRcbjExOTQ6XHR3aG9sZV9mb2xpb3M6XG4xMTk1Olx0XG4xMTk2Olx0XHRpbmRleCA9IHN0YXJ0O1xuMTE5NzpcdFx0d2hpbGUgKGluZGV4IFx1MDAzYyBlbmQpIHtcbjExOTg6XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmICghZmluZF9nZXRfZW50cmllcyhtYXBwaW5nLCBcdTAwMjZpbmRleCwgZW5kIC0gMSwgXHUwMDI2ZmJhdGNoLFxuMTIwMTpcdFx0XHRcdFx0aW5kaWNlcykpIHtcbjEyMDI6XHRcdFx0XHQvKiBJZiBhbGwgZ29uZSBvciBob2xlLXB1bmNoIG9yIHVuZmFsbG9jLCB3ZSYjMzk7cmUgZG9uZSAqL1xuMTIwMzpcdFx0XHRcdGlmIChpbmRleCA9PSBzdGFydCB8fCBlbmQgIT0gLTEpXG4xMjA0Olx0XHRcdFx0XHRicmVhaztcbjEyMDU6XHRcdFx0XHQvKiBCdXQgaWYgdHJ1bmNhdGluZywgcmVzdGFydCB0byBtYWtlIHN1cmUgYWxsIGdvbmUgKi9cbjEyMDY6XHRcdFx0XHRpbmRleCA9IHN0YXJ0O1xuMTIwNzpcdFx0XHRcdGNvbnRpbnVlO1xuMTIwODpcdFx0XHR9XG4xMjA5Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFx1MDAyNmZiYXRjaCk7IGkmIzQzOyYjNDM7KSB7XG4xMjEwOlx0XHRcdFx0Zm9saW8gPSBmYmF0Y2guZm9saW9zW2ldO1xuMTIxMTpcdFxuMTIxMjpcdFx0XHRcdGlmICh4YV9pc192YWx1ZShmb2xpbykpIHtcbjEyMTM6XHRcdFx0XHRcdGludCBvcmRlcjtcbjEyMTQ6XHRcdFx0XHRcdGxvbmcgc3dhcHNfZnJlZWQ7XG4xMjE1Olx0XG4xMjE2Olx0XHRcdFx0XHRpZiAodW5mYWxsb2MpXG4xMjE3Olx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuMTIxODpcdFx0XHRcdFx0c3dhcHNfZnJlZWQgPSBzaG1lbV9mcmVlX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjEyMTk6XHRcdFx0XHRcdFx0XHRcdCAgICAgIGVuZCAtIDEsIGZvbGlvKTtcbjEyMjA6XHRcdFx0XHRcdGlmICghc3dhcHNfZnJlZWQpIHtcbjEyMjE6XHRcdFx0XHRcdFx0cGdvZmZfdCBiYXNlID0gaW5kaWNlc1tpXTtcbjEyMjI6XHRcbjEyMjM6XHRcdFx0XHRcdFx0b3JkZXIgPSBzaG1lbV9jb25maXJtX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcbjEyMjQ6XHRcdFx0XHRcdFx0XHRcdFx0ICAgcmFkaXhfdG9fc3dwX2VudHJ5KGZvbGlvKSk7XG4xMjI1Olx0XHRcdFx0XHRcdC8qXG4xMjI2Olx0XHRcdFx0XHRcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XG4xMjI3Olx0XHRcdFx0XHRcdCAqIGJvcmRlciwgc2tpcCBpdCBhcyB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1xuMTIyODpcdFx0XHRcdFx0XHQgKiBhYm92ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB6ZXJvZCBpdHMgY29udGVudCBvbmNlLlxuMTIyOTpcdFx0XHRcdFx0XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMDc6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODI4MAoJCQkJCQkJb3V0cHV0OiAyMjMKCQkJCQkJCXRob3VnaHRzOiA4ODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGlzIGNsZWFybHkgZm9jdXNlZCBvbiByZWZpbmluZyBob3cgd2UgaGFuZGxlIHBhcnRpYWwgZm9saW9zIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLiBTcGVjaWZpY2FsbHksIGl0JiMzOTtzIGNsZWFuaW5nIHVwIHRoZSBpbnRlcmZhY2UgdG8gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLiBJbnN0ZWFkIG9mIHRoZSBjYWxsZXIgaGF2aW5nIHRvIGZpZ3VyZSBvdXQgc3RhcnQgYW5kIGVuZCBwYWdlIG9mZnNldHMgYmFzZWQgb24gcmV0dXJuIHZhbHVlcywgdGhlIGZ1bmN0aW9uIG5vdyBkaXJlY3RseSB1cGRhdGVzIGAqcHN0YXJ0YCBhbmQgYCpwZW5kYC4gTWFrZXMgc2Vuc2Ug4oCTIG1vcmUgZXhwbGljaXQgaXMgZ2VuZXJhbGx5IGJldHRlciwgYW5kIGl0IHNpbXBsaWZpZXMgdGhlIGxvZ2ljIG9uIHRoZSBjYWxsZXImIzM5O3Mgc2lkZS4KClRoZSBtYWluIGNoYW5nZXMgc2VlbSB0byBiZSBpbiBob3cgaXQgZGVhbHMgd2l0aCBsYXJnZSBmb2xpbyBzcGxpdHMuIEl0IGxvb2tzIGxpa2UgYHBzdGFydGAgYW5kIGBwZW5kYCBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIG9yIGBzaG1lbV91bmRvX3JhbmdlYCwgYW5kIHRoZW4gYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gIGRvZXMgdGhlIGFzc2lnbm1lbnRzLiBJIHNlZSB0aGUgYXNzaWdubWVudHMgYXJlIGJhc2VkIG9uIHdoZXRoZXIgZm9saW8gc3BsaXR0aW5nIGlzIHN1Y2Nlc3NmdWw6IGlmIGBmb2xpb19zcGxpdF9vcl91bm1hcGAgd29ya3MsIHdlIHVwZGF0ZSBgKnBlbmRgIGFuZCBgKnBzdGFydGAgd2l0aCB0aGUgY29ycmVjdGx5IHJvdW5kZWQgdmFsdWVzLiBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQsIG5vIG1hdHRlciB0aGUgcGF0aCwgd2hldGhlciBhIHNwbGl0IG9jY3VycyBvciBub3QsIHRoZSBgcHN0YXJ0YCBhbmQgYHBlbmRgIHBvaW50ZXJzLCBpZiBwcm92aWRlZCwgZ2V0IGluaXRpYWxpemVkLiBUaGUgY2FsbGVyJiMzOTtzIGBzdGFydGAgYW5kIGBlbmRgIHdlcmUgcHJlLWluaXRpYWxpemVkLCBzbyB0aGlzIGF2b2lkcyB0aGUgaW5pdGlhbCB2YXJpYWJsZSBpc3N1ZSBlbnRpcmVseS4KCk5vdywgZm9yIEtNU0FOLiBUaGUgY3JpdGljYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnk/IExldCYjMzk7cyBnbyB0aHJvdWdoIHRoZSBLTVNBTiBjcml0ZXJpYS4gRmlyc3QsIGtlcm5lbCBzdHJ1Y3R1cmVzIHBhc3NlZCB0byB1c2VyIHNwYWNlOiBub3BlLCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHBhZ2UgY2FjaGUgb3BlcmF0aW9ucyDigJMgYWxsIHdpdGhpbiBrZXJuZWwgc3BhY2UuIFNlY29uZCwgY29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIExvY2FsIHZhcmlhYmxlcywgaW5jbHVkaW5nIHRoaW5ncyBsaWtlIGB0YWlsX2lzb2xhdGVkYCwgYHNwbGl0X2F0YCwgYHNwbGl0X2F0MmAsIGFuZCB0aGUgZm9saW9zIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBUaGUgY2FsbGVyIGluaXRpYWxpemVzIGBzdGFydGAgYW5kIGBlbmRgLiBObyByaXNrIHRoZXJlLiBUaGlyZCwgYWxsb2NhdGlvbiBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcz8gQWdhaW4sIG5vLiBBbmQgZm91cnRoLCBhbnkgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIGJ5dGVzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYm91bmRzIGNoZWNrcyBvciBsZW5ndGggY2FsY3VsYXRpb25zPyBUaGUgY29kZSBpcyBtb3N0bHkgYWJvdXQgbWVtb3J5IG1hbmFnZW1lbnQ6IHplcm9pbmcgcG9ydGlvbnMgb2YgZm9saW9zIHdpdGggYGZvbGlvX3plcm9fcmFuZ2VgLCBzcGxpdHRpbmcgdGhlbSwgYW5kIHRydW5jYXRpb24gaXRzZWxmLiBaZXJvaW5nIHBhZ2UgY29udGVudCBpcyBsZWdpdGltYXRlIGFuZCBleHBlY3RlZC4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJiMzOTtsbCBnbyB0aHJvdWdoIHRoZSB2YXJpYWJsZXMuIGBtaW5fbnJieXRlc2AgaXMgaW5pdGlhbGl6ZWQuIGB0YWlsX2lzb2xhdGVkYCBpcyBleHBsaWNpdGx5IGluaXRpYWxpemVkIHRvIGB0cnVlYC4gYGZvbGlvMmAgaXMgaW5pdGlhbGl6ZWQuIGBzcGxpdF9hdGAgYW5kIGBzcGxpdF9hdDJgIGFyZSBhbHNvIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIFNvLCBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBiZWluZyB1c2VkLCBwZXJpb2QuCgpUaGVyZWZvcmUsIHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCByYWNlIGNvbmRpdGlvbnMsIGxvY2tpbmcsIG9yIG91dC1vZi1ib3VuZHMgdHJ1bmNhdGlvbiByYW5nZXMgd2lsbCBiZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBWTSBhc3NlcnRpb25zLiBUaW1lIHRvIG1vdmUgb24gYW5kIHByZXBhcmUgdGhlIGNhbGwgZm9yIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDA3OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGZvbGlvIHNwbGl0dGluZyBhbmQgcmFuZ2UgY2FsY3VsYXRpb24gbG9naWMgaW4gdGhlIHBhZ2UgY2FjaGUgdHJ1bmNhdGlvbiBjb2RlIChgbW0vdHJ1bmNhdGUuY2AsIGBtbS9zaG1lbS5jYCwgYW5kIGBtbS9pbnRlcm5hbC5oYCkgYnkgcmV0dXJuaW5nIHVwZGF0ZWQgcGFnZSByYW5nZSBib3VuZGFyaWVzIHZpYSBgcHN0YXJ0YCBhbmQgYHBlbmRgIHBvaW50ZXJzLlxuXG5BbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwb2ludGVycyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIChgbWluX25yYnl0ZXNgLCBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBgZm9saW8yYCwgYCpwc3RhcnRgLCBgKnBlbmRgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgY2FsbGVyIHZhcmlhYmxlcyAoYHN0YXJ0YCwgYGVuZGApIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkIHByaW9yIHRvIGludm9jYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVncyBpbiBwYWdlIGNhY2hlIHRydW5jYXRpb24sIGZvbGlvIHNwbGl0dGluZywgb3IgcmVmZXJlbmNlIGNvdW50aW5nIHdvdWxkIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgbG9ja2luZywgb3IgcGFnZSBzdGF0ZSBpbnZhbGlkYXRpb24sIHdoaWNoIGFyZSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHBhZ2UgY2FjaGUgYXNzZXJ0aW9ucyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBmb2xpbyBzcGxpdHRpbmcgYW5kIHJhbmdlIGNhbGN1bGF0aW9uIGxvZ2ljIGluIHRoZSBwYWdlIGNhY2hlIHRydW5jYXRpb24gY29kZSAoYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGApIGJ5IHJldHVybmluZyB1cGRhdGVkIHBhZ2UgcmFuZ2UgYm91bmRhcmllcyB2aWEgYHBzdGFydGAgYW5kIGBwZW5kYCBwb2ludGVycy5cblxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxMC44MDcxNDMwNTJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4Nzg4NTc3OTg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MTAuODA3MTQ5NDgyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDgwMDY0ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBkODAzMGE0MWUwYjBiNjg2N2E0YjNlYzIyM2MxNjc5OTE1Y2I2NzcwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcXG5pbmRleCA2OGRiNWFiZDBhNGNlLi42ZTZhZDMxODczNzhhIDEwMDY0NFxcbi0tLSBhL21tL2ludGVybmFsLmhcXG4rKysgYi9tbS9pbnRlcm5hbC5oXFxuQEAgLTYyNyw4ICs2MjcsOCBAQCB1bnNpZ25lZCBmaW5kX2xvY2tfZW50cmllcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqc3RhcnQsXFxuIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxcbiBcXHRcXHRwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpO1xcbiBpbnQgdHJ1bmNhdGVfaW5vZGVfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LFxcbi1cXHRcXHRsb2ZmX3QgZW5kKTtcXG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxuK1xcdFxcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xcbiB1bnNpZ25lZCBsb25nIG1hcHBpbmdfdHJ5X2ludmFsaWRhdGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdFxcdHBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kLCB1bnNpZ25lZCBsb25nICpucl9mYWlsZWQpO1xcbmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uY1xcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XFxuLS0tIGEvbW0vc2htZW0uY1xcbisrKyBiL21tL3NobWVtLmNcXG5AQCAtMTE3NSwxMSArMTE3NSw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXFxuIFxcdGlmIChmb2xpbykge1xcbiBcXHRcXHRzYW1lX2ZvbGlvID0gbGVuZCBcXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcXG4gXFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbi1cXHRcXHRcXHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xcbi1cXHRcXHRcXHRpZiAoc2FtZV9mb2xpbylcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbi1cXHRcXHR9XFxuK1xcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIFxcdFxcdGZvbGlvID0gTlVMTDtcXG5AQCAtMTE4OSw4ICsxMTg2LDcgQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcXG4gXFx0XFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4gXFx0aWYgKGZvbGlvKSB7XFxuIFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbi1cXHRcXHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXFxuLVxcdFxcdFxcdGVuZCA9IGZvbGlvLVxcdTAwM2VpbmRleDtcXG4rXFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG4gXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gXFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gXFx0fVxcbkBAIC0xMjU4LDcgKzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxcbiBcXG4gXFx0XFx0XFx0XFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xcbiBcXHRcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdFxcdFxcdFxcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbitcXHRcXHRcXHRcXHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHtcXG4gXFx0XFx0XFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0XFx0XFx0ICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzb1xcbiBcXHRcXHRcXHRcXHRcXHQgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuXFxuZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jXFxuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcXG4tLS0gYS9tbS90cnVuY2F0ZS5jXFxuKysrIGIvbW0vdHJ1bmNhdGUuY1xcbkBAIC0yMDYsMzUgKzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCxcXG4gLypcXG4gICogSGFuZGxlIHBhcnRpYWwgZm9saW9zLiAgVGhlIGZvbGlvIG1heSBiZSBlbnRpcmVseSB3aXRoaW4gdGhlXFxuICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlXFxuLSAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXFxuKyAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtsc3RhcnQsIGxlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWZcXG4gICogaXQncyBsYXJnZS4gIHNwbGl0X3BhZ2VfcmFuZ2UoKSB3aWxsIGRpc2NhcmQgcGFnZXMgd2hpY2ggbm93IGxpZSBiZXlvbmRcXG4gICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhXFxuICAqIG5ld2x5IGNyZWF0ZWQgaG9sZS5cXG4gICpcXG4tICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkXFxuLSAqIGRpc2NhcmRpbmcgdGhlIGVudGlyZSBmb2xpbyB3aGljaCBpcyBzdHViYm9ybmx5IHVuc3BsaXQuXFxuKyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcXG4rICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXFxuKyAqIGkuZS4gdGhlIHJhbmdlIG9mIHBhZ2VzIHRoYXQgYXJlIHdob2xseSB3aXRoaW4gW2xzdGFydCwgbGVuZF0gYW5kIHNvIHNhZmVcXG4rICogdG8gZGlzY2FyZC5cXG4rICpcXG4rICogUmV0dXJuICV0cnVlIGlmIHRoZSBmb2xpbyB3YXMgc3BsaXQsICVmYWxzZSBvdGhlcndpc2UuXFxuICAqL1xcbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxcbitib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcXG4rXFx0XFx0XFx0XFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxcbiB7XFxuIFxcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xcbiBcXHRzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pO1xcbiBcXHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XFxuIFxcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcXG4rXFx0dW5zaWduZWQgbG9uZyBtaW5fbnJieXRlcztcXG4gXFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4gXFxuLVxcdGlmIChwb3MgXFx1MDAzYyBzdGFydClcXG4tXFx0XFx0b2Zmc2V0ID0gc3RhcnQgLSBwb3M7XFxuK1xcdGlmIChwb3MgXFx1MDAzYyBsc3RhcnQpXFxuK1xcdFxcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcXG4gXFx0ZWxzZVxcbiBcXHRcXHRvZmZzZXQgPSAwO1xcbi1cXHRpZiAocG9zICsgc2l6ZSBcXHUwMDNjPSAodTY0KWVuZClcXG4rXFx0aWYgKHBvcyArIHNpemUgXFx1MDAzYz0gKHU2NClsZW5kKVxcbiBcXHRcXHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xcbiBcXHRlbHNlXFxuLVxcdFxcdGxlbmd0aCA9IGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XFxuK1xcdFxcdGxlbmd0aCA9IGxlbmQgKyAxIC0gcG9zIC0gb2Zmc2V0O1xcbiBcXG4gXFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xcbiBcXHRpZiAobGVuZ3RoID09IHNpemUpIHtcXG4gXFx0XFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXFx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdGdvdG8gbm9fc3BsaXQ7XFxuIFxcdH1cXG4gXFxuIFxcdC8qXFxuQEAgLTI0OCw5ICsyNTQsMTAgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcXG4gXFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxcbiBcXHRcXHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XFxuIFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbitcXHRcXHRnb3RvIG5vX3NwbGl0O1xcbiBcXG4gXFx0bWluX29yZGVyID0gbWFwcGluZ19taW5fZm9saW9fb3JkZXIoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbitcXHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbiBcXHRzcGxpdF9hdCA9IGZvbGlvX3BhZ2UoZm9saW8sIFBBR0VfQUxJR05fRE9XTihvZmZzZXQpIC8gUEFHRV9TSVpFKTtcXG4gXFx0aWYgKCFmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbywgc3BsaXRfYXQsIG1pbl9vcmRlcikpIHtcXG4gXFx0XFx0LypcXG5AQCAtMjU5LDM4ICsyNjYsNjcgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcXG4gXFx0XFx0ICogZm9yIHNobWVtIHRydW5jYXRlXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcXG4rXFx0XFx0Ym9vbCB0YWlsX2lzb2xhdGVkID0gdHJ1ZTtcXG4gXFxuLVxcdFxcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcXG4tXFx0XFx0XFx0Z290byBub19zcGxpdDtcXG4rXFx0XFx0aWYgKHBlbmQpXFxuK1xcdFxcdFxcdCpwZW5kID0gcm91bmRfZG93bihwb3MgKyBvZmZzZXQgKyBsZW5ndGgsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIG1pbl9ucmJ5dGVzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiBcXG4rXFx0XFx0aWYgKG9mZnNldCArIGxlbmd0aCA9PSBzaXplKVxcbitcXHRcXHRcXHRnb3RvIHNwbGl0O1xcbityZXRyeTpcXG4gXFx0XFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcXG4gXFx0XFx0XFx0XFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xcbiBcXHRcXHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XFxuIFxcbiBcXHRcXHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcXG4tXFx0XFx0XFx0Z290byBub19zcGxpdDtcXG4rXFx0XFx0XFx0Z290byBzcGxpdDtcXG4gXFxuIFxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFxuLVxcdFxcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKVxcbitcXHRcXHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkge1xcbitcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50XFxuK1xcdFxcdCAqIHNwbGl0LiBSZXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGZvbGlvIGluIGNhc2UgaXQncyBzdGlsbFxcbitcXHRcXHQgKiBsYXJnZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XFxuK1xcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xcbitcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8yKTtcXG4rXFx0XFx0XFx0Z290byByZXRyeTtcXG4rXFx0XFx0fVxcbiBcXG4gXFx0XFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXFxuIFxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGZvbGlvMi1cXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cXHUwMDNlbWFwcGluZylcXG4tXFx0XFx0XFx0Zm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcik7XFxuK1xcdFxcdCAgICBmb2xpbzItXFx1MDAzZW1hcHBpbmcgPT0gZm9saW8tXFx1MDAzZW1hcHBpbmcgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKVxcbitcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIFxcbiBcXHRcXHRmb2xpb191bmxvY2soZm9saW8yKTtcXG4gb3V0OlxcbitcXHRcXHRpZiAoIXRhaWxfaXNvbGF0ZWQgXFx1MDAyNlxcdTAwMjYgcGVuZClcXG4rXFx0XFx0XFx0KnBlbmQgPSBmb2xpbzItXFx1MDAzZWluZGV4O1xcbiBcXHRcXHRmb2xpb19wdXQoZm9saW8yKTtcXG4tbm9fc3BsaXQ6XFxuK3NwbGl0OlxcbitcXHRcXHRpZiAocHN0YXJ0KVxcbitcXHRcXHRcXHQqcHN0YXJ0ID0gcm91bmRfdXAocG9zICsgb2Zmc2V0LFxcbitcXHRcXHRcXHRcXHRcXHQgICBtaW5fbnJieXRlcykgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdH1cXG4tXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVxcdTAwM2VtYXBwaW5nLCBmb2xpbyk7XFxuLVxcdHJldHVybiB0cnVlO1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxcbitcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cXHUwMDNlbWFwcGluZywgZm9saW8pO1xcbitub19zcGxpdDpcXG4rXFx0aWYgKHBzdGFydClcXG4rXFx0XFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXFx1MDAzZWluZGV4O1xcbitcXHRpZiAocGVuZClcXG4rXFx0XFx0KnBlbmQgPSAocG9zICsgc2l6ZSBcXHUwMDNlICh1NjQpbGVuZCkgPyBmb2xpby1cXHUwMDNlaW5kZXggOlxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbiB9XFxuIFxcbiAvKlxcbkBAIC00MTMsMTEgKzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgRkdQX0xPQ0ssIDApO1xcbiBcXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcXG4gXFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxuLVxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xcbi1cXHRcXHRcXHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xcbi1cXHRcXHRcXHRpZiAoc2FtZV9mb2xpbylcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbi1cXHRcXHR9XFxuK1xcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIFxcdFxcdGZvbGlvID0gTlVMTDtcXG5AQCAtNDI3LDggKzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuIFxcdFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdEZHUF9MT0NLLCAwKTtcXG4gXFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSlcXG4tXFx0XFx0XFx0XFx0ZW5kID0gZm9saW8tXFx1MDAzZWluZGV4O1xcbitcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFxcdTAwMjZlbmQpO1xcbiBcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiBcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbiBcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjExLjQxNjA3NTE1NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE0MTUzNDc5MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiU0hNRU1cIixcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb1wiLFxuICAgIFwic2htZW1fdW5kb19yYW5nZVwiLFxuICAgIFwidHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3RydW5jYXRlLmMgYW5kIG1tL3NobWVtLmMgZm9yIGhhbmRsaW5nIHBhcnRpYWwgZm9saW8gdHJ1bmNhdGlvbiBhbmQgc3BsaXR0aW5nIHdoZW4gdHJ1bmNhdGluZyBwYWdlY2FjaGUgYW5kIHNobWVtIHJhbmdlcy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSBzdGFuZGFyZCB0cnVuY2F0aW9uIGFuZCBob2xlLXB1bmNoaW5nIHN5c2NhbGxzIChlLmcuLCB0cnVuY2F0ZSwgZnRydW5jYXRlLCBmYWxsb2NhdGUpIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGZvbGlvIHNwbGl0dGluZyBhbmQgaW5kZXggYm91bmRhcnkgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZDgwMzBhNDFlMGIwYjY4NjdhNGIzZWMyMjNjMTY3OTkxNWNiNjc3MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMDY6NTk6MTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggNjhkYjVhYmQwYTRjZS4uNmU2YWQzMTg3Mzc4YSAxMDA2NDRcbi0tLSBhL21tL2ludGVybmFsLmhcbisrKyBiL21tL2ludGVybmFsLmhcbkBAIC02MjcsOCArNjI3LDggQEAgdW5zaWduZWQgZmluZF9sb2NrX2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxuIHVuc2lnbmVkIGZpbmRfZ2V0X2VudHJpZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgKnN0YXJ0LFxuIFx0XHRwZ29mZl90IGVuZCwgc3RydWN0IGZvbGlvX2JhdGNoICpmYmF0Y2gsIHBnb2ZmX3QgKmluZGljZXMpO1xuIGludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XG4tYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCxcbi1cdFx0bG9mZl90IGVuZCk7XG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4rXHRcdGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpO1xuIGxvbmcgbWFwcGluZ19ldmljdF9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XG4gdW5zaWduZWQgbG9uZyBtYXBwaW5nX3RyeV9pbnZhbGlkYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxuIFx0XHRwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwgdW5zaWduZWQgbG9uZyAqbnJfZmFpbGVkKTtcbmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uY1xuaW5kZXggODlhMTQ5NWU1NWY3ZS4uNGVmYmJiYmE1ZGE1OSAxMDA2NDRcbi0tLSBhL21tL3NobWVtLmNcbisrKyBiL21tL3NobWVtLmNcbkBAIC0xMTc1LDExICsxMTc1LDggQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbiBcdGlmIChmb2xpbykge1xuIFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuIFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4rXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHRmb2xpbyA9IE5VTEw7XG5AQCAtMTE4OSw4ICsxMTg2LDcgQEAgc3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcbiBcdFx0Zm9saW8gPSBzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhpbm9kZSwgbGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4gXHRpZiAoZm9saW8pIHtcbiBcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSlcbi1cdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbitcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0fVxuQEAgLTEyNTgsNyArMTI1NCw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXG4gXHRcdFx0XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7XG4gXHRcdFx0XHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0XHRcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xuK1x0XHRcdFx0fSBlbHNlIGlmICh0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLFxuK1x0XHRcdFx0XHRcdFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xuIFx0XHRcdFx0XHQvKlxuIFx0XHRcdFx0XHQgKiBJZiB3ZSBzcGxpdCBhIHBhZ2UsIHJlc2V0IHRoZSBsb29wIHNvXG4gXHRcdFx0XHRcdCAqIHRoYXQgd2UgcGljayB1cCB0aGUgbmV3IHN1YiBwYWdlcy5cbmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuY1xuaW5kZXggYjU4YmE5NDBiZTQ3NC4uZDg4YTFiMTU5MDg0NSAxMDA2NDRcbi0tLSBhL21tL3RydW5jYXRlLmNcbisrKyBiL21tL3RydW5jYXRlLmNcbkBAIC0yMDYsMzUgKzIwNiw0MSBAQCBzdGF0aWMgaW50IGZvbGlvX3NwbGl0X29yX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpzcGxpdF9hdCxcbiAvKlxuICAqIEhhbmRsZSBwYXJ0aWFsIGZvbGlvcy4gIFRoZSBmb2xpbyBtYXkgYmUgZW50aXJlbHkgd2l0aGluIHRoZVxuICAqIHJhbmdlIGlmIGEgc3BsaXQgaGFzIHJhY2VkIHdpdGggdXMuICBJZiBub3QsIHdlIHplcm8gdGhlIHBhcnQgb2YgdGhlXG4tICogZm9saW8gdGhhdCdzIHdpdGhpbiB0aGUgW3N0YXJ0LCBlbmRdIHJhbmdlLCBhbmQgdGhlbiBzcGxpdCB0aGUgZm9saW8gaWZcbisgKiBmb2xpbyB0aGF0J3Mgd2l0aGluIHRoZSBbbHN0YXJ0LCBsZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXG4gICogaXQncyBsYXJnZS4gIHNwbGl0X3BhZ2VfcmFuZ2UoKSB3aWxsIGRpc2NhcmQgcGFnZXMgd2hpY2ggbm93IGxpZSBiZXlvbmRcbiAgKiBpX3NpemUsIGFuZCB3ZSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gZGlzY2FyZCBwYWdlcyB3aGljaCBsaWUgd2l0aGluIGFcbiAgKiBuZXdseSBjcmVhdGVkIGhvbGUuXG4gICpcbi0gKiBSZXR1cm5zIGZhbHNlIGlmIHNwbGl0dGluZyBmYWlsZWQgc28gdGhlIGNhbGxlciBjYW4gYXZvaWRcbi0gKiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUgZm9saW8gd2hpY2ggaXMgc3R1YmJvcm5seSB1bnNwbGl0LlxuKyAqIFdoZW4gQHBzdGFydCBhbmQvb3IgQHBlbmQgYXJlIG5vbi1OVUxMIHRoZXkgcmVjZWl2ZSB0aGUgaW5kZXhlcyBvZiB0aGVcbisgKiBwYWdlIHJhbmdlIGZ1bGx5IGNvdmVyZWQgYnkgW2xzdGFydCwgbGVuZF0gYWZ0ZXIgYW55IHNwbGl0IChvciBub25lKSxcbisgKiBpLmUuIHRoZSByYW5nZSBvZiBwYWdlcyB0aGF0IGFyZSB3aG9sbHkgd2l0aGluIFtsc3RhcnQsIGxlbmRdIGFuZCBzbyBzYWZlXG4rICogdG8gZGlzY2FyZC5cbisgKlxuKyAqIFJldHVybiAldHJ1ZSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0LCAlZmFsc2Ugb3RoZXJ3aXNlLlxuICAqL1xuLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4rYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXG4rXHRcdFx0XHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXG4ge1xuIFx0bG9mZl90IHBvcyA9IGZvbGlvX3Bvcyhmb2xpbyk7XG4gXHRzaXplX3Qgc2l6ZSA9IGZvbGlvX3NpemUoZm9saW8pO1xuIFx0dW5zaWduZWQgaW50IG9mZnNldCwgbGVuZ3RoO1xuIFx0c3RydWN0IHBhZ2UgKnNwbGl0X2F0LCAqc3BsaXRfYXQyO1xuK1x0dW5zaWduZWQgbG9uZyBtaW5fbnJieXRlcztcbiBcdHVuc2lnbmVkIGludCBtaW5fb3JkZXI7XG4gXG4tXHRpZiAocG9zIFx1MDAzYyBzdGFydClcbi1cdFx0b2Zmc2V0ID0gc3RhcnQgLSBwb3M7XG4rXHRpZiAocG9zIFx1MDAzYyBsc3RhcnQpXG4rXHRcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcbiBcdGVsc2VcbiBcdFx0b2Zmc2V0ID0gMDtcbi1cdGlmIChwb3MgKyBzaXplIFx1MDAzYz0gKHU2NCllbmQpXG4rXHRpZiAocG9zICsgc2l6ZSBcdTAwM2M9ICh1NjQpbGVuZClcbiBcdFx0bGVuZ3RoID0gc2l6ZSAtIG9mZnNldDtcbiBcdGVsc2Vcbi1cdFx0bGVuZ3RoID0gZW5kICsgMSAtIHBvcyAtIG9mZnNldDtcbitcdFx0bGVuZ3RoID0gbGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XG4gXG4gXHRmb2xpb193YWl0X3dyaXRlYmFjayhmb2xpbyk7XG4gXHRpZiAobGVuZ3RoID09IHNpemUpIHtcbiBcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0Z290byBub19zcGxpdDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMjQ4LDkgKzI1NCwxMCBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0aWYgKGZvbGlvX25lZWRzX3JlbGVhc2UoZm9saW8pKVxuIFx0XHRmb2xpb19pbnZhbGlkYXRlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XG4gXHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0Z290byBub19zcGxpdDtcbiBcbiBcdG1pbl9vcmRlciA9IG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKGZvbGlvLVx1MDAzZW1hcHBpbmcpO1xuK1x0bWluX25yYnl0ZXMgPSBtYXBwaW5nX21pbl9mb2xpb19ucmJ5dGVzKGZvbGlvLVx1MDAzZW1hcHBpbmcpO1xuIFx0c3BsaXRfYXQgPSBmb2xpb19wYWdlKGZvbGlvLCBQQUdFX0FMSUdOX0RPV04ob2Zmc2V0KSAvIFBBR0VfU0laRSk7XG4gXHRpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkge1xuIFx0XHQvKlxuQEAgLTI1OSwzOCArMjY2LDY3IEBAIGJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpXG4gXHRcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxuIFx0XHQgKi9cbiBcdFx0c3RydWN0IGZvbGlvICpmb2xpbzI7XG4rXHRcdGJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7XG4gXG4tXHRcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcbi1cdFx0XHRnb3RvIG5vX3NwbGl0O1xuK1x0XHRpZiAocGVuZClcbitcdFx0XHQqcGVuZCA9IHJvdW5kX2Rvd24ocG9zICsgb2Zmc2V0ICsgbGVuZ3RoLFxuK1x0XHRcdFx0XHQgICBtaW5fbnJieXRlcykgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gXG4rXHRcdGlmIChvZmZzZXQgKyBsZW5ndGggPT0gc2l6ZSlcbitcdFx0XHRnb3RvIHNwbGl0O1xuK3JldHJ5OlxuIFx0XHRzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLFxuIFx0XHRcdFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xuIFx0XHRmb2xpbzIgPSBwYWdlX2ZvbGlvKHNwbGl0X2F0Mik7XG4gXG4gXHRcdGlmICghZm9saW9fdHJ5X2dldChmb2xpbzIpKVxuLVx0XHRcdGdvdG8gbm9fc3BsaXQ7XG4rXHRcdFx0Z290byBzcGxpdDtcbiBcbiBcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikpXG4gXHRcdFx0Z290byBvdXQ7XG4gXG4tXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKVxuK1x0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSkge1xuK1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHQvKlxuK1x0XHQgKiBzcGxpdF9hdDIgbWF5IG5vIGxvbmdlciBiZWxvbmcgdG8gZm9saW8yIGR1ZSB0byBjb25jdXJyZW50XG4rXHRcdCAqIHNwbGl0LiBSZXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGZvbGlvIGluIGNhc2UgaXQncyBzdGlsbFxuK1x0XHQgKiBsYXJnZS5cbitcdFx0ICovXG4rXHRcdGlmIChwYWdlX2ZvbGlvKHNwbGl0X2F0MikgIT0gZm9saW8yKSB7XG4rXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4rXHRcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4rXHRcdFx0Z290byByZXRyeTtcbitcdFx0fVxuIFxuIFx0XHQvKiBtYWtlIHN1cmUgZm9saW8yIGlzIGxhcmdlIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaXRzIG1hcHBpbmcgKi9cbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8yKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvMi1cdTAwM2VtYXBwaW5nID09IGZvbGlvLVx1MDAzZW1hcHBpbmcpXG4tXHRcdFx0Zm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcik7XG4rXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgZm9saW9fc3BsaXRfb3JfdW5tYXAoZm9saW8yLCBzcGxpdF9hdDIsIG1pbl9vcmRlcikpXG4rXHRcdFx0dGFpbF9pc29sYXRlZCA9IGZhbHNlO1xuIFxuIFx0XHRmb2xpb191bmxvY2soZm9saW8yKTtcbiBvdXQ6XG4rXHRcdGlmICghdGFpbF9pc29sYXRlZCBcdTAwMjZcdTAwMjYgcGVuZClcbitcdFx0XHQqcGVuZCA9IGZvbGlvMi1cdTAwM2VpbmRleDtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvMik7XG4tbm9fc3BsaXQ6XG4rc3BsaXQ6XG4rXHRcdGlmIChwc3RhcnQpXG4rXHRcdFx0KnBzdGFydCA9IHJvdW5kX3VwKHBvcyArIG9mZnNldCxcbitcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdH1cbi1cdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuLVx0cmV0dXJuIHRydWU7XG4rXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKVxuK1x0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhmb2xpby1cdTAwM2VtYXBwaW5nLCBmb2xpbyk7XG4rbm9fc3BsaXQ6XG4rXHRpZiAocHN0YXJ0KVxuK1x0XHQqcHN0YXJ0ID0gb2Zmc2V0ID8gZm9saW9fbmV4dF9pbmRleChmb2xpbykgOiBmb2xpby1cdTAwM2VpbmRleDtcbitcdGlmIChwZW5kKVxuK1x0XHQqcGVuZCA9IChwb3MgKyBzaXplIFx1MDAzZSAodTY0KWxlbmQpID8gZm9saW8tXHUwMDNlaW5kZXggOlxuK1x0XHRcdFx0XHRcdCAgIGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuK1x0cmV0dXJuIGZhbHNlO1xuIH1cbiBcbiAvKlxuQEAgLTQxMywxMSArNDQ5LDggQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsc3RhcnQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsIEZHUF9MT0NLLCAwKTtcbiBcdGlmICghSVNfRVJSKGZvbGlvKSkge1xuIFx0XHRzYW1lX2ZvbGlvID0gbGVuZCBcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbi1cdFx0XHRzdGFydCA9IGZvbGlvX25leHRfaW5kZXgoZm9saW8pO1xuLVx0XHRcdGlmIChzYW1lX2ZvbGlvKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4tXHRcdH1cbitcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcdTAwMjZzdGFydCxcbitcdFx0XHRcdFx0ICAgICBzYW1lX2ZvbGlvID8gXHUwMDI2ZW5kIDogTlVMTCk7XG4gXHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4gXHRcdGZvbGlvID0gTlVMTDtcbkBAIC00MjcsOCArNDYwLDcgQEAgdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsXG4gXHRcdFx0XHRcdFx0RkdQX0xPQ0ssIDApO1xuIFx0XHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbi1cdFx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXG4tXHRcdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbitcdFx0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFx1MDAyNmVuZCk7XG4gXHRcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHR9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxMS40MTYwODI5MjRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MjEyNjQ1ODc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBUaGlzIFBhdGNoIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpcyB0b3VjaGluZyBzb21lIHByZXR0eSBmdW5kYW1lbnRhbCBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBzcGVjaWZpY2FsbHkgd2l0aGluIGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzIGRlYWxpbmcgd2l0aCBjb3JlIHBhZ2VjYWNoZSB0cnVuY2F0aW9uIGxvZ2ljIOKAkyB0aGluZ3MgbGlrZSBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIGBzaG1lbV91bmRvX3JhbmdlYCwgYW5kIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAuIEl0IGxvb2tzIGxpa2UgaXQncyBkaWdnaW5nIGludG8gaG93IHdlIGhhbmRsZSBwYXJ0aWFsIGZvbGlvcywgaG93IGZvbGlvcyBhcmUgc3BsaXQsIGFuZCBob3cgaW5kZXggcmFuZ2VzIGFyZSBtYW5hZ2VkIGR1cmluZyB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLlxuXG5UaGUgaW1wb3J0YW50IHF1ZXN0aW9uIG5vdyBpcywgaXMgdGhpcyBjb2RlIHJlYWNoYWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBvciB3aXRoIGZ1enppbmc/IEdpdmVuIHRoYXQgdGhpcyBoaXRzIGBtbS90cnVuY2F0ZS5jYCBhbmQgYG1tL3NobWVtLmNgLCBjb3JlIExpbnV4IGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMsIGV4ZWN1dGVkIGR1cmluZyB0cnVuY2F0aW9uLCBob2xlIHB1bmNoaW5nIChlLmcuIGBmYWxsb2NhdGVgKSwgZXZpY3Rpb24sIGV0Yy4sIHRoZSBhbnN3ZXIgaXMgYSByZXNvdW5kaW5nIHllcy4gVGhpcyBpcyBkZWZpbml0ZWx5IGBXb3J0aEZ1enppbmdgLlxuXG5TbywgdG8gc3VtbWFyaXplOlxuXG4xLiAgKipXb3J0aEZ1enppbmc6IHRydWUqKiAtIERlZmluaXRlbHkuIFRoaXMgaGl0cyBjcml0aWNhbCBNTSBjb2RlLlxuMi4gICoqRm9jdXNTeW1ib2xzOioqIEkgbmVlZCB0byBwaW5wb2ludCBleGFjdGx5IHdoYXQgbG9naWMgaXMgYmVpbmcgdG91Y2hlZC4gVGhlIGtleSBzeW1ib2xzIHdpdGhpbiB0aGUgcGF0Y2ggYXJlOlxuICAgICogICBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgKGluIGBtbS90cnVuY2F0ZS5jYClcbiAgICAqICAgYHNobWVtX3VuZG9fcmFuZ2VgIChpbiBgbW0vc2htZW0uY2ApXG4gICAgKiAgIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgKGluIGBtbS90cnVuY2F0ZS5jYClcblxuTm93LCBJJ20gZ29pbmcgdG8gdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBkaXZlIGludG8gdGhlIHN1cnJvdW5kaW5nIGNvZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjYWxsZXJzIG9mIHRoZXNlIGZ1bmN0aW9ucywgbG9vayBhdCB0aGUgY29udGV4dCwgdmVyaWZ5IGFueSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcywgYW5kIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBob3cgdGhlc2UgY2hhbmdlcyBjb3VsZCBtYW5pZmVzdCB2dWxuZXJhYmlsaXRpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1OTYsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxOC42Mjg3MzIxMzhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQ2MTg2NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2ludGVybmFsLmg9NjI5PWludCB0cnVuY2F0ZV9pbm9kZV9mb2xpbyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGZvbGlvICpmb2xpbyk7XFxubW0vaW50ZXJuYWwuaDo2MzA6Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxubW0vaW50ZXJuYWwuaC02MzEtXFx0XFx0bG9mZl90IGxlbmQsIHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZCk7XFxuLS1cXG5tbS9zaG1lbS5jPTExMTk9c3RhdGljIHZvaWQgc2htZW1fdW5kb19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZCxcXG4tLVxcbm1tL3NobWVtLmMtMTE3Ny1cXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG5tbS9zaG1lbS5jOjExNzg6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxubW0vc2htZW0uYy0xMTc5LVxcdFxcdFxcdFxcdFxcdCAgICAgc2FtZV9mb2xpbyA/IFxcdTAwMjZlbmQgOiBOVUxMKTtcXG4tLVxcbm1tL3NobWVtLmMtMTE4OC1cXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG5tbS9zaG1lbS5jOjExODk6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG5tbS9zaG1lbS5jLTExOTAtXFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4tLVxcbm1tL3NobWVtLmMtMTIyNi1cXHRcXHRcXHRcXHRcXHQgKiBJZiBmb3VuZCBhIGxhcmdlIHN3YXAgZW50cnkgY3Jvc3MgdGhlIGVuZCBvciBzdGFydFxcbm1tL3NobWVtLmM6MTIyNzpcXHRcXHRcXHRcXHRcXHQgKiBib3JkZXIsIHNraXAgaXQgYXMgdGhlIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cXG5tbS9zaG1lbS5jLTEyMjgtXFx0XFx0XFx0XFx0XFx0ICogYWJvdmUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgemVyb2QgaXRzIGNvbnRlbnQgb25jZS5cXG4tLVxcbm1tL3NobWVtLmMtMTI1Ni1cXHRcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XFxubW0vc2htZW0uYzoxMjU3OlxcdFxcdFxcdFxcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbyxcXG5tbS9zaG1lbS5jLTEyNTgtXFx0XFx0XFx0XFx0XFx0XFx0XFx0bHN0YXJ0LCBsZW5kLCBOVUxMLCBOVUxMKSkge1xcbi0tXFxubW0vdHJ1bmNhdGUuYz0xODA9c3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXFxuLS1cXG5tbS90cnVuY2F0ZS5jLTIyMC0gKi9cXG5tbS90cnVuY2F0ZS5jOjIyMTpib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IGxzdGFydCxcXG5tbS90cnVuY2F0ZS5jLTIyMi1cXHRcXHRcXHRcXHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXFxuLS1cXG5tbS90cnVuY2F0ZS5jPTQwMj12b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxubW0vdHJ1bmNhdGUuYy00NTEtXFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxubW0vdHJ1bmNhdGUuYzo0NTI6XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxubW0vdHJ1bmNhdGUuYy00NTMtXFx0XFx0XFx0XFx0XFx0ICAgICBzYW1lX2ZvbGlvID8gXFx1MDAyNmVuZCA6IE5VTEwpO1xcbi0tXFxubW0vdHJ1bmNhdGUuYy00NjItXFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxubW0vdHJ1bmNhdGUuYzo0NjM6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG5tbS90cnVuY2F0ZS5jLTQ2NC1cXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToxOC45NzQ5MjQ5OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDI0MDczODk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBUcnVuY2F0ZSBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIHdlJ3JlIHRhbGtpbmcgYWJvdXQgaW5vZGUgdHJ1bmNhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cnVuY2F0aW9uIHByb2Nlc3MgaXMgYWN0dWFsbHkgKmltcGxlbWVudGVkKiBhdCB0aGUgbG93ZXN0IGxldmVsLiBUaGF0IG1lYW5zIGNoZWNraW5nIG91dCB0aGUgY29yZSBmdW5jdGlvbnMgaGFuZGxpbmcgdGhpcywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbGF5ZXIsIGdpdmVuIHRoYXQgd2UncmUgdGFsa2luZyBhYm91dCBwYWdlcyBhbmQgZm9saW9zLiBJJ20gdGhpbmtpbmcsIGJhc2VkIG9uIHBhc3QgZXhwZXJpZW5jZSwgdGhhdCBgbW0vdHJ1bmNhdGUuY2AgaXMgdGhlIGxpa2VseSBwbGFjZSBmb3IgdGhlc2UgbG93LWxldmVsIGltcGxlbWVudGF0aW9ucy4gTW9yZSBzcGVjaWZpY2FsbHksIEknbSB6ZXJvaW5nIGluIG9uIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBrZXkgcGxheWVycywgaGFuZGxpbmcgdGhlIHBhcnRpYWwgdHJ1bmNhdGlvbiBvZiBpbmRpdmlkdWFsIGZvbGlvcyBhbmQgdGhlIHJhbmdlLWJhc2VkIHRydW5jYXRpb24uIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZXkgaW50ZXJhY3QsIGhvdyB0aGV5IGhhbmRsZSBsb2NraW5nLCBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSBjYWNoZS4gSSdsbCBiZSBsb29raW5nIGZvciBudWFuY2VzIGluIGhvdyB0aGV5IGRlYWwgd2l0aCBwYXJ0aWFsbHkgZmlsbGVkIGZvbGlvcywgZGlydHkgcGFnZXMsIGFuZCB0aGUgb3ZlcmFsbCBjb29yZGluYXRpb24gb2YgdGhlIHRydW5jYXRpb24gb3BlcmF0aW9uLiBGcm9tIHRoZXJlLCBJJ2xsIGJlIGFibGUgdG8gaW5mZXIgdGhlIGNyaXRpY2FsIHBhdGgsIGFuZCBpZGVudGlmeSBhbnkgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTAwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjEuMzk5MDAyMzUxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1MzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3RydW5jYXRlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjE1OlxcdCAqIHBhZ2UgcmFuZ2UgZnVsbHkgY292ZXJlZCBieSBbbHN0YXJ0LCBsZW5kXSBhZnRlciBhbnkgc3BsaXQgKG9yIG5vbmUpLFxcbiAyMTY6XFx0ICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxcbiAyMTc6XFx0ICogdG8gZGlzY2FyZC5cXG4gMjE4OlxcdCAqXFxuIDIxOTpcXHQgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cXG4gMjIwOlxcdCAqL1xcbiAyMjE6XFx0Ym9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBsc3RhcnQsXFxuIDIyMjpcXHRcXHRcXHRcXHRcXHQgIGxvZmZfdCBsZW5kLCBwZ29mZl90ICpwc3RhcnQsIHBnb2ZmX3QgKnBlbmQpXFxuIDIyMzpcXHR7XFxuIDIyNDpcXHRcXHRsb2ZmX3QgcG9zID0gZm9saW9fcG9zKGZvbGlvKTtcXG4gMjI1OlxcdFxcdHNpemVfdCBzaXplID0gZm9saW9fc2l6ZShmb2xpbyk7XFxuIDIyNjpcXHRcXHR1bnNpZ25lZCBpbnQgb2Zmc2V0LCBsZW5ndGg7XFxuIDIyNzpcXHRcXHRzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsICpzcGxpdF9hdDI7XFxuIDIyODpcXHRcXHR1bnNpZ25lZCBsb25nIG1pbl9ucmJ5dGVzO1xcbiAyMjk6XFx0XFx0dW5zaWduZWQgaW50IG1pbl9vcmRlcjtcXG4gMjMwOlxcdFxcbiAyMzE6XFx0XFx0aWYgKHBvcyBcXHUwMDNjIGxzdGFydClcXG4gMjMyOlxcdFxcdFxcdG9mZnNldCA9IGxzdGFydCAtIHBvcztcXG4gMjMzOlxcdFxcdGVsc2VcXG4gMjM0OlxcdFxcdFxcdG9mZnNldCA9IDA7XFxuIDIzNTpcXHRcXHRpZiAocG9zICsgc2l6ZSBcXHUwMDNjPSAodTY0KWxlbmQpXFxuIDIzNjpcXHRcXHRcXHRsZW5ndGggPSBzaXplIC0gb2Zmc2V0O1xcbiAyMzc6XFx0XFx0ZWxzZVxcbiAyMzg6XFx0XFx0XFx0bGVuZ3RoID0gbGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XFxuIDIzOTpcXHRcXG4gMjQwOlxcdFxcdGZvbGlvX3dhaXRfd3JpdGViYWNrKGZvbGlvKTtcXG4gMjQxOlxcdFxcdGlmIChsZW5ndGggPT0gc2l6ZSkge1xcbiAyNDI6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXFx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcXG4gMjQzOlxcdFxcdFxcdGdvdG8gbm9fc3BsaXQ7XFxuIDI0NDpcXHRcXHR9XFxuIDI0NTpcXHRcXG4gMjQ2OlxcdFxcdC8qXFxuIDI0NzpcXHRcXHQgKiBXZSBtYXkgYmUgemVyb2luZyBwYWdlcyB3ZSdyZSBhYm91dCB0byBkaXNjYXJkLCBidXQgaXQgYXZvaWRzXFxuIDI0ODpcXHRcXHQgKiBkb2luZyBhIGNvbXBsZXggY2FsY3VsYXRpb24gaGVyZSwgYW5kIHRoZW4gZG9pbmcgdGhlIHplcm9pbmdcXG4gMjQ5OlxcdFxcdCAqIGFueXdheSBpZiB0aGUgcGFnZSBzcGxpdCBmYWlscy5cXG4gMjUwOlxcdFxcdCAqL1xcbiAyNTE6XFx0XFx0aWYgKCFtYXBwaW5nX2luYWNjZXNzaWJsZShmb2xpby1cXHUwMDNlbWFwcGluZykpXFxuIDI1MjpcXHRcXHRcXHRmb2xpb196ZXJvX3JhbmdlKGZvbGlvLCBvZmZzZXQsIGxlbmd0aCk7XFxuIDI1MzpcXHRcXG4gMjU0OlxcdFxcdGlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSlcXG4gMjU1OlxcdFxcdFxcdGZvbGlvX2ludmFsaWRhdGUoZm9saW8sIG9mZnNldCwgbGVuZ3RoKTtcXG4gMjU2OlxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuIDI1NzpcXHRcXHRcXHRnb3RvIG5vX3NwbGl0O1xcbiAyNTg6XFx0XFxuIDI1OTpcXHRcXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cXHUwMDNlbWFwcGluZyk7XFxuIDI2MDpcXHRcXHRtaW5fbnJieXRlcyA9IG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXMoZm9saW8tXFx1MDAzZW1hcHBpbmcpO1xcbiAyNjE6XFx0XFx0c3BsaXRfYXQgPSBmb2xpb19wYWdlKGZvbGlvLCBQQUdFX0FMSUdOX0RPV04ob2Zmc2V0KSAvIFBBR0VfU0laRSk7XFxuIDI2MjpcXHRcXHRpZiAoIWZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvLCBzcGxpdF9hdCwgbWluX29yZGVyKSkge1xcbiAyNjM6XFx0XFx0XFx0LypcXG4gMjY0OlxcdFxcdFxcdCAqIHRyeSB0byBzcGxpdCBhdCBvZmZzZXQgKyBsZW5ndGggdG8gbWFrZSBzdXJlIGZvbGlvcyB3aXRoaW5cXG4gMjY1OlxcdFxcdFxcdCAqIHRoZSByYW5nZSBjYW4gYmUgZHJvcHBlZCwgZXNwZWNpYWxseSB0byBhdm9pZCBtZW1vcnkgd2FzdGVcXG4gMjY2OlxcdFxcdFxcdCAqIGZvciBzaG1lbSB0cnVuY2F0ZVxcbiAyNjc6XFx0XFx0XFx0ICovXFxuIDI2ODpcXHRcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvMjtcXG4gMjY5OlxcdFxcdFxcdGJvb2wgdGFpbF9pc29sYXRlZCA9IHRydWU7XFxuIDI3MDpcXHRcXG4gMjcxOlxcdFxcdFxcdGlmIChwZW5kKVxcbiAyNzI6XFx0XFx0XFx0XFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyArIG9mZnNldCArIGxlbmd0aCxcXG4gMjczOlxcdFxcdFxcdFxcdFxcdFxcdCAgIG1pbl9ucmJ5dGVzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiAyNzQ6XFx0XFxuIDI3NTpcXHRcXHRcXHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXFxuIDI3NjpcXHRcXHRcXHRcXHRnb3RvIHNwbGl0O1xcbiAyNzc6XFx0cmV0cnk6XFxuIDI3ODpcXHRcXHRcXHRzcGxpdF9hdDIgPSBmb2xpb19wYWdlKGZvbGlvLFxcbiAyNzk6XFx0XFx0XFx0XFx0XFx0UEFHRV9BTElHTl9ET1dOKG9mZnNldCArIGxlbmd0aCkgLyBQQUdFX1NJWkUpO1xcbiAyODA6XFx0XFx0XFx0Zm9saW8yID0gcGFnZV9mb2xpbyhzcGxpdF9hdDIpO1xcbiAyODE6XFx0XFxuIDI4MjpcXHRcXHRcXHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcXG4gMjgzOlxcdFxcdFxcdFxcdGdvdG8gc3BsaXQ7XFxuIDI4NDpcXHRcXG4gMjg1OlxcdFxcdFxcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxcbiAyODY6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDI4NzpcXHRcXG4gMjg4OlxcdFxcdFxcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbzIpKSB7XFxuIDI4OTpcXHRcXHRcXHRcXHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XFxuIDI5MDpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gMjkxOlxcdFxcdFxcdH1cXG4gMjkyOlxcdFxcbiAyOTM6XFx0XFx0XFx0LypcXG4gMjk0OlxcdFxcdFxcdCAqIHNwbGl0X2F0MiBtYXkgbm8gbG9uZ2VyIGJlbG9uZyB0byBmb2xpbzIgZHVlIHRvIGNvbmN1cnJlbnRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjEuMzk5MTIwMTQxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE0MTc2MDg5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBQb3RlbnRpYWwgRGF0YSBDb3JydXB0aW9uIGluIFNoYXJlZCBNZW1vcnkqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpZyBpbnRvIGEgcG90ZW50aWFsIGlzc3VlLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gemVybyBpbiBvbiBgc2htZW1fdW5kb19yYW5nZWAgYW5kIHRyYWNlIGl0cyB1c2FnZS4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY2FsbGVycywgYW5kLCBjcnVjaWFsbHksIGhvdyB0aG9zZSBjYWxsZXJzIG1pZ2h0IGludGVyYWN0IHdpdGggYW55IGZ1bmN0aW9ucyB0aGF0IGNvdWxkIGxlYWQgdG8gZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24gaW4gdGhlIHNoYXJlZCBtZW1vcnkgY29udGV4dCDigJMgbmFtZWx5LCBhbnl0aGluZyByZWxhdGVkIHRvIHRydW5jYXRpb24uIFRoZSBjb2RlJ3MgcHJvYmFibHkgZ290IHNvbWUgaW50ZXJlc3RpbmcgaW50ZXJhY3Rpb25zIHdpdGggaG93IGl0IGhhbmRsZXMgY2hhbmdlcyB0byBmaWxlIHNpemUgb3IgZGF0YSByZWdpb25zLCBzbyBJJ2xsIGJlIGxvb2tpbmcgYXQgYWxsIGNhbGxlcnMgb2YgYHRydW5jYXRlYCB3aXRoaW4gYHNobWVtLmNgIGFzIHdlbGwuIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlc2UgdHdvIGFyZWFzIGlzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgc29tZXRoaW5nIG9mIGludGVyZXN0LiBMZXQncyBzZWUgd2hhdCB0aGUgYXVkaXQgcmV2ZWFscy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODYwMSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjMuNTQwODgzODkyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyMjk1MjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNobWVtX3VuZG9fcmFuZ2VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3NobWVtLmM9MTA4Nz1zdGF0aWMgc3RydWN0IGZvbGlvICpzaG1lbV9nZXRfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IGluZGV4KVxcbi0tXFxubW0vc2htZW0uYy0xMTE4LSAqL1xcbm1tL3NobWVtLmM6MTExOTpzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxcbm1tL3NobWVtLmMtMTEyMC1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgYm9vbCB1bmZhbGxvYylcXG4tLVxcbm1tL3NobWVtLmM9MTI4Mz12b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kKVxcbm1tL3NobWVtLmMtMTI4NC17XFxubW0vc2htZW0uYzoxMjg1OlxcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsIGxzdGFydCwgbGVuZCwgZmFsc2UpO1xcbm1tL3NobWVtLmMtMTI4Ni1cXHRpbm9kZV9zZXRfbXRpbWVfdG9fdHMoaW5vZGUsIGlub2RlX3NldF9jdGltZV9jdXJyZW50KGlub2RlKSk7XFxuLS1cXG5tbS9zaG1lbS5jPTI2MzA9c3RhdGljIGludCBzeW5jaHJvbm91c193YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfZW50cnlfdCAqd2FpdCxcXG4tLVxcbm1tL3NobWVtLmMtMjY0Mi0gKiBmYXVsdGluZyBwYWdlcyBpbnRvIHRoZSBob2xlIHdoaWxlIGl0J3MgYmVpbmcgcHVuY2hlZC4gIEFsdGhvdWdoXFxubW0vc2htZW0uYzoyNjQzOiAqIHNobWVtX3VuZG9fcmFuZ2UoKSBkb2VzIHJlbW92ZSB0aGUgYWRkaXRpb25zLCBpdCBtYXkgYmUgdW5hYmxlIHRvXFxubW0vc2htZW0uYy0yNjQ0LSAqIGtlZXAgdXAsIGFzIGVhY2ggbmV3IHBhZ2UgbmVlZHMgaXRzIG93biB1bm1hcF9tYXBwaW5nX3JhbmdlKCkgY2FsbCxcXG4tLVxcbm1tL3NobWVtLmM9MzYwOT1zdGF0aWMgbG9uZyBzaG1lbV9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LFxcbi0tXFxubW0vc2htZW0uYy0zNzE5LVxcdFxcdFxcdGlmIChpbmRleCBcXHUwMDNlIHN0YXJ0KSB7XFxubW0vc2htZW0uYzozNzIwOlxcdFxcdFxcdFxcdHNobWVtX3VuZG9fcmFuZ2UoaW5vZGUsXFxubW0vc2htZW0uYy0zNzIxLVxcdFxcdFxcdFxcdCAgICAobG9mZl90KXN0YXJ0IFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjIzLjU5MzE4OTY5MVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxODU4NDg5MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjpcblxuKipJbnZlc3RpZ2F0aW5nIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgQ2FsbGVycyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIGlzIGJlaW5nIHVzZWQuIEdpdmVuIHRoYXQgaXQgZGVhbHMgd2l0aCBpbm9kZSBwYWdlIHJhbmdlcywgaXQncyBwcmV0dHkgY2xlYXIgdGhhdCBpdCBoYXMgc2lnbmlmaWNhbnQgaW1wbGljYXRpb25zIGZvciBib3RoIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgYW5kIHRoZSBmaWxlc3lzdGVtIChmcykgbGF5ZXJzLiBUaGVyZWZvcmUsIHRoZSBmaXJzdCBsb2dpY2FsIHN0ZXAgaXMgdG8gcGlucG9pbnQgaXRzIGNhbGxlcnMgd2l0aGluIHRob3NlIGFyZWFzIG9mIHRoZSBrZXJuZWwgY29kZWJhc2UuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoYXQnbGwgZ2l2ZSBtZSBpbnNpZ2h0IGludG8gd2hhdCdzIGJlaW5nIHRydW5jYXRlZCwgd2h5LCBhbmQgdGhlIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBvciBjb3JyZWN0bmVzcyBpbXBsaWNhdGlvbnMgb2YgYW55IG1vZGlmaWNhdGlvbnMgSSBtaWdodCBiZSBjb25zaWRlcmluZy4gSSBzaG91bGQgc3RhcnQgYnkgc2VhcmNoaW5nIGZvciBjYWxscyBpbiB0aGUgYG1tYCBhbmQgYGZzYCBkaXJlY3Rvcmllcy4gS25vd2luZyB0aGUgY2FsbCBjb250ZXh0LCBlc3BlY2lhbGx5LCBpcyAqY3JpdGljYWwqLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzA5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjUuNzc5MDQwOTQzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjcyMjIwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vc2htZW0uYz01NzU0PXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQpXFxubW0vc2htZW0uYy01NzU1LXtcXG5tbS9zaG1lbS5jOjU3NTY6XFx0dHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtXFx1MDAzZWlfbWFwcGluZywgbHN0YXJ0LCBsZW5kKTtcXG5tbS9zaG1lbS5jLTU3NTctfVxcbi0tXFxubW0vdHJ1bmNhdGUuYz0zNjE9bG9uZyBtYXBwaW5nX2V2aWN0X2ZvbGlvKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vdHJ1bmNhdGUuYy0zNzgtLyoqXFxubW0vdHJ1bmNhdGUuYzozNzk6ICogdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgLSB0cnVuY2F0ZSByYW5nZSBvZiBwYWdlcyBzcGVjaWZpZWQgYnkgc3RhcnQgXFx1MDAyNiBlbmQgYnl0ZSBvZmZzZXRzXFxubW0vdHJ1bmNhdGUuYy0zODAtICogQG1hcHBpbmc6IG1hcHBpbmcgdG8gdHJ1bmNhdGVcXG4tLVxcbm1tL3RydW5jYXRlLmMtMzk4LSAqIE5vdGUgdGhhdCBzaW5jZSAtXFx1MDAzZWludmFsaWRhdGVfZm9saW8oKSBhY2NlcHRzIHJhbmdlIHRvIGludmFsaWRhdGVcXG5tbS90cnVuY2F0ZS5jOjM5OTogKiB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSBpcyBhYmxlIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsZW5kICsgMSBpcyBub3RcXG5tbS90cnVuY2F0ZS5jLTQwMC0gKiBwYWdlIGFsaWduZWQgcHJvcGVybHkuXFxubW0vdHJ1bmNhdGUuYy00MDEtICovXFxubW0vdHJ1bmNhdGUuYzo0MDI6dm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5tbS90cnVuY2F0ZS5jLTQwMy1cXHRcXHRcXHRcXHRsb2ZmX3QgbHN0YXJ0LCB1b2ZmX3QgbGVuZClcXG4tLVxcbm1tL3RydW5jYXRlLmMtNDk5LX1cXG5tbS90cnVuY2F0ZS5jOjUwMDpFWFBPUlRfU1lNQk9MKHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKTtcXG5tbS90cnVuY2F0ZS5jLTUwMS1cXG4tLVxcbm1tL3RydW5jYXRlLmM9NTE1PXZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpXFxubW0vdHJ1bmNhdGUuYy01MTYte1xcbm1tL3RydW5jYXRlLmM6NTE3OlxcdHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKG1hcHBpbmcsIGxzdGFydCwgKGxvZmZfdCktMSk7XFxubW0vdHJ1bmNhdGUuYy01MTgtfVxcbi0tXFxubW0vdHJ1bmNhdGUuYz05MzY9dm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpXFxuLS1cXG5tbS90cnVuY2F0ZS5jLTk1Ni1cXHRcXHRcXHRcXHQgICAgMSArIHVubWFwX2VuZCAtIHVubWFwX3N0YXJ0LCAwKTtcXG5tbS90cnVuY2F0ZS5jOjk1NzpcXHR0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBsc3RhcnQsIGxlbmQpO1xcbm1tL3RydW5jYXRlLmMtOTU4LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MjUuODM1NzY5NjAyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzODUwNzEzMTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBzaG1lbS5jYCBhbmQgYHRydW5jYXRlLmNgIGFyZSBiZWluZyBpbmNvcnBvcmF0ZWQgaW50byB0aGlzIGJ1aWxkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gY2hlY2sgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGBDT05GSUdfU0hNRU1gIGFuZCBwb3RlbnRpYWxseSBvdGhlciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWlnaHQgYWZmZWN0IGBzaG1lbS5jYC4gSSBrbm93IHRoYXQgYHRydW5jYXRlLmNgIGlzIGVzc2VudGlhbGx5IGFsd2F5cyBwYXJ0IG9mIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgYW5kIGlzIGdvaW5nIHRvIGJlIGJ1aWx0IGluIGV2ZXJ5IGluc3RhbmNlLCBzbyBJJ20gbm90IGFzIGNvbmNlcm5lZCB3aXRoIGl0cyBidWlsZCBjb25kaXRpb25hbC4gSSBrbm93IHRoYXQgYHNobWVtLmNgIGlzIGNvbmRpdGlvbmFsbHkgYnVpbHQgd2l0aCBgQ09ORklHX1NITUVNYCAob3IgcG9zc2libHkgYENPTkZJR19UTVBGU2AgZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBlbnZpcm9ubWVudCkuIFRoZXJlZm9yZSwgSSBzaG91bGQgYmUgYWJsZSB0byBhc2NlcnRhaW4gdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGJ1aWxkIGJ5IGV4YW1pbmluZyB0aGUgYG1tL01ha2VmaWxlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMjAsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToyOC4yMjA4NDM1NFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQyMzc1MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2htZW1cXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTUxPW9iai15XFx0XFx0XFx0Oj0gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcXFxcXFxuLS1cXG5tbS9NYWtlZmlsZS01My1cXHRcXHRcXHQgICByZWFkYWhlYWQubyBmb2xpby5vIHRydW5jYXRlLm8gdm1zY2FuLm8gc2hyaW5rZXIubyBcXFxcXFxubW0vTWFrZWZpbGU6NTQ6XFx0XFx0XFx0ICAgc2htZW0ubyB1dGlsLm8gbW16b25lLm8gdm1zdGF0Lm8gYmFja2luZy1kZXYubyBcXFxcXFxubW0vTWFrZWZpbGUtNTUtXFx0XFx0XFx0ICAgbW1faW5pdC5vIHBlcmNwdS5vIHNsYWJfY29tbW9uLm8gXFxcXFxcbi0tXFxubW0vc2htZW0uYz01MjA9c3RhdGljIGludCBzaG1lbV9jb25maXJtX3N3YXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgaW5kZXgsXFxuLS1cXG5tbS9zaG1lbS5jLTU2OS0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vc2htZW0uYzo1NzA6LyogaWZkZWYgaGVyZSB0byBhdm9pZCBibG9hdGluZyBzaG1lbS5vIHdoZW4gbm90IG5lY2Vzc2FyeSAqL1xcbm1tL3NobWVtLmMtNTcxLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OToyOC4yNzUwODUyNjlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg4MjYwNTQzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbiBJbnZlc3RpZ2F0aW9uKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGVpdGhlciBgQ09ORklHX1NITUVNYCBvciBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcmUgcGVydGluZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdG8gcGlucG9pbnQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGNvbmZpZ3VyYXRpb25zLiBJJ20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSwgc3BlY2lmaWNhbGx5IGxvb2tpbmcgaW4gYG1tL0tjb25maWdgIG9yIGBpbml0L0tjb25maWdgIOKAkyB0aG9zZSBhcmUgdGhlIHVzdWFsIHN1c3BlY3RzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaW5pdGlhbGl6YXRpb24tcmVsYXRlZCBzZXR0aW5ncy4gVGhhdCBzaG91bGQgZ2l2ZSBtZSB0aGUgbG93ZG93biBvbiB3aGF0IHRoZXNlIG9wdGlvbnMgYWN0dWFsbHkgKmRvKiBhbmQgd2hldGhlciB0aGV5J3JlIGV2ZW4gcmVsZXZhbnQgdG8gd2hhdCBJJ20gY3VycmVudGx5IHdvcmtpbmcgb24uIEdvdHRhIHN0YXJ0IHdpdGggdGhlIGZ1bmRhbWVudGFscywgcmlnaHQ/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwNjI2LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6MzAuMTU3NjkyNjU1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjExODkwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgU0hNRU1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTE4OTY9Y29uZmlnIEVWRU5URkRcXG4tLVxcbmluaXQvS2NvbmZpZy0xOTA0LVxcbmluaXQvS2NvbmZpZzoxOTA1OmNvbmZpZyBTSE1FTVxcbmluaXQvS2NvbmZpZy0xOTA2LVxcdGJvb2wgXFxcIlVzZSBmdWxsIHNobWVtIGZpbGVzeXN0ZW1cXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMC4yMDM4MTgyMDVaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTk5MDkzOTE3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgTWVtb3J5IE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGludG8gcG90ZW50aWFsIG9wdGltaXphdGlvbnMgYW5kIGl0IHNlZW1zIGxpa2UgYENPTkZJR19TSE1FTWAgYW5kIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGFyZSB0aGUgb2J2aW91cyBwbGFjZXMgdG8gc3RhcnQgaWYgSSBuZWVkIHRvIGFkanVzdCBtZW1vcnkgYmVoYXZpb3IuIEkgYWxyZWFkeSBrbm93IHRoYXQgYENPTkZJR19TSE1FTWAgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3aGljaCBpcyBnb29kLiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBTSE1FTSBhbmQgVEhQLCBlc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGhvdyB0aGV5IGhhbmRsZSBsYXJnZSBmb2xpb3MgYW5kIHBhZ2VjYWNoZSwgaXMgd2hhdCBJJ20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gcmlnaHQgbm93LiBJJ20gZ29pbmcgdG8gZGlnIGludG8gdGhlIHJlbGF0aW9uc2hpcCwgYW5kIG5lZWQgdG8gY2hlY2sgdGhpbmdzIGxpa2UgYG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyYCBhbmQgYG1hcHBpbmdfbWluX2ZvbGlvX25yYnl0ZXNgLCBvciBhbnkgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhhdCBwZXJ0YWluIHRvIFRIUCBhbmQgbGFyZ2UgZm9saW9zLiBUaG9zZSBhcmUgcHJvYmFibHkgdGhlIGtleXMgdG8gZ2V0dGluZyB0aGlzIHJpZ2h0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk0MSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMi4xOTQ3NjAxNjhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0OTk1NTM5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtYXBwaW5nX21pbl9mb2xpb19vcmRlclwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaD00Njg9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnRcXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo0Njk6bWFwcGluZ19taW5fZm9saW9fb3JkZXIoY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpXFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDcwLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTQ3Nz1tYXBwaW5nX21pbl9mb2xpb19ucnBhZ2VzKGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTQ3OC17XFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmg6NDc5OlxcdHJldHVybiAxVUwgXFx1MDAzY1xcdTAwM2MgbWFwcGluZ19taW5fZm9saW9fb3JkZXIobWFwcGluZyk7XFxuaW5jbHVkZS9saW51eC9wYWdlbWFwLmgtNDgwLX1cXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oPTUyOD1zdGF0aWMgaW5saW5lIGJvb2wgbWFwcGluZ19wbWRfZm9saW9fc3VwcG9ydChjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZylcXG4tLVxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTUzMi1cXG5pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaDo1MzM6XFx0cmV0dXJuIG1hcHBpbmdfbWluX2ZvbGlvX29yZGVyKG1hcHBpbmcpIFxcdTAwM2M9IFBNRF9PUkRFUiBcXHUwMDI2XFx1MDAyNlxcbmluY2x1ZGUvbGludXgvcGFnZW1hcC5oLTUzNC1cXHQgICAgICAgbWFwcGluZ19tYXhfZm9saW9fb3JkZXIobWFwcGluZykgXFx1MDAzZT0gUE1EX09SREVSO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQwNjo1OTozMi4zNDQ3MjA3NTZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA0MDY0MzM2OTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRm9jdXMgU3ltYm9scyBmb3IgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIHRha2UgYSBsb29rIGF0IHRoZXNlIGBGb2N1c1N5bWJvbHNgLiBJIHNlZSB3ZSdyZSBleGFtaW5pbmc6IGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCwgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYC4gR29vZCwgSSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlIHF1aXRlIHRhcmdldGVkLiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgaXMgZGVmaW5pdGVseSBzcGVjaWZpYyB0byB0aGUgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIHN0dWZmLCB3aGljaCBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQsIGFuZCBpcyBub3QgZ29pbmcgdG8gaW1wYWN0IG11Y2ggYmV5b25kIHRoYXQuIFRoZW4gdGhlcmUncyBgc2htZW1fdW5kb19yYW5nZWAgd2hpY2ggZGVhbHMgd2l0aCBzaG1lbSB0cnVuY2F0aW9uIGFuZCBob2xlIHB1bmNoaW5nLiBBbmQgZmluYWxseSBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgIHdoaWNoIGhhbmRsZXMgcGFnZSBjYWNoZSB0cnVuY2F0aW9uLiBBbGwgdmVyeSBmb2N1c2VkIGFyZWFzIG9mIGNvbmNlcm4uXG5cbk5vdywgbGV0J3MganVzdCBxdWlja2x5IHNjYW4gYG1tL3RydW5jYXRlLmNgIGFuZCBgbW0vc2htZW0uY2AgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBtaXNzaW5nIGFueXRoaW5nIG9idmlvdXMgdGhhdCBzaG91bGQgb3Igc2hvdWxkbid0IGJlIGluY2x1ZGVkLiBMb29rcyBsaWtlIHdlJ3ZlIGdvdCB0aGUgZGlyZWN0bHkgbW9kaWZpZWQgYHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9gLCBgc2htZW1fdW5kb19yYW5nZWAgdGhhdCdzIGEgZGlyZWN0bHkgbW9kaWZpZWQgY2FsbGVyLCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCBhbHNvIGEgZGlyZWN0bHkgbW9kaWZpZWQgY2FsbGVyLiBObyByZWQgZmxhZ3MgdGhlcmUuXG5cbk5leHQsIEkgbmVlZCB0byBjaGVjayB0aGUgY29uZmlncy4gV2UncmUgbG9va2luZyBhdCBgQ09ORklHX1NITUVNYCBhbmQgYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIG9yIGBTSE1FTWAgYW5kIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuXG5cbkFscmlnaHQsIHRpbWUgdG8gbWFrZSBzdXJlIEknbSBzZXR0aW5nIHRoZSBgc2V0LXJlc3VsdHNgIHBhcmFtZXRlcnMgY29ycmVjdGx5LiBMZXQncyBzZWUuLi4gd2UgbmVlZCBgV29ydGhGdXp6aW5nYCwgYFJlYXNvbmluZ2AsIGBGb2N1c1N5bWJvbHNgLCBhbmQgYEVuYWJsZUNvbmZpZ3NgLlxuXG5GaW5hbGx5LCBhIHF1aWNrIHNhbml0eSBjaGVjayBvZiBhbGwgdGhlIGluc3RydWN0aW9ucy4gSXQncyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBpbiBhbWQ2NCBRRU1VLiBgV29ydGhGdXp6aW5nYCBzaG91bGQgYmUgYHRydWVgIGJlY2F1c2Ugd2UgYXJlIGluZGVlZCB0b3VjaGluZyBtZW1vcnkgbWFuYWdlbWVudCAoYG1tL2ApIGFuZCByZWZhY3RvcmluZyBwYXJ0aWFsIGZvbGlvIHRydW5jYXRpb24gYW5kIHNwbGl0dGluZyBsb2dpYy4gRm9yIGBGb2N1c1N5bWJvbHNgLCB3ZSd2ZSBnb3QgdGhvc2Ugd2VsbC1kZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCB1YmlxdWl0b3VzIGFuZCBhcmUgc3BlY2lmaWMgdG8gdGhlIGFyZWFzIGJlaW5nIG1vZGlmaWVkLiBgRW5hYmxlQ29uZmlnc2AgbmVlZHMgdG8gaGF2ZSB0aGUgYENPTkZJR19gIHByZWZpeCBzdHJpcHBlZC5cblxuT2theSwgSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE1MzQsIk91dHB1dFRva2VucyI6MTUxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDA2OjU5OjQyLjc1MTE1NzMxMVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwMjYxNjc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJTSE1FTVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvXCIsXG4gICAgXCJzaG1lbV91bmRvX3JhbmdlXCIsXG4gICAgXCJ0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vdHJ1bmNhdGUuYyBhbmQgbW0vc2htZW0uYyBmb3IgaGFuZGxpbmcgcGFydGlhbCBmb2xpbyB0cnVuY2F0aW9uIGFuZCBzcGxpdHRpbmcgd2hlbiB0cnVuY2F0aW5nIHBhZ2VjYWNoZSBhbmQgc2htZW0gcmFuZ2VzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHN0YW5kYXJkIHRydW5jYXRpb24gYW5kIGhvbGUtcHVuY2hpbmcgc3lzY2FsbHMgKGUuZy4sIHRydW5jYXRlLCBmdHJ1bmNhdGUsIGZhbGxvY2F0ZSkgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZm9saW8gc3BsaXR0aW5nIGFuZCBpbmRleCBib3VuZGFyeSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMxNDI2OTJaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1ODYxNDgzMjY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMyMDE3NDFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1NTg2MDg4Njk1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGQ4MDMwYTQxZTBiMGI2ODY3YTRiM2VjMjIzYzE2Nzk5MTVjYjY3NzBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDA2OjU5OjEwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDY4ZGI1YWJkMGE0Y2UuLjZlNmFkMzE4NzM3OGEgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNjI3LDggKzYyNyw4IEBAIHVuc2lnbmVkIGZpbmRfbG9ja19lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCxcbiB1bnNpZ25lZCBmaW5kX2dldF9lbnRyaWVzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90ICpzdGFydCxcbiBcdFx0cGdvZmZfdCBlbmQsIHN0cnVjdCBmb2xpb19iYXRjaCAqZmJhdGNoLCBwZ29mZl90ICppbmRpY2VzKTtcbiBpbnQgdHJ1bmNhdGVfaW5vZGVfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuLWJvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qgc3RhcnQsXG4tXHRcdGxvZmZfdCBlbmQpO1xuK2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxuK1x0XHRsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKTtcbiBsb25nIG1hcHBpbmdfZXZpY3RfZm9saW8oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8pO1xuIHVuc2lnbmVkIGxvbmcgbWFwcGluZ190cnlfaW52YWxpZGF0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbiBcdFx0cGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIHVuc2lnbmVkIGxvbmcgKm5yX2ZhaWxlZCk7XG5kaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmNcbmluZGV4IDg5YTE0OTVlNTVmN2UuLjRlZmJiYmJhNWRhNTkgMTAwNjQ0XG4tLS0gYS9tbS9zaG1lbS5jXG4rKysgYi9tbS9zaG1lbS5jXG5AQCAtMTE3NSwxMSArMTE3NSw4IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXHRpZiAoZm9saW8pIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbiBcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdGlmICghdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kKSkge1xuLVx0XHRcdHN0YXJ0ID0gZm9saW9fbmV4dF9pbmRleChmb2xpbyk7XG4tXHRcdFx0aWYgKHNhbWVfZm9saW8pXG4tXHRcdFx0XHRlbmQgPSBmb2xpby1cdTAwM2VpbmRleDtcbi1cdFx0fVxuK1x0XHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIFx1MDAyNnN0YXJ0LFxuK1x0XHRcdFx0XHQgICAgIHNhbWVfZm9saW8gPyBcdTAwMjZlbmQgOiBOVUxMKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0Zm9saW8gPSBOVUxMO1xuQEAgLTExODksOCArMTE4Niw3IEBAIHN0YXRpYyB2b2lkIHNobWVtX3VuZG9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgdW9mZl90IGxlbmQsXG4gXHRcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuIFx0aWYgKGZvbGlvKSB7XG4gXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRpZiAoIXRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpXG4tXHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgTlVMTCwgXHUwMDI2ZW5kKTtcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcbiBcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdH1cbkBAIC0xMjU4LDcgKzEyNTQsOCBAQCBzdGF0aWMgdm9pZCBzaG1lbV91bmRvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kLFxuIFxuIFx0XHRcdFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkge1xuIFx0XHRcdFx0XHR0cnVuY2F0ZV9pbm9kZV9mb2xpbyhtYXBwaW5nLCBmb2xpbyk7XG4tXHRcdFx0XHR9IGVsc2UgaWYgKHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCkpIHtcbitcdFx0XHRcdH0gZWxzZSBpZiAodHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbyxcbitcdFx0XHRcdFx0XHRcdGxzdGFydCwgbGVuZCwgTlVMTCwgTlVMTCkpIHtcbiBcdFx0XHRcdFx0LypcbiBcdFx0XHRcdFx0ICogSWYgd2Ugc3BsaXQgYSBwYWdlLCByZXNldCB0aGUgbG9vcCBzb1xuIFx0XHRcdFx0XHQgKiB0aGF0IHdlIHBpY2sgdXAgdGhlIG5ldyBzdWIgcGFnZXMuXG5kaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmNcbmluZGV4IGI1OGJhOTQwYmU0NzQuLmQ4OGExYjE1OTA4NDUgMTAwNjQ0XG4tLS0gYS9tbS90cnVuY2F0ZS5jXG4rKysgYi9tbS90cnVuY2F0ZS5jXG5AQCAtMjA2LDM1ICsyMDYsNDEgQEAgc3RhdGljIGludCBmb2xpb19zcGxpdF9vcl91bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqc3BsaXRfYXQsXG4gLypcbiAgKiBIYW5kbGUgcGFydGlhbCBmb2xpb3MuICBUaGUgZm9saW8gbWF5IGJlIGVudGlyZWx5IHdpdGhpbiB0aGVcbiAgKiByYW5nZSBpZiBhIHNwbGl0IGhhcyByYWNlZCB3aXRoIHVzLiAgSWYgbm90LCB3ZSB6ZXJvIHRoZSBwYXJ0IG9mIHRoZVxuLSAqIGZvbGlvIHRoYXQncyB3aXRoaW4gdGhlIFtzdGFydCwgZW5kXSByYW5nZSwgYW5kIHRoZW4gc3BsaXQgdGhlIGZvbGlvIGlmXG4rICogZm9saW8gdGhhdCdzIHdpdGhpbiB0aGUgW2xzdGFydCwgbGVuZF0gcmFuZ2UsIGFuZCB0aGVuIHNwbGl0IHRoZSBmb2xpbyBpZlxuICAqIGl0J3MgbGFyZ2UuICBzcGxpdF9wYWdlX3JhbmdlKCkgd2lsbCBkaXNjYXJkIHBhZ2VzIHdoaWNoIG5vdyBsaWUgYmV5b25kXG4gICogaV9zaXplLCBhbmQgd2UgcmVseSBvbiB0aGUgY2FsbGVyIHRvIGRpc2NhcmQgcGFnZXMgd2hpY2ggbGllIHdpdGhpbiBhXG4gICogbmV3bHkgY3JlYXRlZCBob2xlLlxuICAqXG4tICogUmV0dXJucyBmYWxzZSBpZiBzcGxpdHRpbmcgZmFpbGVkIHNvIHRoZSBjYWxsZXIgY2FuIGF2b2lkXG4tICogZGlzY2FyZGluZyB0aGUgZW50aXJlIGZvbGlvIHdoaWNoIGlzIHN0dWJib3JubHkgdW5zcGxpdC5cbisgKiBXaGVuIEBwc3RhcnQgYW5kL29yIEBwZW5kIGFyZSBub24tTlVMTCB0aGV5IHJlY2VpdmUgdGhlIGluZGV4ZXMgb2YgdGhlXG4rICogcGFnZSByYW5nZSBmdWxseSBjb3ZlcmVkIGJ5IFtsc3RhcnQsIGxlbmRdIGFmdGVyIGFueSBzcGxpdCAob3Igbm9uZSksXG4rICogaS5lLiB0aGUgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBhcmUgd2hvbGx5IHdpdGhpbiBbbHN0YXJ0LCBsZW5kXSBhbmQgc28gc2FmZVxuKyAqIHRvIGRpc2NhcmQuXG4rICpcbisgKiBSZXR1cm4gJXRydWUgaWYgdGhlIGZvbGlvIHdhcyBzcGxpdCwgJWZhbHNlIG90aGVyd2lzZS5cbiAgKi9cbi1ib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuK2Jvb2wgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3QgbHN0YXJ0LFxuK1x0XHRcdFx0ICBsb2ZmX3QgbGVuZCwgcGdvZmZfdCAqcHN0YXJ0LCBwZ29mZl90ICpwZW5kKVxuIHtcbiBcdGxvZmZfdCBwb3MgPSBmb2xpb19wb3MoZm9saW8pO1xuIFx0c2l6ZV90IHNpemUgPSBmb2xpb19zaXplKGZvbGlvKTtcbiBcdHVuc2lnbmVkIGludCBvZmZzZXQsIGxlbmd0aDtcbiBcdHN0cnVjdCBwYWdlICpzcGxpdF9hdCwgKnNwbGl0X2F0MjtcbitcdHVuc2lnbmVkIGxvbmcgbWluX25yYnl0ZXM7XG4gXHR1bnNpZ25lZCBpbnQgbWluX29yZGVyO1xuIFxuLVx0aWYgKHBvcyBcdTAwM2Mgc3RhcnQpXG4tXHRcdG9mZnNldCA9IHN0YXJ0IC0gcG9zO1xuK1x0aWYgKHBvcyBcdTAwM2MgbHN0YXJ0KVxuK1x0XHRvZmZzZXQgPSBsc3RhcnQgLSBwb3M7XG4gXHRlbHNlXG4gXHRcdG9mZnNldCA9IDA7XG4tXHRpZiAocG9zICsgc2l6ZSBcdTAwM2M9ICh1NjQpZW5kKVxuK1x0aWYgKHBvcyArIHNpemUgXHUwMDNjPSAodTY0KWxlbmQpXG4gXHRcdGxlbmd0aCA9IHNpemUgLSBvZmZzZXQ7XG4gXHRlbHNlXG4tXHRcdGxlbmd0aCA9IGVuZCArIDEgLSBwb3MgLSBvZmZzZXQ7XG4rXHRcdGxlbmd0aCA9IGxlbmQgKyAxIC0gcG9zIC0gb2Zmc2V0O1xuIFxuIFx0Zm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8pO1xuIFx0aWYgKGxlbmd0aCA9PSBzaXplKSB7XG4gXHRcdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdFx0cmV0dXJuIHRydWU7XG4rXHRcdGdvdG8gbm9fc3BsaXQ7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTI0OCw5ICsyNTQsMTAgQEAgYm9vbCB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZClcbiBcdGlmIChmb2xpb19uZWVkc19yZWxlYXNlKGZvbGlvKSlcbiBcdFx0Zm9saW9faW52YWxpZGF0ZShmb2xpbywgb2Zmc2V0LCBsZW5ndGgpO1xuIFx0aWYgKCFmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4rXHRcdGdvdG8gbm9fc3BsaXQ7XG4gXG4gXHRtaW5fb3JkZXIgPSBtYXBwaW5nX21pbl9mb2xpb19vcmRlcihmb2xpby1cdTAwM2VtYXBwaW5nKTtcbitcdG1pbl9ucmJ5dGVzID0gbWFwcGluZ19taW5fZm9saW9fbnJieXRlcyhmb2xpby1cdTAwM2VtYXBwaW5nKTtcbiBcdHNwbGl0X2F0ID0gZm9saW9fcGFnZShmb2xpbywgUEFHRV9BTElHTl9ET1dOKG9mZnNldCkgLyBQQUdFX1NJWkUpO1xuIFx0aWYgKCFmb2xpb19zcGxpdF9vcl91bm1hcChmb2xpbywgc3BsaXRfYXQsIG1pbl9vcmRlcikpIHtcbiBcdFx0LypcbkBAIC0yNTksMzggKzI2Niw2NyBAQCBib29sIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKVxuIFx0XHQgKiBmb3Igc2htZW0gdHJ1bmNhdGVcbiBcdFx0ICovXG4gXHRcdHN0cnVjdCBmb2xpbyAqZm9saW8yO1xuK1x0XHRib29sIHRhaWxfaXNvbGF0ZWQgPSB0cnVlO1xuIFxuLVx0XHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXG4tXHRcdFx0Z290byBub19zcGxpdDtcbitcdFx0aWYgKHBlbmQpXG4rXHRcdFx0KnBlbmQgPSByb3VuZF9kb3duKHBvcyArIG9mZnNldCArIGxlbmd0aCxcbitcdFx0XHRcdFx0ICAgbWluX25yYnl0ZXMpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIFxuK1x0XHRpZiAob2Zmc2V0ICsgbGVuZ3RoID09IHNpemUpXG4rXHRcdFx0Z290byBzcGxpdDtcbityZXRyeTpcbiBcdFx0c3BsaXRfYXQyID0gZm9saW9fcGFnZShmb2xpbyxcbiBcdFx0XHRcdFBBR0VfQUxJR05fRE9XTihvZmZzZXQgKyBsZW5ndGgpIC8gUEFHRV9TSVpFKTtcbiBcdFx0Zm9saW8yID0gcGFnZV9mb2xpbyhzcGxpdF9hdDIpO1xuIFxuIFx0XHRpZiAoIWZvbGlvX3RyeV9nZXQoZm9saW8yKSlcbi1cdFx0XHRnb3RvIG5vX3NwbGl0O1xuK1x0XHRcdGdvdG8gc3BsaXQ7XG4gXG4gXHRcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbzIpKVxuIFx0XHRcdGdvdG8gb3V0O1xuIFxuLVx0XHRpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8yKSlcbitcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvMikpIHtcbitcdFx0XHR0YWlsX2lzb2xhdGVkID0gZmFsc2U7XG4gXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0LypcbitcdFx0ICogc3BsaXRfYXQyIG1heSBubyBsb25nZXIgYmVsb25nIHRvIGZvbGlvMiBkdWUgdG8gY29uY3VycmVudFxuK1x0XHQgKiBzcGxpdC4gUmV0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBmb2xpbyBpbiBjYXNlIGl0J3Mgc3RpbGxcbitcdFx0ICogbGFyZ2UuXG4rXHRcdCAqL1xuK1x0XHRpZiAocGFnZV9mb2xpbyhzcGxpdF9hdDIpICE9IGZvbGlvMikge1xuK1x0XHRcdGZvbGlvX3VubG9jayhmb2xpbzIpO1xuK1x0XHRcdGZvbGlvX3B1dChmb2xpbzIpO1xuK1x0XHRcdGdvdG8gcmV0cnk7XG4rXHRcdH1cbiBcbiBcdFx0LyogbWFrZSBzdXJlIGZvbGlvMiBpcyBsYXJnZSBhbmQgZG9lcyBub3QgY2hhbmdlIGl0cyBtYXBwaW5nICovXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvMikgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpbzItXHUwMDNlbWFwcGluZyA9PSBmb2xpby1cdTAwM2VtYXBwaW5nKVxuLVx0XHRcdGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpO1xuK1x0XHQgICAgZm9saW8yLVx1MDAzZW1hcHBpbmcgPT0gZm9saW8tXHUwMDNlbWFwcGluZyBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGZvbGlvX3NwbGl0X29yX3VubWFwKGZvbGlvMiwgc3BsaXRfYXQyLCBtaW5fb3JkZXIpKVxuK1x0XHRcdHRhaWxfaXNvbGF0ZWQgPSBmYWxzZTtcbiBcbiBcdFx0Zm9saW9fdW5sb2NrKGZvbGlvMik7XG4gb3V0OlxuK1x0XHRpZiAoIXRhaWxfaXNvbGF0ZWQgXHUwMDI2XHUwMDI2IHBlbmQpXG4rXHRcdFx0KnBlbmQgPSBmb2xpbzItXHUwMDNlaW5kZXg7XG4gXHRcdGZvbGlvX3B1dChmb2xpbzIpO1xuLW5vX3NwbGl0OlxuK3NwbGl0OlxuK1x0XHRpZiAocHN0YXJ0KVxuK1x0XHRcdCpwc3RhcnQgPSByb3VuZF91cChwb3MgKyBvZmZzZXQsXG4rXHRcdFx0XHRcdCAgIG1pbl9ucmJ5dGVzKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiBcdFx0cmV0dXJuIHRydWU7XG4gXHR9XG4tXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cdHRydW5jYXRlX2lub2RlX2ZvbGlvKGZvbGlvLVx1MDAzZW1hcHBpbmcsIGZvbGlvKTtcbi1cdHJldHVybiB0cnVlO1xuK1x0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSlcbitcdFx0dHJ1bmNhdGVfaW5vZGVfZm9saW8oZm9saW8tXHUwMDNlbWFwcGluZywgZm9saW8pO1xuK25vX3NwbGl0OlxuK1x0aWYgKHBzdGFydClcbitcdFx0KnBzdGFydCA9IG9mZnNldCA/IGZvbGlvX25leHRfaW5kZXgoZm9saW8pIDogZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRpZiAocGVuZClcbitcdFx0KnBlbmQgPSAocG9zICsgc2l6ZSBcdTAwM2UgKHU2NClsZW5kKSA/IGZvbGlvLVx1MDAzZWluZGV4IDpcbitcdFx0XHRcdFx0XHQgICBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbitcdHJldHVybiBmYWxzZTtcbiB9XG4gXG4gLypcbkBAIC00MTMsMTEgKzQ0OSw4IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbHN0YXJ0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XG4gXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcbiBcdFx0c2FtZV9mb2xpbyA9IGxlbmQgXHUwMDNjIGZvbGlvX25leHRfcG9zKGZvbGlvKTtcbi1cdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKSB7XG4tXHRcdFx0c3RhcnQgPSBmb2xpb19uZXh0X2luZGV4KGZvbGlvKTtcbi1cdFx0XHRpZiAoc2FtZV9mb2xpbylcbi1cdFx0XHRcdGVuZCA9IGZvbGlvLVx1MDAzZWluZGV4O1xuLVx0XHR9XG4rXHRcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXHUwMDI2c3RhcnQsXG4rXHRcdFx0XHRcdCAgICAgc2FtZV9mb2xpbyA/IFx1MDAyNmVuZCA6IE5VTEwpO1xuIFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIFx0XHRmb2xpbyA9IE5VTEw7XG5AQCAtNDI3LDggKzQ2MCw3IEBAIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gXHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCBsZW5kIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULFxuIFx0XHRcdFx0XHRcdEZHUF9MT0NLLCAwKTtcbiBcdFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCF0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQpKVxuLVx0XHRcdFx0ZW5kID0gZm9saW8tXHUwMDNlaW5kZXg7XG4rXHRcdFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcdTAwMjZlbmQpO1xuIFx0XHRcdGZvbGlvX3VubG9jayhmb2xpbyk7XG4gXHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiBcdFx0fVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NDIuODMyMDE4MjZaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTA3OTUxNDQ3NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgRnV6emluZyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBmb2N1c2VkIG9uIHdoZXRoZXIgd2UgbmVlZCB0byBjb25zaWRlciBLTVNBTiBmdXp6aW5nIG9yIGlmIEtBU0FOIGlzIGFkZXF1YXRlIGZvciB0aGlzIHBhdGNoLiBJIHNlZSB0aGF0IGl0IHRvdWNoZXMgYG1tL2ludGVybmFsLmhgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vdHJ1bmNhdGUuY2Ag4oCTIHRoYXQncyBhIGtleSBhcmVhIHRvIHdhdGNoLiBTcGVjaWZpY2FsbHksIGl0J3MgbW9kaWZ5aW5nIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYCBhbmQgaXRzIGNhbGxlcnMgaW4gYHNobWVtX3VuZG9fcmFuZ2VgIGFuZCBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLlxuXG5Mb29raW5nIGF0IHRoZSBjaGFuZ2VzIHdpdGhpbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AsIEkgc2VlIHNvbWUgcHJldHR5IHNpZ25pZmljYW50IGFsdGVyYXRpb25zLiBUaGUgYWRkaXRpb24gb2YgYHBnb2ZmX3QgKnBzdGFydCwgcGdvZmZfdCAqcGVuZGAgdG8gcmV0dXJuIHBhZ2UgaW5kaWNlcyBpcyBpbnRlcmVzdGluZywgYW5kIHRoZSBjaGFuZ2VzIGluIGluZGV4IGNvbXB1dGF0aW9uIHJlbGF0ZWQgdG8gZm9saW8gc3BsaXR0aW5nIGFyZSBpbW1lZGlhdGVseSByYWlzaW5nIGEgZmxhZy4gSSdtIGFsc28gbm90aW5nIHRoZSBjaGFuZ2UgaW4gdGhlIHJldHVybiB2YWx1ZSBzZW1hbnRpY3Mg4oCTIHJldHVybmluZyBgdHJ1ZWAgb25seSBpZiB0aGUgZm9saW8gd2FzIHNwbGl0IG5vdyDigJMgdGhhdCdzIHNvbWV0aGluZyB0aGF0IGNvdWxkIHN1YnRseSBjaGFuZ2UgdGhlIGNvbnRyb2wgZmxvdyBpbiB0aGUgY2FsbGVycy4gVGhlIHVwZGF0ZXMgdG8gdGhvc2UgY2FsbGVycywgc3BlY2lmaWNhbGx5IGBzaG1lbV91bmRvX3JhbmdlYCBhbmQgYHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlYCwgdG8gcGFzcyBgXHUwMDI2c3RhcnRgIGFuZCBgXHUwMDI2ZW5kYCBwb2ludGVycywgYXJlIGFsc28gaW1wb3J0YW50IHRvIGV4YW1pbmUuXG5cbk5vdywgSSdtIGdvaW5nIHRvIGRpZyBpbnRvIHRoZSBjYWxsZXJzIGFuZCB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZSB2YXJpYWJsZXMgYmVpbmcgcGFzc2VkIHRvIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYC4gSSdtIHN0YXJ0aW5nIGJ5IGV4YW1pbmluZyBgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2VgLCBhcyBJIGNhbiBmaW5kIGl0IGluIGBtbS90cnVuY2F0ZS5jYCBhcm91bmQgbGluZSA0MTMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgYXJlIHVzZWQsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIG9yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIHRoYXQgbWlnaHQgYmUgZXhwb3NlZC4gVGhpcyB3aWxsIGhlbHAgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSBtb3JlIGFnZ3Jlc3NpdmUgZnV6emluZyBhcHByb2FjaCB0byBjYXRjaCBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gdGhpcyBjcml0aWNhbCBwYXRoLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODA4LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NTMuNjI3MTcyMVoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzM3NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdHJ1bmNhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzOTUsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzOTU6XFx0ICogbWFwcGluZyBpcyBsYXJnZSwgaXQgaXMgcHJvYmFibHkgdGhlIGNhc2UgdGhhdCB0aGUgZmluYWwgcGFnZXMgYXJlIHRoZSBtb3N0XFxuIDM5NjpcXHQgKiByZWNlbnRseSB0b3VjaGVkLCBhbmQgZnJlZWluZyBoYXBwZW5zIGluIGFzY2VuZGluZyBmaWxlIG9mZnNldCBvcmRlci5cXG4gMzk3OlxcdCAqXFxuIDM5ODpcXHQgKiBOb3RlIHRoYXQgc2luY2UgLVxcdTAwM2VpbnZhbGlkYXRlX2ZvbGlvKCkgYWNjZXB0cyByYW5nZSB0byBpbnZhbGlkYXRlXFxuIDM5OTpcXHQgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZSBpcyBhYmxlIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsZW5kICsgMSBpcyBub3RcXG4gNDAwOlxcdCAqIHBhZ2UgYWxpZ25lZCBwcm9wZXJseS5cXG4gNDAxOlxcdCAqL1xcbiA0MDI6XFx0dm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4gNDAzOlxcdFxcdFxcdFxcdFxcdGxvZmZfdCBsc3RhcnQsIHVvZmZfdCBsZW5kKVxcbiA0MDQ6XFx0e1xcbiA0MDU6XFx0XFx0cGdvZmZfdFxcdFxcdHN0YXJ0O1xcdFxcdC8qIGluY2x1c2l2ZSAqL1xcbiA0MDY6XFx0XFx0cGdvZmZfdFxcdFxcdGVuZDtcXHRcXHQvKiBleGNsdXNpdmUgKi9cXG4gNDA3OlxcdFxcdHN0cnVjdCBmb2xpb19iYXRjaCBmYmF0Y2g7XFxuIDQwODpcXHRcXHRwZ29mZl90XFx0XFx0aW5kaWNlc1tGT0xJT19CQVRDSF9TSVpFXTtcXG4gNDA5OlxcdFxcdHBnb2ZmX3RcXHRcXHRpbmRleDtcXG4gNDEwOlxcdFxcdGludFxcdFxcdGk7XFxuIDQxMTpcXHRcXHRzdHJ1Y3QgZm9saW9cXHQqZm9saW87XFxuIDQxMjpcXHRcXHRib29sXFx0XFx0c2FtZV9mb2xpbztcXG4gNDEzOlxcdFxcbiA0MTQ6XFx0XFx0aWYgKG1hcHBpbmdfZW1wdHkobWFwcGluZykpXFxuIDQxNTpcXHRcXHRcXHRyZXR1cm47XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdC8qXFxuIDQxODpcXHRcXHQgKiAnc3RhcnQnIGFuZCAnZW5kJyBhbHdheXMgY292ZXJzIHRoZSByYW5nZSBvZiBwYWdlcyB0byBiZSBmdWxseVxcbiA0MTk6XFx0XFx0ICogdHJ1bmNhdGVkLiBQYXJ0aWFsIHBhZ2VzIGFyZSBjb3ZlcmVkIHdpdGggJ3BhcnRpYWxfc3RhcnQnIGF0IHRoZVxcbiA0MjA6XFx0XFx0ICogc3RhcnQgb2YgdGhlIHJhbmdlIGFuZCAncGFydGlhbF9lbmQnIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlLlxcbiA0MjE6XFx0XFx0ICogTm90ZSB0aGF0ICdlbmQnIGlzIGV4Y2x1c2l2ZSB3aGlsZSAnbGVuZCcgaXMgaW5jbHVzaXZlLlxcbiA0MjI6XFx0XFx0ICovXFxuIDQyMzpcXHRcXHRzdGFydCA9IChsc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbiA0MjQ6XFx0XFx0aWYgKGxlbmQgPT0gLTEpXFxuIDQyNTpcXHRcXHRcXHQvKlxcbiA0MjY6XFx0XFx0XFx0ICogbGVuZCA9PSAtMSBpbmRpY2F0ZXMgZW5kLW9mLWZpbGUgc28gd2UgaGF2ZSB0byBzZXQgJ2VuZCdcXG4gNDI3OlxcdFxcdFxcdCAqIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHBnb2ZmX3QgYW5kIHNpbmNlIHRoZSB0eXBlIGlzXFxuIDQyODpcXHRcXHRcXHQgKiB1bnNpZ25lZCB3ZSdyZSB1c2luZyAtMS5cXG4gNDI5OlxcdFxcdFxcdCAqL1xcbiA0MzA6XFx0XFx0XFx0ZW5kID0gLTE7XFxuIDQzMTpcXHRcXHRlbHNlXFxuIDQzMjpcXHRcXHRcXHRlbmQgPSAobGVuZCArIDEpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuIDQzMzpcXHRcXG4gNDM0OlxcdFxcdGZvbGlvX2JhdGNoX2luaXQoXFx1MDAyNmZiYXRjaCk7XFxuIDQzNTpcXHRcXHRpbmRleCA9IHN0YXJ0O1xcbiA0MzY6XFx0XFx0d2hpbGUgKGluZGV4IFxcdTAwM2MgZW5kIFxcdTAwMjZcXHUwMDI2IGZpbmRfbG9ja19lbnRyaWVzKG1hcHBpbmcsIFxcdTAwMjZpbmRleCwgZW5kIC0gMSxcXG4gNDM3OlxcdFxcdFxcdFxcdFxcdTAwMjZmYmF0Y2gsIGluZGljZXMpKSB7XFxuIDQzODpcXHRcXHRcXHR0cnVuY2F0ZV9mb2xpb19iYXRjaF9leGNlcHRpb25hbHMobWFwcGluZywgXFx1MDAyNmZiYXRjaCwgaW5kaWNlcyk7XFxuIDQzOTpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZm9saW9fYmF0Y2hfY291bnQoXFx1MDAyNmZiYXRjaCk7IGkrKylcXG4gNDQwOlxcdFxcdFxcdFxcdHRydW5jYXRlX2NsZWFudXBfZm9saW8oZmJhdGNoLmZvbGlvc1tpXSk7XFxuIDQ0MTpcXHRcXHRcXHRkZWxldGVfZnJvbV9wYWdlX2NhY2hlX2JhdGNoKG1hcHBpbmcsIFxcdTAwMjZmYmF0Y2gpO1xcbiA0NDI6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFxcdTAwMjZmYmF0Y2gpOyBpKyspXFxuIDQ0MzpcXHRcXHRcXHRcXHRmb2xpb191bmxvY2soZmJhdGNoLmZvbGlvc1tpXSk7XFxuIDQ0NDpcXHRcXHRcXHRmb2xpb19iYXRjaF9yZWxlYXNlKFxcdTAwMjZmYmF0Y2gpO1xcbiA0NDU6XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIDQ0NjpcXHRcXHR9XFxuIDQ0NzpcXHRcXG4gNDQ4OlxcdFxcdHNhbWVfZm9saW8gPSAobHN0YXJ0IFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpID09IChsZW5kIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbiA0NDk6XFx0XFx0Zm9saW8gPSBfX2ZpbGVtYXBfZ2V0X2ZvbGlvKG1hcHBpbmcsIGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBGR1BfTE9DSywgMCk7XFxuIDQ1MDpcXHRcXHRpZiAoIUlTX0VSUihmb2xpbykpIHtcXG4gNDUxOlxcdFxcdFxcdHNhbWVfZm9saW8gPSBsZW5kIFxcdTAwM2MgZm9saW9fbmV4dF9wb3MoZm9saW8pO1xcbiA0NTI6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBcXHUwMDI2c3RhcnQsXFxuIDQ1MzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHNhbWVfZm9saW8gPyBcXHUwMDI2ZW5kIDogTlVMTCk7XFxuIDQ1NDpcXHRcXHRcXHRmb2xpb191bmxvY2soZm9saW8pO1xcbiA0NTU6XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4gNDU2OlxcdFxcdFxcdGZvbGlvID0gTlVMTDtcXG4gNDU3OlxcdFxcdH1cXG4gNDU4OlxcdFxcbiA0NTk6XFx0XFx0aWYgKCFzYW1lX2ZvbGlvKSB7XFxuIDQ2MDpcXHRcXHRcXHRmb2xpbyA9IF9fZmlsZW1hcF9nZXRfZm9saW8obWFwcGluZywgbGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULFxcbiA0NjE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0RkdQX0xPQ0ssIDApO1xcbiA0NjI6XFx0XFx0XFx0aWYgKCFJU19FUlIoZm9saW8pKSB7XFxuIDQ2MzpcXHRcXHRcXHRcXHR0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvKGZvbGlvLCBsc3RhcnQsIGxlbmQsIE5VTEwsIFxcdTAwMjZlbmQpO1xcbiA0NjQ6XFx0XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4gNDY1OlxcdFxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuIDQ2NjpcXHRcXHRcXHR9XFxuIDQ2NzpcXHRcXHR9XFxuIDQ2ODpcXHRcXG4gNDY5OlxcdFxcdGluZGV4ID0gc3RhcnQ7XFxuIDQ3MDpcXHRcXHR3aGlsZSAoaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4gNDcxOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiA0NzI6XFx0XFx0XFx0aWYgKCFmaW5kX2dldF9lbnRyaWVzKG1hcHBpbmcsIFxcdTAwMjZpbmRleCwgZW5kIC0gMSwgXFx1MDAyNmZiYXRjaCxcXG4gNDczOlxcdFxcdFxcdFxcdFxcdGluZGljZXMpKSB7XFxuIDQ3NDpcXHRcXHRcXHRcXHQvKiBJZiBhbGwgZ29uZSBmcm9tIHN0YXJ0IG9ud2FyZHMsIHdlJ3JlIGRvbmUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDY6NTk6NTMuNjI3MzA4NDUxWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4Nzc2NTgwOTE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYG1tL3NobWVtLmNgKipcblxuT2theSwgSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgZnVydGhlci4gQmFzZWQgb24gdGhlIGN1cnJlbnQgaXNzdWUsIG15IGludHVpdGlvbiBpcyBwb2ludGluZyBtZSB0b3dhcmRzIHRoZSBzaGFyZWQgbWVtb3J5IGNvZGUuIExldCdzIHN0YXJ0IHdpdGggYG1tL3NobWVtLmNgLCBiZWNhdXNlIHRoYXQgc2VlbXMgbGlrZSBhIGxpa2VseSBjYW5kaWRhdGUgZm9yIHRoZSB0eXBlIG9mIG1lbW9yeSBpbnRlcmFjdGlvbiB0aGUgaXNzdWUgaXMgcmVsYXRlZCB0by4gVGhlIGJlaGF2aW9yIHJlcG9ydGVkIGhhcyBhIGNlcnRhaW4gbnVhbmNlIGFuZCB0aGUgc2hhcmVkIG1lbW9yeSBpbXBsZW1lbnRhdGlvbnMgc29tZXRpbWVzIGhhdmUgc3VidGxlIGlzc3Vlcy4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIHJlbGF0ZWQgdG8gYWxsb2NhdGlvbiBvciBzeW5jaHJvbml6YXRpb24gdGhlcmUuIE5vdywgc3BlY2lmaWNhbGx5LCBnaXZlbiB3aGF0IEknbSBzZWVpbmcsIGxldCdzIHplcm8gaW4gb24gdGhlIGFyZWEgYXJvdW5kIGxpbmUgMTE3NS4gVGhhdCBmZWVscyBsaWtlIGEgZ29vZCBzdGFydGluZyBwb2ludCB0byBkaWcgaW4gYW5kIHNlZSB3aGF0J3MgaGFwcGVuaW5nLiBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBzcGVjaWZpYyBsaW5lIGFuZCB3aGF0IGl0J3MgZG9pbmcsIGFuZCBzZWUgaWYgaXQncyBjb250cmlidXRpbmcgdG8gdGhpcyBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6NjgzNSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MjIuNDAzODkyMjI1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM2MjA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9zaG1lbS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNTAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNTA6XFx0XFx0XFx0XFx0XFx0bnJfc3dhcHNfZnJlZWQgKz0gc2htZW1fZnJlZV9zd2FwKG1hcHBpbmcsIGluZGljZXNbaV0sXFxuMTE1MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGVuZCAtIDEsIGZvbGlvKTtcXG4xMTUyOlxcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjExNTM6XFx0XFx0XFx0XFx0fVxcbjExNTQ6XFx0XFxuMTE1NTpcXHRcXHRcXHRcXHRpZiAoIXVuZmFsbG9jIHx8ICFmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSlcXG4xMTU2OlxcdFxcdFxcdFxcdFxcdHRydW5jYXRlX2lub2RlX2ZvbGlvKG1hcHBpbmcsIGZvbGlvKTtcXG4xMTU3OlxcdFxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTE1ODpcXHRcXHRcXHR9XFxuMTE1OTpcXHRcXHRcXHRmb2xpb19iYXRjaF9yZW1vdmVfZXhjZXB0aW9uYWxzKFxcdTAwMjZmYmF0Y2gpO1xcbjExNjA6XFx0XFx0XFx0Zm9saW9fYmF0Y2hfcmVsZWFzZShcXHUwMDI2ZmJhdGNoKTtcXG4xMTYxOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjExNjI6XFx0XFx0fVxcbjExNjM6XFx0XFxuMTE2NDpcXHRcXHQvKlxcbjExNjU6XFx0XFx0ICogV2hlbiB1bmRvaW5nIGEgZmFpbGVkIGZhbGxvY2F0ZSwgd2Ugd2FudCBub25lIG9mIHRoZSBwYXJ0aWFsIGZvbGlvXFxuMTE2NjpcXHRcXHQgKiB6ZXJvaW5nIGFuZCBzcGxpdHRpbmcgYmVsb3csIGJ1dCBzaGFsbCB3YW50IHRvIHRydW5jYXRlIHRoZSB3aG9sZVxcbjExNjc6XFx0XFx0ICogZm9saW8gd2hlbiAhdXB0b2RhdGUgaW5kaWNhdGVzIHRoYXQgaXQgd2FzIGFkZGVkIGJ5IHRoaXMgZmFsbG9jYXRlLFxcbjExNjg6XFx0XFx0ICogZXZlbiB3aGVuIFtsc3RhcnQsIGxlbmRdIGNvdmVycyBvbmx5IGEgcGFydCBvZiB0aGUgZm9saW8uXFxuMTE2OTpcXHRcXHQgKi9cXG4xMTcwOlxcdFxcdGlmICh1bmZhbGxvYylcXG4xMTcxOlxcdFxcdFxcdGdvdG8gd2hvbGVfZm9saW9zO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRzYW1lX2ZvbGlvID0gKGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKSA9PSAobGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4xMTc0OlxcdFxcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxzdGFydCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4xMTc1OlxcdFxcdGlmIChmb2xpbykge1xcbjExNzY6XFx0XFx0XFx0c2FtZV9mb2xpbyA9IGxlbmQgXFx1MDAzYyBmb2xpb19uZXh0X3Bvcyhmb2xpbyk7XFxuMTE3NzpcXHRcXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG4xMTc4OlxcdFxcdFxcdHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW8oZm9saW8sIGxzdGFydCwgbGVuZCwgXFx1MDAyNnN0YXJ0LFxcbjExNzk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzYW1lX2ZvbGlvID8gXFx1MDAyNmVuZCA6IE5VTEwpO1xcbjExODA6XFx0XFx0XFx0Zm9saW9fdW5sb2NrKGZvbGlvKTtcXG4xMTgxOlxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuMTE4MjpcXHRcXHRcXHRmb2xpbyA9IE5VTEw7XFxuMTE4MzpcXHRcXHR9XFxuMTE4NDpcXHRcXG4xMTg1OlxcdFxcdGlmICghc2FtZV9mb2xpbylcXG4xMTg2OlxcdFxcdFxcdGZvbGlvID0gc2htZW1fZ2V0X3BhcnRpYWxfZm9saW8oaW5vZGUsIGxlbmQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuMTE4NzpcXHRcXHRpZiAoZm9saW8pIHtcXG4xMTg4OlxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbjExODk6XFx0XFx0XFx0dHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpbyhmb2xpbywgbHN0YXJ0LCBsZW5kLCBOVUxMLCBcXHUwMDI2ZW5kKTtcXG4xMTkwOlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuMTE5MTpcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbjExOTI6XFx0XFx0fVxcbjExOTM6XFx0XFxuMTE5NDpcXHR3aG9sZV9mb2xpb3M6XFxuMTE5NTpcXHRcXG4xMTk2OlxcdFxcdGluZGV4ID0gc3RhcnQ7XFxuMTE5NzpcXHRcXHR3aGlsZSAoaW5kZXggXFx1MDAzYyBlbmQpIHtcXG4xMTk4OlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjExOTk6XFx0XFxuMTIwMDpcXHRcXHRcXHRpZiAoIWZpbmRfZ2V0X2VudHJpZXMobWFwcGluZywgXFx1MDAyNmluZGV4LCBlbmQgLSAxLCBcXHUwMDI2ZmJhdGNoLFxcbjEyMDE6XFx0XFx0XFx0XFx0XFx0aW5kaWNlcykpIHtcXG4xMjAyOlxcdFxcdFxcdFxcdC8qIElmIGFsbCBnb25lIG9yIGhvbGUtcHVuY2ggb3IgdW5mYWxsb2MsIHdlJ3JlIGRvbmUgKi9cXG4xMjAzOlxcdFxcdFxcdFxcdGlmIChpbmRleCA9PSBzdGFydCB8fCBlbmQgIT0gLTEpXFxuMTIwNDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xMjA1OlxcdFxcdFxcdFxcdC8qIEJ1dCBpZiB0cnVuY2F0aW5nLCByZXN0YXJ0IHRvIG1ha2Ugc3VyZSBhbGwgZ29uZSAqL1xcbjEyMDY6XFx0XFx0XFx0XFx0aW5kZXggPSBzdGFydDtcXG4xMjA3OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjEyMDg6XFx0XFx0XFx0fVxcbjEyMDk6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGZvbGlvX2JhdGNoX2NvdW50KFxcdTAwMjZmYmF0Y2gpOyBpKyspIHtcXG4xMjEwOlxcdFxcdFxcdFxcdGZvbGlvID0gZmJhdGNoLmZvbGlvc1tpXTtcXG4xMjExOlxcdFxcbjEyMTI6XFx0XFx0XFx0XFx0aWYgKHhhX2lzX3ZhbHVlKGZvbGlvKSkge1xcbjEyMTM6XFx0XFx0XFx0XFx0XFx0aW50IG9yZGVyO1xcbjEyMTQ6XFx0XFx0XFx0XFx0XFx0bG9uZyBzd2Fwc19mcmVlZDtcXG4xMjE1OlxcdFxcbjEyMTY6XFx0XFx0XFx0XFx0XFx0aWYgKHVuZmFsbG9jKVxcbjEyMTc6XFx0XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMTIxODpcXHRcXHRcXHRcXHRcXHRzd2Fwc19mcmVlZCA9IHNobWVtX2ZyZWVfc3dhcChtYXBwaW5nLCBpbmRpY2VzW2ldLFxcbjEyMTk6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZW5kIC0gMSwgZm9saW8pO1xcbjEyMjA6XFx0XFx0XFx0XFx0XFx0aWYgKCFzd2Fwc19mcmVlZCkge1xcbjEyMjE6XFx0XFx0XFx0XFx0XFx0XFx0cGdvZmZfdCBiYXNlID0gaW5kaWNlc1tpXTtcXG4xMjIyOlxcdFxcbjEyMjM6XFx0XFx0XFx0XFx0XFx0XFx0b3JkZXIgPSBzaG1lbV9jb25maXJtX3N3YXAobWFwcGluZywgaW5kaWNlc1tpXSxcXG4xMjI0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHJhZGl4X3RvX3N3cF9lbnRyeShmb2xpbykpO1xcbjEyMjU6XFx0XFx0XFx0XFx0XFx0XFx0LypcXG4xMjI2OlxcdFxcdFxcdFxcdFxcdFxcdCAqIElmIGZvdW5kIGEgbGFyZ2Ugc3dhcCBlbnRyeSBjcm9zcyB0aGUgZW5kIG9yIHN0YXJ0XFxuMTIyNzpcXHRcXHRcXHRcXHRcXHRcXHQgKiBib3JkZXIsIHNraXAgaXQgYXMgdGhlIHRydW5jYXRlX2lub2RlX3BhcnRpYWxfZm9saW9cXG4xMjI4OlxcdFxcdFxcdFxcdFxcdFxcdCAqIGFib3ZlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHplcm9kIGl0cyBjb250ZW50IG9uY2UuXFxuMTIyOTpcXHRcXHRcXHRcXHRcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MjIuNDA0MjU2Mjc1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE2Mjg4NjE5MDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaXMgY2xlYXJseSBmb2N1c2VkIG9uIHJlZmluaW5nIGhvdyB3ZSBoYW5kbGUgcGFydGlhbCBmb2xpb3MgZHVyaW5nIHRydW5jYXRpb24gYW5kIGhvbGUgcHVuY2hpbmcuIFNwZWNpZmljYWxseSwgaXQncyBjbGVhbmluZyB1cCB0aGUgaW50ZXJmYWNlIHRvIGB0cnVuY2F0ZV9pbm9kZV9wYXJ0aWFsX2ZvbGlvYC4gSW5zdGVhZCBvZiB0aGUgY2FsbGVyIGhhdmluZyB0byBmaWd1cmUgb3V0IHN0YXJ0IGFuZCBlbmQgcGFnZSBvZmZzZXRzIGJhc2VkIG9uIHJldHVybiB2YWx1ZXMsIHRoZSBmdW5jdGlvbiBub3cgZGlyZWN0bHkgdXBkYXRlcyBgKnBzdGFydGAgYW5kIGAqcGVuZGAuIE1ha2VzIHNlbnNlIOKAkyBtb3JlIGV4cGxpY2l0IGlzIGdlbmVyYWxseSBiZXR0ZXIsIGFuZCBpdCBzaW1wbGlmaWVzIHRoZSBsb2dpYyBvbiB0aGUgY2FsbGVyJ3Mgc2lkZS5cblxuVGhlIG1haW4gY2hhbmdlcyBzZWVtIHRvIGJlIGluIGhvdyBpdCBkZWFscyB3aXRoIGxhcmdlIGZvbGlvIHNwbGl0cy4gSXQgbG9va3MgbGlrZSBgcHN0YXJ0YCBhbmQgYHBlbmRgIGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgd2l0aGluIGB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZWAgb3IgYHNobWVtX3VuZG9fcmFuZ2VgLCBhbmQgdGhlbiBgdHJ1bmNhdGVfaW5vZGVfcGFydGlhbF9mb2xpb2AgZG9lcyB0aGUgYXNzaWdubWVudHMuIEkgc2VlIHRoZSBhc3NpZ25tZW50cyBhcmUgYmFzZWQgb24gd2hldGhlciBmb2xpbyBzcGxpdHRpbmcgaXMgc3VjY2Vzc2Z1bDogaWYgYGZvbGlvX3NwbGl0X29yX3VubWFwYCB3b3Jrcywgd2UgdXBkYXRlIGAqcGVuZGAgYW5kIGAqcHN0YXJ0YCB3aXRoIHRoZSBjb3JyZWN0bHkgcm91bmRlZCB2YWx1ZXMuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCwgbm8gbWF0dGVyIHRoZSBwYXRoLCB3aGV0aGVyIGEgc3BsaXQgb2NjdXJzIG9yIG5vdCwgdGhlIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMsIGlmIHByb3ZpZGVkLCBnZXQgaW5pdGlhbGl6ZWQuIFRoZSBjYWxsZXIncyBgc3RhcnRgIGFuZCBgZW5kYCB3ZXJlIHByZS1pbml0aWFsaXplZCwgc28gdGhpcyBhdm9pZHMgdGhlIGluaXRpYWwgdmFyaWFibGUgaXNzdWUgZW50aXJlbHkuXG5cbk5vdywgZm9yIEtNU0FOLiBUaGUgY3JpdGljYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnk/IExldCdzIGdvIHRocm91Z2ggdGhlIEtNU0FOIGNyaXRlcmlhLiBGaXJzdCwga2VybmVsIHN0cnVjdHVyZXMgcGFzc2VkIHRvIHVzZXIgc3BhY2U6IG5vcGUsIHdlJ3JlIGRlYWxpbmcgd2l0aCBwYWdlIGNhY2hlIG9wZXJhdGlvbnMg4oCTIGFsbCB3aXRoaW4ga2VybmVsIHNwYWNlLiBTZWNvbmQsIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLiBMb2NhbCB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGluZ3MgbGlrZSBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBhbmQgdGhlIGZvbGlvcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gVGhlIGNhbGxlciBpbml0aWFsaXplcyBgc3RhcnRgIGFuZCBgZW5kYC4gTm8gcmlzayB0aGVyZS4gVGhpcmQsIGFsbG9jYXRpb24gb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBmaWVsZHM/IEFnYWluLCBuby4gQW5kIGZvdXJ0aCwgYW55IHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBieXRlcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGJvdW5kcyBjaGVja3Mgb3IgbGVuZ3RoIGNhbGN1bGF0aW9ucz8gVGhlIGNvZGUgaXMgbW9zdGx5IGFib3V0IG1lbW9yeSBtYW5hZ2VtZW50OiB6ZXJvaW5nIHBvcnRpb25zIG9mIGZvbGlvcyB3aXRoIGBmb2xpb196ZXJvX3JhbmdlYCwgc3BsaXR0aW5nIHRoZW0sIGFuZCB0cnVuY2F0aW9uIGl0c2VsZi4gWmVyb2luZyBwYWdlIGNvbnRlbnQgaXMgbGVnaXRpbWF0ZSBhbmQgZXhwZWN0ZWQuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIGdvIHRocm91Z2ggdGhlIHZhcmlhYmxlcy4gYG1pbl9ucmJ5dGVzYCBpcyBpbml0aWFsaXplZC4gYHRhaWxfaXNvbGF0ZWRgIGlzIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgdG8gYHRydWVgLiBgZm9saW8yYCBpcyBpbml0aWFsaXplZC4gYHNwbGl0X2F0YCBhbmQgYHNwbGl0X2F0MmAgYXJlIGFsc28gaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4gU28sIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGJlaW5nIHVzZWQsIHBlcmlvZC5cblxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJ3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IEtNU0FOIHdvdWxkIGNhdGNoLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBhZ2UgcmVmZXJlbmNlIGNvdW50aW5nLCByYWNlIGNvbmRpdGlvbnMsIGxvY2tpbmcsIG9yIG91dC1vZi1ib3VuZHMgdHJ1bmNhdGlvbiByYW5nZXMgd2lsbCBiZSBoYW5kbGVkIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBWTSBhc3NlcnRpb25zLiBUaW1lIHRvIG1vdmUgb24gYW5kIHByZXBhcmUgdGhlIGNhbGwgZm9yIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgyODAsIk91dHB1dFRva2VucyI6MjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMDc6MDA6MzguNjkyODc4NTc2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBmb2xpbyBzcGxpdHRpbmcgYW5kIHJhbmdlIGNhbGN1bGF0aW9uIGxvZ2ljIGluIHRoZSBwYWdlIGNhY2hlIHRydW5jYXRpb24gY29kZSAoYG1tL3RydW5jYXRlLmNgLCBgbW0vc2htZW0uY2AsIGFuZCBgbW0vaW50ZXJuYWwuaGApIGJ5IHJldHVybmluZyB1cGRhdGVkIHBhZ2UgcmFuZ2UgYm91bmRhcmllcyB2aWEgYHBzdGFydGAgYW5kIGBwZW5kYCBwb2ludGVycy5cXG5cXG5BbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwb2ludGVycyBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIChgbWluX25yYnl0ZXNgLCBgdGFpbF9pc29sYXRlZGAsIGBzcGxpdF9hdGAsIGBzcGxpdF9hdDJgLCBgZm9saW8yYCwgYCpwc3RhcnRgLCBgKnBlbmRgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgY2FsbGVyIHZhcmlhYmxlcyAoYHN0YXJ0YCwgYGVuZGApIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkIHByaW9yIHRvIGludm9jYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVncyBpbiBwYWdlIGNhY2hlIHRydW5jYXRpb24sIGZvbGlvIHNwbGl0dGluZywgb3IgcmVmZXJlbmNlIGNvdW50aW5nIHdvdWxkIGludm9sdmUgdXNlLWFmdGVyLWZyZWUsIGNvbmN1cnJlbnQgbG9ja2luZywgb3IgcGFnZSBzdGF0ZSBpbnZhbGlkYXRpb24sIHdoaWNoIGFyZSBkZXRlY3RlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHBhZ2UgY2FjaGUgYXNzZXJ0aW9ucyByYXRoZXIgdGhhbiBLTVNBTi4gVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZm9saW8gc3BsaXR0aW5nIGFuZCByYW5nZSBjYWxjdWxhdGlvbiBsb2dpYyBpbiB0aGUgcGFnZSBjYWNoZSB0cnVuY2F0aW9uIGNvZGUgKGBtbS90cnVuY2F0ZS5jYCwgYG1tL3NobWVtLmNgLCBhbmQgYG1tL2ludGVybmFsLmhgKSBieSByZXR1cm5pbmcgdXBkYXRlZCBwYWdlIHJhbmdlIGJvdW5kYXJpZXMgdmlhIGBwc3RhcnRgIGFuZCBgcGVuZGAgcG9pbnRlcnMuXFxuXFxuQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcG9pbnRlcnMgaW50cm9kdWNlZCBvciBtb2RpZmllZCAoYG1pbl9ucmJ5dGVzYCwgYHRhaWxfaXNvbGF0ZWRgLCBgc3BsaXRfYXRgLCBgc3BsaXRfYXQyYCwgYGZvbGlvMmAsIGAqcHN0YXJ0YCwgYCpwZW5kYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIGNhbGxlciB2YXJpYWJsZXMgKGBzdGFydGAsIGBlbmRgKSBhcmUgYWxyZWFkeSBpbml0aWFsaXplZCBwcmlvciB0byBpbnZvY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1Z3MgaW4gcGFnZSBjYWNoZSB0cnVuY2F0aW9uLCBmb2xpbyBzcGxpdHRpbmcsIG9yIHJlZmVyZW5jZSBjb3VudGluZyB3b3VsZCBpbnZvbHZlIHVzZS1hZnRlci1mcmVlLCBjb25jdXJyZW50IGxvY2tpbmcsIG9yIHBhZ2Ugc3RhdGUgaW52YWxpZGF0aW9uLCB3aGljaCBhcmUgZGV0ZWN0ZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBwYWdlIGNhY2hlIGFzc2VydGlvbnMgcmF0aGVyIHRoYW4gS01TQU4uIFRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[1] Phase: Succeeded StartedAt: 2026-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 07:00:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 07:00:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2] Phase: Succeeded StartedAt: 2026-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 07:01:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:00:50 +0000 UTC FinishedAt: 2026-09-09 07:00:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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-workflowml2k8/series-workflowml2k8-convert-artifact-62471472/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:01:00 +0000 UTC FinishedAt: 2026-09-09 07:17:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:01:00 +0000 UTC FinishedAt: 2026-09-09 07:17:18 +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:*b51bdf7c-c807-4d63-9302-58ad1872b3ae,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-workflowml2k8/series-workflowml2k8-convert-artifact-62471472/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": "76c07670-5231-4ce4-bf6c-cf36e1b40f92", "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-workflowml2k8/series-workflowml2k8-build-action-2486774326/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:01:00 +0000 UTC FinishedAt: 2026-09-09 07:17:08 +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:*b51bdf7c-c807-4d63-9302-58ad1872b3ae,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-workflowml2k8/series-workflowml2k8-convert-artifact-62471472/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": "76c07670-5231-4ce4-bf6c-cf36e1b40f92", "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-workflowml2k8/series-workflowml2k8-build-action-2486774326/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:18 +0000 UTC FinishedAt: 2026-09-09 07:17:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:18 +0000 UTC FinishedAt: 2026-09-09 07:17:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:18 +0000 UTC FinishedAt: 2026-09-09 07:17:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:18 +0000 UTC FinishedAt: 2026-09-09 07:17:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-workflowml2k8/series-workflowml2k8-convert-artifact-731641367/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:28 +0000 UTC FinishedAt: 2026-09-09 07:20:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:17:28 +0000 UTC FinishedAt: 2026-09-09 07:20:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*76c07670-5231-4ce4-bf6c-cf36e1b40f92,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-workflowml2k8/series-workflowml2k8-build-action-2486774326/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-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:20:15 +0000 UTC FinishedAt: 2026-09-09 07:20:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:20:15 +0000 UTC FinishedAt: 2026-09-09 07:20:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:20:15 +0000 UTC FinishedAt: 2026-09-09 07:36:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:20:15 +0000 UTC FinishedAt: 2026-09-09 07:36:06 +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:*b51bdf7c-c807-4d63-9302-58ad1872b3ae,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-workflowml2k8/series-workflowml2k8-convert-artifact-731641367/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": "af745e9e-7368-4f7c-8497-7ef131407660", "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-workflowml2k8/series-workflowml2k8-build-action-2072456283/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:20:15 +0000 UTC FinishedAt: 2026-09-09 07:35:56 +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:*b51bdf7c-c807-4d63-9302-58ad1872b3ae,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-workflowml2k8/series-workflowml2k8-convert-artifact-731641367/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": "af745e9e-7368-4f7c-8497-7ef131407660", "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-workflowml2k8/series-workflowml2k8-build-action-2072456283/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:36:06 +0000 UTC FinishedAt: 2026-09-09 07:36:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:36:06 +0000 UTC FinishedAt: 2026-09-09 07:36:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:36:06 +0000 UTC FinishedAt: 2026-09-09 07:38:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:36:06 +0000 UTC FinishedAt: 2026-09-09 07:37:51 +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:*af745e9e-7368-4f7c-8497-7ef131407660,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-workflowml2k8/series-workflowml2k8-build-action-2072456283/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-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"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:*76c07670-5231-4ce4-bf6c-cf36e1b40f92,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*af745e9e-7368-4f7c-8497-7ef131407660,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-workflowml2k8/series-workflowml2k8-build-action-2486774326/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-workflowml2k8/series-workflowml2k8-build-action-2072456283/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 07:38:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 07:38:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"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-workflowml2k8/series-workflowml2k8-convert-artifact-1452634320/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 07:38:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 07:38:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:01 +0000 UTC FinishedAt: 2026-09-09 07:38:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:11 +0000 UTC FinishedAt: 2026-09-09 10:43:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowml2k8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["truncate_inode_partial_folio","shmem_undo_range","truncate_inode_pages_range"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"ba9572bc43d04d71ba52ae7f20645f1eafe86875","config_name":"upstream-apparmor-kasan.config","enable_configs":["SHMEM","TRANSPARENT_HUGEPAGE"],"series_id":"5ec407be-c4b7-489c-b9af-9127f439c9d3","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-09-09 07:38:11 +0000 UTC FinishedAt: 2026-09-09 10:43:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*76c07670-5231-4ce4-bf6c-cf36e1b40f92,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*af745e9e-7368-4f7c-8497-7ef131407660,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-workflowml2k8/series-workflowml2k8-build-action-2486774326/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-workflowml2k8/series-workflowml2k8-build-action-2072456283/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-workflowml2k8/series-workflowml2k8-convert-artifact-1452634320/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,}