Name: series-workflowv2pqg Phase: Succeeded StartedAt: 2026-09-12 13:38:13 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[0] Phase: Succeeded StartedAt: 2026-09-12 13:38:13 +0000 UTC FinishedAt: 2026-09-12 14:01:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[0].run-triage Phase: Succeeded StartedAt: 2026-09-12 13:38:13 +0000 UTC FinishedAt: 2026-09-12 14:01:01 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "OPENVSWITCH", "NF_CONNTRACK", "NF_CONNTRACK_LABELS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "OPENVSWITCH", "NF_CONNTRACK", "NF_CONNTRACK_LABELS" ], "series_id": "7cf1ae3e-5a85-4ffb-81c8-53d21d41e395" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "ovs_ct_get_conn_labels", "ovs_ct_set_labels", "ovs_ct_init_labels", "ovs_ct_commit", "ovs_ct_execute" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "base_tree": "net" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O09QRU5WU1dJVENIJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDSyYjMzQ7LAogICAgJiMzNDtORl9DT05OVFJBQ0tfTEFCRUxTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7b3ZzX2N0X2dldF9jb25uX2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3Rfc2V0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfaW5pdF9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2NvbW1pdCYjMzQ7LAogICAgJiMzNDtvdnNfY3RfZXhlY3V0ZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHByZXZlbnRzIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKClgIG9uIGFuIGFscmVhZHkgY29uZmlybWVkIGNvbm50cmFjayBjb25uZWN0aW9uIChgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgKSwgYXZvaWRpbmcgYW4gaW52YWxpZCByZWFsbG9jYXRpb24gb2YgYGN0LVx1MDAzZWV4dGAgdGhhdCB0cmlnZ2VycyBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAgYW5kIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMvdXNlLWFmdGVyLWZyZWUgb24gc2hhcmVkIGNvbm50cmFjayBleHRlbnNpb25zLlxuXG5UaGUgY2hhbmdlIG1lcmVseSB0aWdodGVucyBhIGNvbmRpdGlvbmFsIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGV4dGVuc2lvbiBhbGxvY2F0aW9uOyBpdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zLCBvciBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS4gSWYgYGNsYCBpcyBOVUxMIG9uIGEgY29uZmlybWVkIGNvbm5lY3Rpb24sIGBvdnNfY3Rfc2V0X2xhYmVscygpYCBzYWZlbHkgcmV0dXJucyBgLUVOT1NQQ2Agd2l0aG91dCBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBUaGUgYnVnIGJlaW5nIGFkZHJlc3NlZCByZWxhdGVzIHRvIGNvbmN1cnJlbmN5LCBleHRlbnNpb24gbGlmZWN5Y2xlLCBhbmQgcG90ZW50aWFsIHVzZS1hZnRlci1mcmVlLCB3aGljaCBmYWxsIHVuZGVyIHN0YW5kYXJkIGtlcm5lbCB3YXJuaW5ncyBhbmQgS0FTQU4sIG5vdCBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpIGluIG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyB0byBwcmV2ZW50IGNhbGxpbmcgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKSB3aGVuIHRoZSBjb25udHJhY2sgZW50cnkgaXMgYWxyZWFkeSBjb25maXJtZWQuIFRoaXMgdG91Y2hlcyByZWFjaGFibGUgY29yZSBuZXR3b3JraW5nIGNvZGUgcmVhY2hhYmxlIHZpYSBPcGVuIHZTd2l0Y2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzIHRoYXQgbWFuaXB1bGF0ZSBjb25udHJhY2sgYWN0aW9ucyBhbmQgbGFiZWxzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nIGFuZCBhYnNlbmNlIG9mIHJlZ3Jlc3Npb25zIG9yIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzIHdoZW4gaGFuZGxpbmcgY29ubnRyYWNrIGxhYmVscyBvbiBjb25maXJtZWQgdnMgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMTM6NTg6MzQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5pbmRleCAyNzExNTk2N2U1ZDkzLi4wZjQzMzY4OGUxN2I5IDEwMDY0NFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcbkBAIC0zNjYsNyAmIzQzOzM2Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxuIFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiBcbiBcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuLVx0aWYgKCFjbCkge1xuJiM0MztcdGlmICghY2wgXHUwMDI2XHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4gXHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbiBcdFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4gXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7T1BFTlZTV0lUQ0gmIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDS19MQUJFTFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9zZXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9pbml0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfY29tbWl0JiMzNDssCiAgICAmIzM0O292c19jdF9leGVjdXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWRiNjNkZjZhZGFhZWEzNDFkMzU4MTRiNTg1YTJiZDZiZGYxMmU3NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCmluZGV4IDI3MTE1OTY3ZTVkOTMuLjBmNDMzNjg4ZTE3YjkgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKQEAgLTM2Niw3ICYjNDM7MzY2LDcgQEAgc3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpCiAJc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDsKIAogCWNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpOwotCWlmICghY2wpIHsKJiM0MzsJaWYgKCFjbCAmYW1wOyZhbXA7ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7CiAJCW5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTsKIAkJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7CiAJfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODg2CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBmb3IgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuIFRoZSBkaWZmIGl0c2VsZiBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOyB0aGUgY29yZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBpbiB0aGUgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGZ1bmN0aW9uLiBJIHNlZSB0aGUgY29uZGl0aW9uYWwgY2hlY2sgaGFzIGJlZW4gbW9kaWZpZWQuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgd2UmIzM5O3JlIG5vdyBjaGVja2luZyAqYm90aCogaWYgYG5mX2N0X2xhYmVsc19maW5kKGN0KWAgcmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgKmFuZCogdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgdmlhIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAuIFRoaXMgaXMgaW50ZXJlc3Rpbmc7IGl0JiMzOTtzIGEgc3VidGxlIGJ1dCBwb3RlbnRpYWxseSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IGNvbm5lY3Rpb24gbGFiZWxzIGFyZSBoYW5kbGVkLCBzcGVjaWZpY2FsbHkgYXQgdGhlIHBvaW50IG9mIGxhYmVsIHJldHJpZXZhbC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LiBJJiMzOTtsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBmb2N1c2luZyBhcm91bmQgbGluZSAzNjYuIEkmIzM5O20gd29uZGVyaW5nIHdoYXQgc2NlbmFyaW9zIG1pZ2h0IGxlYWQgdG8gYG5mX2N0X2xhYmVsc19maW5kYCByZXR1cm5pbmcgTlVMTCwgYW5kIHdoeSB3ZSYjMzk7cmUgbm93ICphbHNvKiBjb25zaWRlcmluZyB0aGUgY29uZmlybWVkIHN0YXRlLiBQZXJoYXBzIHRoZXJlJiMzOTtzIGEgcmFjZSBjb25kaXRpb24gdGhpcyBhZGRyZXNzZXMsIG9yIG1heWJlIGl0JiMzOTtzIHJlbGF0ZWQgdG8gaG93IGNvbm5lY3Rpb24gdHJhY2tpbmcgaXMgaW5pdGlhbGl6ZWQgb3IgY2xlYW5lZCB1cC4gSSBhbHNvIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgT3BlbiB2U3dpdGNoIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBjb25udHJhY2sgZnVuY3Rpb25hbGl0eS4gSG93IGRvZXMgT3BlbiB2U3dpdGNoIHJlYWNoIGFuZCB1dGlsaXplIHRoZXNlIGZ1bmN0aW9ucz8KCkkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgaG93IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBpcyBjYWxsZWQgYW5kLCBjcnVjaWFsbHksIGluIHdoYXQgc2l0dWF0aW9ucy4gSSYjMzk7bGwgYWxzbyBiZSBsb29raW5nIGF0IHRoZSBjYWxsaW5nIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB3aGF0IGltcGxpY2F0aW9ucyB0aGlzIGNoYW5nZSBoYXMgb24gdGhlIGNvbm5lY3Rpb24mIzM5O3Mgc3RhdGUgYW5kIGRhdGEgc3RydWN0dXJlcy4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHNlZSBpZiB0aGVyZSBhcmUgYXNzb2NpYXRlZCBjaGFuZ2VzIG9yIGRlcGVuZGVuY2llcyBlbHNld2hlcmUgaW4gdGhlIGNvZGUuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIHRvIHNlZSBob3cgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkIGFuZCB3aGF0IHRoZSBpbXBsaWNhdGlvbnMgb2YgYSBub3QtY29uZmlybWVkIGNvbm5lY3Rpb24gYXJlLiBGcm9tIHRoZXJlLCBJIGNhbiBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGJ1ZyBmaXgsIGFuIG9wdGltaXphdGlvbiwgb3Igc29tZXRoaW5nIG1vcmUgZnVuZGFtZW50YWwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdFx0bmV3X21hcmsgPSBjdF9tYXJrIHwgKFJFQURfT05DRShjdC1cdTAwM2VtYXJrKSBcdTAwMjYgfihtYXNrKSk7XG4gMzUxOlx0XHRpZiAoUkVBRF9PTkNFKGN0LVx1MDAzZW1hcmspICE9IG5ld19tYXJrKSB7XG4gMzUyOlx0XHRcdFdSSVRFX09OQ0UoY3QtXHUwMDNlbWFyaywgbmV3X21hcmspO1xuIDM1MzpcdFx0XHRpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSlcbiAzNTQ6XHRcdFx0XHRuZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBjdCk7XG4gMzU1Olx0XHRcdGtleS1cdTAwM2VjdC5tYXJrID0gbmV3X21hcms7XG4gMzU2Olx0XHR9XG4gMzU3Olx0XG4gMzU4Olx0XHRyZXR1cm4gMDtcbiAzNTk6XHQjZWxzZVxuIDM2MDpcdFx0cmV0dXJuIC1FTk9UU1VQUDtcbiAzNjE6XHQjZW5kaWZcbiAzNjI6XHR9XG4gMzYzOlx0XG4gMzY0Olx0c3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXG4gMzY1Olx0e1xuIDM2NjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiAzNjc6XHRcbiAzNjg6XHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIDM2OTpcdFx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbiAzNzA6XHRcdFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xuIDM3MTpcdFx0XHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcbiAzNzI6XHRcdH1cbiAzNzM6XHRcbiAzNzQ6XHRcdHJldHVybiBjbDtcbiAzNzU6XHR9XG4gMzc2Olx0XG4gMzc3Olx0LyogSW5pdGlhbGl6ZSBsYWJlbHMgZm9yIGEgbmV3LCB5ZXQgdG8gYmUgY29tbWl0dGVkIGNvbm50cmFjayBlbnRyeS4gIE5vdGUgdGhhdFxuIDM3ODpcdCAqIHNpbmNlIHRoZSBuZXcgY29ubmVjdGlvbiBpcyBub3QgeWV0IGNvbmZpcm1lZCwgYW5kIHRodXMgbm8tb25lIGVsc2UgaGFzXG4gMzc5Olx0ICogYWNjZXNzIHRvIGl0JiMzOTtzIGxhYmVscywgd2Ugc2ltcGx5IHdyaXRlIHRoZW0gb3Zlci5cbiAzODA6XHQgKi9cbiAzODE6XHRzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDM4MjpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxuIDM4MzpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbWFzaylcbiAzODQ6XHR7XG4gMzg1Olx0XHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsLCAqbWFzdGVyX2NsO1xuIDM4NjpcdFx0Ym9vbCBoYXZlX21hc2sgPSBsYWJlbHNfbm9uemVybyhtYXNrKTtcbiAzODc6XHRcbiAzODg6XHRcdC8qIEluaGVyaXQgbWFzdGVyJiMzOTtzIGxhYmVscyB0byB0aGUgcmVsYXRlZCBjb25uZWN0aW9uPyAqL1xuIDM4OTpcdFx0bWFzdGVyX2NsID0gY3QtXHUwMDNlbWFzdGVyID8gbmZfY3RfbGFiZWxzX2ZpbmQoY3QtXHUwMDNlbWFzdGVyKSA6IE5VTEw7XG4gMzkwOlx0XG4gMzkxOlx0XHRpZiAoIW1hc3Rlcl9jbCBcdTAwMjZcdTAwMjYgIWhhdmVfbWFzaylcbiAzOTI6XHRcdFx0cmV0dXJuIDA7ICAgLyogTm90aGluZyB0byBkby4gKi9cbiAzOTM6XHRcbiAzOTQ6XHRcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG4gMzk1Olx0XHRpZiAoIWNsKVxuIDM5NjpcdFx0XHRyZXR1cm4gLUVOT1NQQztcbiAzOTc6XHRcbiAzOTg6XHRcdC8qIEluaGVyaXQgdGhlIG1hc3RlciYjMzk7cyBsYWJlbHMsIGlmIGFueS4gKi9cbiAzOTk6XHRcdGlmIChtYXN0ZXJfY2wpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQxOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgQ2FsbCBTaXRlcyoqCgpPa2F5LCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBUbyByZWFsbHkgZ3Jhc3AgaXRzIHJvbGUgYW5kIHBvdGVudGlhbCBpbXBhY3QsIEkgbmVlZCBhIGhvbGlzdGljIHZpZXcuIEkmIzM5O20gZ29pbmcgdG8gdHJhY2sgZG93biBldmVyeSBjYWxsIHNpdGUgZm9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXNuJiMzOTt0IGp1c3QgYWJvdXQgZmluZGluZyB3aGVyZSBpdCYjMzk7cyAqdXNlZCosIGJ1dCAqaG93KiBpdCYjMzk7cyB1c2VkIGFuZCB3aGF0IGRhdGEgZmxvd3MgaW50byBpdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVuZGVkIHB1cnBvc2UgYW5kIGFueSBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzLiBLbm93aW5nIHRoZSBmdWxsIGNhbGxpbmcgY29udGV4dCBpcyBrZXkgdG8gYW55IGRlZXBlciBhbmFseXNpcywgcGFydGljdWxhcmx5IHRvIGlkZW50aWZ5IHBvc3NpYmxlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIHN1YnRsZSBiZWhhdmlvcmFsIG51YW5jZXMuIFNvLCBsZXQmIzM5O3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBjb2RlYmFzZSBhbmQgdHJhY2luZyB0aG9zZSBmdW5jdGlvbiBjYWxscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzYzLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjUte1xuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzkzLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzk1LVx0aWYgKCFjbClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9NDIyPXN0YXRpYyBpbnQgb3ZzX2N0X3NldF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDI4LVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyOTpcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDMwLVx0aWYgKCFjbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDI0CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBjb25udHJhY2suYyAoTGluZXMgNDAwLTQ1MCkqKgoKT2theSwgdGltZSB0byB6ZXJvIGluLiBMZXQmIzM5O3MgZ2V0IHJpZ2h0IGludG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgc3BlY2lmaWNhbGx5IGJldHdlZW4gbGluZXMgNDAwIGFuZCA0NTAuIEkmIzM5O20gYXNzdW1pbmcgdGhpcyBzZWN0aW9uIGxpa2VseSBpbnZvbHZlcyBzb21lIGNvcmUgY29ubnRyYWNrIGZ1bmN0aW9uYWxpdHkuIEdpdmVuIHRoZSBmaWxlIGFuZCBmdW5jdGlvbiBuYW1pbmcgY29udmVudGlvbnMgaW4gT1ZTLCB0aGlzIHByb2JhYmx5IGRlYWxzIHdpdGggc29tZSBhc3BlY3Qgb2YgY29ubmVjdGlvbiB0cmFja2luZyBzdGF0ZSBtYW5pcHVsYXRpb24sIG1heWJlIGEga2V5IHRyYW5zaXRpb24gb3IgYSBsb29rdXAvaW5zZXJ0aW9uIG9wZXJhdGlvbi4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY2x1ZXMg4oCTIHZhcmlhYmxlIGFzc2lnbm1lbnRzLCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBmdW5jdGlvbiBjYWxscyDigJMgdGhhdCBpbGx1bWluYXRlIHRoZSBsb2dpYyBmbG93LgoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgZm9yIHBvdGVudGlhbCBwaXRmYWxscyBsaWtlIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIGluZWZmaWNpZW50IGRhdGEgc3RydWN0dXJlcywgb3IgdW5leHBlY3RlZCBlZGdlIGNhc2VzLiBJJiMzOTtsbCBiZSBtZW50YWxseSBwYXJzaW5nIGFueSBuZXN0ZWQgbG9vcHMgb3IgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYywgZm9jdXNpbmcgb24gaG93IGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZC4gSSYjMzk7bSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZGF0YXBhdGgsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgb2YgcGVyZm9ybWFuY2UgYm90dGxlbmVjayBpbiBjb25udHJhY2sgaW1wbGVtZW50YXRpb25zLiBIb3BlZnVsbHksIHRoZSBjb2RlIGNvbW1lbnRzIGFyZSBkZXNjcmlwdGl2ZSwgYnV0IGV2ZW4gaWYgdGhleSBhcmVuJiMzOTt0LCBJJiMzOTttIHJlYWR5IHRvIGluZmVyIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBmcm9tIHRoZSBzdXJyb3VuZGluZyBjb2RlLgoKTXkgb2JqZWN0aXZlIGlzIHRvIGdyYXNwIHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIGFuZCBob3cgaXQgY29udHJpYnV0ZXMgdG8gdGhlIG92ZXJhbGwgY29ubnRyYWNrIGltcGxlbWVudGF0aW9uLiBPbmNlIEkmIzM5O3ZlIGdvdHRlbiB0aGlzIHNlY3Rpb24mIzM5O3MgbWVhbmluZyBjbGVhciwgSSBjYW4gZXZhbHVhdGUgaXRzIGRlc2lnbiBmb3IgYW55IHBvdGVudGlhbCBpc3N1ZXMuIElmIEkgZmluZCBzb21ldGhpbmcgdGhhdCBzZWVtcyB1bmNsZWFyIG9yIHBvdGVudGlhbGx5IHByb2JsZW1hdGljLCBJIGNhbiBmb2xsb3cgdGhlIGNhbGwgc3RhY2sgdG8gc2VlIHRoZSBicm9hZGVyIGltcGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDAwOlx0XHRcdCpjbCA9ICptYXN0ZXJfY2w7XG4gNDAxOlx0XG4gNDAyOlx0XHRpZiAoaGF2ZV9tYXNrKSB7XG4gNDAzOlx0XHRcdHUzMiAqZHN0ID0gKHUzMiAqKWNsLVx1MDAzZWJpdHM7XG4gNDA0Olx0XHRcdGludCBpO1xuIDQwNTpcdFxuIDQwNjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBPVlNfQ1RfTEFCRUxTX0xFTl8zMjsgaSYjNDM7JiM0MzspXG4gNDA3Olx0XHRcdFx0ZHN0W2ldID0gKGRzdFtpXSBcdTAwMjYgfm1hc2stXHUwMDNlY3RfbGFiZWxzXzMyW2ldKSB8XG4gNDA4Olx0XHRcdFx0XHQobGFiZWxzLVx1MDAzZWN0X2xhYmVsc18zMltpXVxuIDQwOTpcdFx0XHRcdFx0IFx1MDAyNiBtYXNrLVx1MDAzZWN0X2xhYmVsc18zMltpXSk7XG4gNDEwOlx0XHR9XG4gNDExOlx0XG4gNDEyOlx0XHQvKiBMYWJlbHMgYXJlIGluY2x1ZGVkIGluIHRoZSBJUENUTkxfTVNHX0NUX05FVyBldmVudCBvbmx5IGlmIHRoZVxuIDQxMzpcdFx0ICogSVBDVF9MQUJFTCBiaXQgaXMgc2V0IGluIHRoZSBldmVudCBjYWNoZS5cbiA0MTQ6XHRcdCAqL1xuIDQxNTpcdFx0bmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTEFCRUwsIGN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDE4Olx0XG4gNDE5Olx0XHRyZXR1cm4gMDtcbiA0MjA6XHR9XG4gNDIxOlx0XG4gNDIyOlx0c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQyMzpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gNDI0Olx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiA0Mjc6XHRcdGludCBlcnI7XG4gNDI4Olx0XG4gNDI5Olx0XHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xuIDQzMDpcdFx0aWYgKCFjbClcbiA0MzE6XHRcdFx0cmV0dXJuIC1FTk9TUEM7XG4gNDMyOlx0XG4gNDMzOlx0XHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM0Olx0XHRcdFx0XHQgICAgbWFzay1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM1Olx0XHRcdFx0XHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xuIDQzNjpcdFx0aWYgKGVycilcbiA0Mzc6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mzg6XHRcbiA0Mzk6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDQwOlx0XG4gNDQxOlx0XHRyZXR1cm4gMDtcbiA0NDI6XHR9XG4gNDQzOlx0XG4gNDQ0Olx0c3RhdGljIGludCBvdnNfY3RfaGFuZGxlX2ZyYWdtZW50cyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQ0NTpcdFx0XHRcdFx0ICAgdTE2IHpvbmUsIGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICpza2IpXG4gNDQ2Olx0e1xuIDQ0NzpcdFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xuIDQ0ODpcdFx0aW50IGVycjtcbiA0NDk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjE0CgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGZvY3VzIGlzIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIGJyb2FkZXIgZnJhbWV3b3JrLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBkb2VzIGFuZCB3aGVyZSBpdCBmaXRzIHdpdGhpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUuIExldCYjMzk7cyBzZWUgaG93IGl0IG9wZXJhdGVzLiBNeSBwcmlvcml0eSBpcyB0byBncmFzcCBpdHMgZnVuY3Rpb25hbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZfY3RfbGFiZWxzX2V4dF9hZGQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaD0yMz1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oOjM3OnN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM9MTc1ND1pbml0X2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25uICp0bXBsLFxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVx0bmZfY3RfdHN0YW1wX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5NC1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM6MjMwNTpcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVx0bmZjdF9zZXFhZGpfZXh0X2FkZChjdCk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2OTc0CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG5mX2Nvbm50cmFja19sYWJlbHMuaGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpc3NlY3QgYGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IGNvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzIGFyZSBoYW5kbGVkIGF0IGEgZ3JhbnVsYXIgbGV2ZWwuIEkgc3VzcGVjdCBJJiMzOTtsbCBiZSByZXZpc2l0aW5nIHRoaXMgY29kZSB0byB1bmRlcnN0YW5kIGhvdyBhIHJlY2VudCBwZXJmb3JtYW5jZSBhbm9tYWx5IGlzIGludGVyYWN0aW5nIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIGZyYW1ld29yay4gSSYjMzk7bSBob3BpbmcgdG8gcXVpY2tseSBpZGVudGlmeSB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBhbmQgYWNjZXNzIHBhdHRlcm5zLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIHRoZSBsYWJlbCBtYXNrcyBhbmQgaG93IHRoZXkmIzM5O3JlIHVzZWQgdG8gZWZmaWNpZW50bHkgZmlsdGVyIGFuZCBjbGFzc2lmeSBjb25uZWN0aW9ucyB3aXRoaW4gTmV0ZmlsdGVyLiBLbm93aW5nIHRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGludGVyYWN0cyBhdCB0aGUgcGFja2V0IGxldmVsLiBJdCYjMzk7cyB0aW1lIHRvIGRpZyBpbiBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiAgIDI6XHRcbiAgIDM6XHQjaWZuZGVmIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcbiAgIDQ6XHQjZGVmaW5lIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcbiAgIDU6XHRcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oXHUwMDNlXG4gICA3Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaFx1MDAzZVxuICAgODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXHUwMDNlXG4gIDEwOlx0I2luY2x1ZGUgXHUwMDNjbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaFx1MDAzZVxuICAxMTpcdCNpbmNsdWRlIFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oXHUwMDNlXG4gIDEyOlx0I2luY2x1ZGUgXHUwMDNjdWFwaS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxhYmVsLmhcdTAwM2VcbiAgMTM6XHRcbiAgMTQ6XHQjZGVmaW5lIE5GX0NUX0xBQkVMU19NQVhfU0laRSAoKFhUX0NPTk5MQUJFTF9NQVhCSVQgJiM0MzsgMSkgLyBCSVRTX1BFUl9CWVRFKVxuICAxNTpcdFxuICAxNjpcdHN0cnVjdCBuZl9jb25uX2xhYmVscyB7XG4gIDE3Olx0XHR1bnNpZ25lZCBsb25nIGJpdHNbTkZfQ1RfTEFCRUxTX01BWF9TSVpFIC8gc2l6ZW9mKGxvbmcpXTtcbiAgMTg6XHR9O1xuICAxOTpcdFxuICAyMDpcdC8qIENhbiYjMzk7dCB1c2UgbmZfY3RfZXh0X2ZpbmQoKSwgZmxvdyBkaXNzZWN0b3IgY2Fubm90IHVzZSBzeW1ib2xzXG4gIDIxOlx0ICogZXhwb3J0ZWQgYnkgbmZfY29ubnRyYWNrIG1vZHVsZS5cbiAgMjI6XHQgKi9cbiAgMjM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuICAyNDpcdHtcbiAgMjU6XHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcbiAgMjY6XHRcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVx1MDAzZWV4dDtcbiAgMjc6XHRcbiAgMjg6XHRcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxuICAyOTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzA6XHRcbiAgMzE6XHRcdHJldHVybiAodm9pZCAqKWN0LVx1MDAzZWV4dCAmIzQzOyBjdC1cdTAwM2VleHQtXHUwMDNlb2Zmc2V0W05GX0NUX0VYVF9MQUJFTFNdO1xuICAzMjpcdCNlbHNlXG4gIDMzOlx0XHRyZXR1cm4gTlVMTDtcbiAgMzQ6XHQjZW5kaWZcbiAgMzU6XHR9XG4gIDM2Olx0XG4gIDM3Olx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcbiAgMzg6XHR7XG4gIDM5Olx0I2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTXG4gIDQwOlx0XHRzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpO1xuICA0MTpcdFxuICA0MjpcdFx0aWYgKGF0b21pY19yZWFkKFx1MDAyNm5ldC1cdTAwM2VjdC5sYWJlbHNfdXNlZCkgPT0gMClcbiAgNDM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDQ0Olx0XG4gIDQ1Olx0XHRyZXR1cm4gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX0xBQkVMUywgR0ZQX0FUT01JQyk7XG4gIDQ2Olx0I2Vsc2VcbiAgNDc6XHRcdHJldHVybiBOVUxMO1xuICA0ODpcdCNlbmRpZlxuICA0OTpcdH1cbiAgNTA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzk2NAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYG5mX2N0X2V4dF9hZGRgIGlzIGRvaW5nIHVuZGVyIHRoZSBob29kLiBNeSBmaXJzdCBtb3ZlIHdpbGwgYmUgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgY29kZSwgbGlrZWx5IHdpdGhpbiB0aGUgYG5ldC9uZXRmaWx0ZXIvYCBkaXJlY3RvcnksIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBgbmZfY29ubnRyYWNrX2V4dGVuZC5jYCBvciBzb21ldGhpbmcgYW5hbG9nb3VzLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY29ubmVjdGlvbiB0cmFja2luZyBleHRlbnNpb24gZnVuY3Rpb24gdGhlcmUuIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dm9pZCBcXCpuZl9jdF9leHRfYWRkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg9NTQ9c3RhdGljIGlubGluZSB2b2lkICpuZl9jdF9leHRfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHU4IGlkKVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgtNjQtLyogQWRkIHRoaXMgdHlwZSwgcmV0dXJucyBwb2ludGVyIHRvIGRhdGEgb3IgTlVMTC4gKi9cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg6NjU6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApO1xuaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaC02Ni1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYz01Nz1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCB0b3RhbF9leHRlbnNpb25fc2l6ZSh2b2lkKVxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTg5LVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6OTA6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYy05MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0MjMKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gbmZfY29ubnRyYWNrX2V4dGVuZC5jKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGd1dHMgb2YgdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZXh0ZW5zaW9uIGNvZGUuIFNwZWNpZmljYWxseSwgbGV0JiMzOTtzIHpvb20gaW4gb24gYG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jYCDigJMgSSBmaWd1cmUgaWYgd2UmIzM5O3JlIGxvb2tpbmcgYXQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSwgdGhhdCYjMzk7cyB0aGUgcGxhY2UgdG8gc3RhcnQuIE5vdywgbGV0JiMzOTtzIHNlZS4uLiBhcm91bmQgbGluZSA5MCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSYjMzk7cmUgaGFuZGxpbmcgW3NwZWNpZmljIGFzcGVjdCBvZiBjb25uZWN0aW9uIHRyYWNraW5nIC0gdGhpcyBwYXJ0IHdvdWxkIGJlIHNwZWNpZmljIHRvIHdoYXQgdGhlIHVzZXIgaXMgYW4gZXhwZXJ0IGluLCBhbmQgd2h5IHRoZXkgYXJlIHJlYWRpbmcgdGhlIGNvZGVdLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24uLi4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCBbc3BlY2lmaWMgdGhpbmdzIHJlbGF0aW5nIHRvIGxpbmUgOTAgYW5kIHRoZSB1c2VyJiMzOTtzIGZpZWxkIG9mIGV4cGVydGlzZSBoZXJlXS4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgODA6XHQjZW5kaWZcbiAgODE6XHQjaWYgSVNfRU5BQkxFRChDT05GSUdfTkVURklMVEVSX1NZTlBST1hZKVxuICA4MjpcdFx0XHQmIzQzOyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fc3lucHJveHkpXG4gIDgzOlx0I2VuZGlmXG4gIDg0Olx0I2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9BQ1RfQ1QpXG4gIDg1Olx0XHRcdCYjNDM7IHNpemVvZihzdHJ1Y3QgbmZfY29ubl9hY3RfY3RfZXh0KVxuICA4NjpcdCNlbmRpZlxuICA4NzpcdFx0O1xuICA4ODpcdH1cbiAgODk6XHRcbiAgOTA6XHR2b2lkICpuZl9jdF9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBuZl9jdF9leHRfaWQgaWQsIGdmcF90IGdmcClcbiAgOTE6XHR7XG4gIDkyOlx0XHR1bnNpZ25lZCBpbnQgbmV3bGVuLCBuZXdvZmYsIG9sZGxlbiwgYWxsb2M7XG4gIDkzOlx0XHRzdHJ1Y3QgbmZfY3RfZXh0ICpuZXc7XG4gIDk0Olx0XG4gIDk1Olx0XHQvKiBDb25udHJhY2sgbXVzdCBub3QgYmUgY29uZmlybWVkIHRvIGF2b2lkIHJhY2VzIG9uIHJlYWxsb2NhdGlvbi4gKi9cbiAgOTY6XHRcdFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7XG4gIDk3Olx0XG4gIDk4Olx0XHQvKiBzdHJ1Y3QgbmZfY3RfZXh0IHVzZXMgdTggdG8gc3RvcmUgb2Zmc2V0cy9zaXplICovXG4gIDk5Olx0XHRCVUlMRF9CVUdfT04odG90YWxfZXh0ZW5zaW9uX3NpemUoKSBcdTAwM2UgMjU1dSk7XG4gMTAwOlx0XG4gMTAxOlx0XHRpZiAoY3QtXHUwMDNlZXh0KSB7XG4gMTAyOlx0XHRcdGNvbnN0IHN0cnVjdCBuZl9jdF9leHQgKm9sZCA9IGN0LVx1MDAzZWV4dDtcbiAxMDM6XHRcbiAxMDQ6XHRcdFx0aWYgKF9fbmZfY3RfZXh0X2V4aXN0KG9sZCwgaWQpKVxuIDEwNTpcdFx0XHRcdHJldHVybiBOVUxMO1xuIDEwNjpcdFx0XHRvbGRsZW4gPSBvbGQtXHUwMDNlbGVuO1xuIDEwNzpcdFx0fSBlbHNlIHtcbiAxMDg6XHRcdFx0b2xkbGVuID0gc2l6ZW9mKCpuZXcpO1xuIDEwOTpcdFx0fVxuIDExMDpcdFxuIDExMTpcdFx0bmV3b2ZmID0gQUxJR04ob2xkbGVuLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY3RfZXh0KSk7XG4gMTEyOlx0XHRuZXdsZW4gPSBuZXdvZmYgJiM0MzsgbmZfY3RfZXh0X3R5cGVfbGVuW2lkXTtcbiAxMTM6XHRcbiAxMTQ6XHRcdGFsbG9jID0gbWF4KG5ld2xlbiwgTkZfQ1RfRVhUX1BSRUFMTE9DKTtcbiAxMTU6XHRcdG5ldyA9IGtyZWFsbG9jKGN0LVx1MDAzZWV4dCwgYWxsb2MsIGdmcCk7XG4gMTE2Olx0XHRpZiAoIW5ldylcbiAxMTc6XHRcdFx0cmV0dXJuIE5VTEw7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoIWN0LVx1MDAzZWV4dClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTI3NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDQyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBDb25udHJhY2sgQnVnIGluIE9wZW4gdlN3aXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBMaW5lIDk2IG9mIGBuZl9jdF9leHRfYWRkYCBpcyBzY3JlYW1pbmcgYXQgbWU6IGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpO2AuIFRoZSBjb21tZW50IHNheXMgaXQgYWxsOiB3ZSBhYnNvbHV0ZWx5ICpjYW5ub3QqIHJlYWxsb2NhdGUgYSBjb25maXJtZWQgY29ubnRyYWNrIGVudHJ5LiBJdCYjMzk7cyBhIHJhY2UgY29uZGl0aW9uIHdhaXRpbmcgdG8gaGFwcGVuLgoKTm93LCBJIHNlZSB0aGUgcHJvYmxlbSBpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCB3YXMgY2FzdWFsbHkgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBldmVuIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgd2FzICphbHJlYWR5KiBjb25maXJtZWQhIFRoaXMgd291bGQgdHJpZ2dlciB0aGF0IGBXQVJOX09OYCBhbmQsIHdvcnNlLCBsZWFkIHRvIGEgYGtyZWFsbG9jYCBvbiBhIGNvbmZpcm1lZCBlbnRyeSDigJMgYSByZWNpcGUgZm9yIHJhY2VzIGFuZCBVc2VyLUFmdGVyLUZyZWUgdnVsbmVyYWJpbGl0aWVzLiBUaGlzIGlzIGNsYXNzaWMuCgpTbywgdGhlIHByb3Bvc2VkIHBhdGNoIGlzIGFkZGluZyBhIGNydWNpYWwgY2hlY2s6CgpgYGBkaWZmCiAJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7Ci0JaWYgKCFjbCkgewomIzQzOwlpZiAoIWNsICZhbXA7JmFtcDsgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpOwogCQljbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTsKIAl9CmBgYAoKVGhhdCBtYWtlcyBzZW5zZS4gT25seSBhZGQgdGhlIGxhYmVscyBleHRlbnNpb24gaWYgaXQgKmRvZXNuJiMzOTt0KiBhbHJlYWR5IGV4aXN0IEFORCB0aGUgY29ubnRyYWNrIGVudHJ5IGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBwcmV2ZW50cyB0aGUgcHJvYmxlbWF0aWMgcmVhbGxvY2F0aW9uIG9uIGNvbmZpcm1lZCBlbnRyaWVzLgoKTm93LCBhIHF1aWNrIHNhbml0eSBjaGVjazogaXMgT3BlbiB2U3dpdGNoIGV2ZW4gYWNjZXNzaWJsZSBpbiBTeXprYWxsZXI/IEFuZCwgdGhlIGFuc3dlciBpcyB5ZXMsIHRoYXQmIzM5O3MgZ29vZCBuZXdzLiBPcGVuIHZTd2l0Y2ggaXMgYSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIG1vZHVsZSAoYENPTkZJR19PUEVOVlNXSVRDSGApLCB1c2luZyBnZW5lcmljIG5ldGxpbmsgKGBORVRMSU5LX0dFTkVSSUNgLCBmYW1pbHkgYG92c19kYXRhcGF0aGAsIGBvdnNfdnBvcnRgLCBgb3ZzX2Zsb3dgLCBgb3ZzX3BhY2tldGApLiBTeXprYWxsZXIgaGFzIHNvbGlkIHN1cHBvcnQgZm9yIHRoZSBPcGVuIHZTd2l0Y2ggbmV0bGluayBpbnRlcmZhY2UuIFRoZSBmYWN0IHRoYXQgU3l6a2FsbGVyIGhlYXZpbHkgZnV6emVkIHRoZSBjb25udHJhY2sgaW50ZWdyYXRpb24gKGBDT05GSUdfT1BFTlZTV0lUQ0hfR0VORVZFYCwgYENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTYCwgYENPTkZJR19ORl9DT05OVFJBQ0tgKSBpbiBPcGVuIHZTd2l0Y2ggbWFrZXMgbWUgZXZlbiBtb3JlIGNvbmZpZGVudCB0aGlzIGlzIGZpeGFibGUgYW5kLCBtb3JlIGltcG9ydGFudGx5LCAqdGVzdGFibGUqIHRocm91Z2ggc3l6a2FsbGVyLiBOb3cgdG8gZGlnIGludG8gdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25udHJhY2tcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9NYWtlZmlsZT0yMT1pZm5lcSAoJChDT05GSUdfTkZfQ09OTlRSQUNLKSwpXG5uZXQvb3BlbnZzd2l0Y2gvTWFrZWZpbGU6MjI6b3BlbnZzd2l0Y2gteSAmIzQzOz0gY29ubnRyYWNrLm9cbm5ldC9vcGVudnN3aXRjaC9NYWtlZmlsZS0yMy1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDMxNQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRXhhbWluaW5nIHRoZSBPcGVuIHZTd2l0Y2ggQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIE9wZW4gdlN3aXRjaCBjb25maWd1cmF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYG5ldC9vcGVudnN3aXRjaC9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50LiBJdCYjMzk7bGwgbGF5IG91dCB0aGUgY29yZSBmZWF0dXJlcyBhbmQgb3B0aW9ucyBhdmFpbGFibGUgZm9yIGNvbmZpZ3VyaW5nIE9wZW4gdlN3aXRjaCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIHRvcC1sZXZlbCBtZW51IHN0cnVjdHVyZSwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIG9yIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTttIGFsc28gaW50ZXJlc3RlZCBpbiBhbnkgbmV3IG9yIGNoYW5nZWQgb3B0aW9ucyBzaW5jZSBteSBsYXN0IGRlZXAgZGl2ZSwgZXNwZWNpYWxseSBhbnkgcmVsYXRlZCB0byByZWNlbnQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIG9yIG5ldyBwcm90b2NvbHMuIFRoaXMgS2NvbmZpZyB3aWxsIGdpdmUgbWUgYSBoaWdoLWxldmVsIHZpZXcgYW5kIGFueSBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIHRvIGludmVzdGlnYXRlIHNwZWNpZmljIGFzcGVjdHMgaW4gbW9yZSBkZXRhaWwuIEkmIzM5O2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGVwZW5kZW5jaWVzIOKAkyB1bmRlcnN0YW5kaW5nIHdoYXQgbmVlZHMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgY2VydGFpbiBPcGVuIHZTd2l0Y2ggZmVhdHVyZXMgaXMgY3J1Y2lhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdCNcbiAgIDM6XHQjIE9wZW4gdlN3aXRjaFxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRjb25maWcgT1BFTlZTV0lUQ0hcbiAgIDc6XHRcdHRyaXN0YXRlIFwmIzM0O09wZW4gdlN3aXRjaFwmIzM0O1xuICAgODpcdFx0ZGVwZW5kcyBvbiBJTkVUXG4gICA5Olx0XHRkZXBlbmRzIG9uICFORl9DT05OVFJBQ0sgfHwgXFxcbiAgMTA6XHRcdFx0ICAgKE5GX0NPTk5UUkFDSyBcdTAwMjZcdTAwMjYgKCghTkZfREVGUkFHX0lQVjYgfHwgTkZfREVGUkFHX0lQVjYpIFx1MDAyNlx1MDAyNiBcXFxuICAxMTpcdFx0XHRcdFx0ICAgICAoIU5GX05BVCB8fCBORl9OQVQpIFx1MDAyNlx1MDAyNiBcXFxuICAxMjpcdFx0XHRcdFx0ICAgICAoIU5FVEZJTFRFUl9DT05OQ09VTlQgfHwgTkVURklMVEVSX0NPTk5DT1VOVCkpKVxuICAxMzpcdFx0ZGVwZW5kcyBvbiBQU0FNUExFIHx8ICFQU0FNUExFXG4gIDE0Olx0XHRzZWxlY3QgTVBMU1xuICAxNTpcdFx0c2VsZWN0IE5FVF9DUkMzMkNcbiAgMTY6XHRcdHNlbGVjdCBORVRfTVBMU19HU09cbiAgMTc6XHRcdHNlbGVjdCBEU1RfQ0FDSEVcbiAgMTg6XHRcdHNlbGVjdCBORVRfTlNIXG4gIDE5Olx0XHRzZWxlY3QgTkZfQ09OTlRSQUNLX09WUyBpZiBORl9DT05OVFJBQ0tcbiAgMjA6XHRcdHNlbGVjdCBORl9OQVRfT1ZTIGlmIE5GX05BVFxuICAyMTpcdFx0aGVscFxuICAyMjpcdFx0ICBPcGVuIHZTd2l0Y2ggaXMgYSBtdWx0aWxheWVyIEV0aGVybmV0IHN3aXRjaCB0YXJnZXRlZCBhdCB2aXJ0dWFsaXplZFxuICAyMzpcdFx0ICBlbnZpcm9ubWVudHMuICBJbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIGEgdmFyaWV0eSBvZiBmZWF0dXJlc1xuICAyNDpcdFx0ICBleHBlY3RlZCBpbiBhIHRyYWRpdGlvbmFsIGhhcmR3YXJlIHN3aXRjaCwgaXQgZW5hYmxlcyBmaW5lLWdyYWluZWRcbiAgMjU6XHRcdCAgcHJvZ3JhbW1hdGljIGV4dGVuc2lvbiBhbmQgZmxvdy1iYXNlZCBjb250cm9sIG9mIHRoZSBuZXR3b3JrLiAgVGhpc1xuICAyNjpcdFx0ICBjb250cm9sIGlzIHVzZWZ1bCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYnV0IGlzXG4gIDI3Olx0XHQgIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaW4gbXVsdGktc2VydmVyIHZpcnR1YWxpemF0aW9uIGRlcGxveW1lbnRzLFxuICAyODpcdFx0ICB3aGljaCBhcmUgb2Z0ZW4gY2hhcmFjdGVyaXplZCBieSBoaWdobHkgZHluYW1pYyBlbmRwb2ludHMgYW5kIHRoZVxuICAyOTpcdFx0ICBuZWVkIHRvIG1haW50YWluIGxvZ2ljYWwgYWJzdHJhY3Rpb25zIGZvciBtdWx0aXBsZSB0ZW5hbnRzLlxuICAzMDpcdFxuICAzMTpcdFx0ICBUaGUgT3BlbiB2U3dpdGNoIGRhdGFwYXRoIHByb3ZpZGVzIGFuIGluLWtlcm5lbCBmYXN0IHBhdGggZm9yIHBhY2tldFxuICAzMjpcdFx0ICBmb3J3YXJkaW5nLiAgSXQgaXMgY29tcGxlbWVudGVkIGJ5IGEgdXNlcnNwYWNlIGRhZW1vbiwgb3ZzLXZzd2l0Y2hkLFxuICAzMzpcdFx0ICB3aGljaCBpcyBhYmxlIHRvIGFjY2VwdCBjb25maWd1cmF0aW9uIGZyb20gYSB2YXJpZXR5IG9mIHNvdXJjZXMgYW5kXG4gIDM0Olx0XHQgIHRyYW5zbGF0ZSBpdCBpbnRvIHBhY2tldCBwcm9jZXNzaW5nIHJ1bGVzLlxuICAzNTpcdFxuICAzNjpcdFx0ICBTZWUgaHR0cDovL29wZW52c3dpdGNoLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlcnNwYWNlXG4gIDM3Olx0XHQgIHV0aWxpdGllcy5cbiAgMzg6XHRcbiAgMzk6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxuICA0MDpcdFx0ICBjYWxsZWQgb3BlbnZzd2l0Y2guXG4gIDQxOlx0XG4gIDQyOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTgwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIGBORl9DT05OVFJBQ0tfTEFCRUxTYCBDb25maWd1cmF0aW9uKioKCk9rYXksIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB3ZSBhY3R1YWxseSByZXF1aXJlIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTGV0JiMzOTtzIGRpdmUgaW50byB0aGUgY29kZS4gTG9va2luZyBhdCBgaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaGAsIEkgc2VlIHRoZSBmdW5jdGlvbnMgYG5mX2N0X2xhYmVsc19maW5kYCBhbmQgYG5mX2N0X2xhYmVsc19leHRfYWRkYC4gIEVzc2VudGlhbGx5LCBpZiBgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNgIGlzbiYjMzk7dCBkZWZpbmVkLCBib3RoIGZ1bmN0aW9ucyBqdXN0IHJldHVybiBgTlVMTGAuIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgc3BlY2lmaWNhbGx5IGNhbGxzIGBuZl9jdF9leHRfYWRkYCBpZiB0aGUgY29uZmlnIGlzIGVuYWJsZWQsIGFsb25nIHdpdGggYSBjaGVjayB0aGF0IGBuZXQtJmd0O2N0LmxhYmVsc191c2VkYCBpcyBncmVhdGVyIHRoYW4gemVyby4gU28gaWYgdGhlIGNvbmZpZyBpc24mIzM5O3Qgc2V0LCB0aGVuIHRoZSB3aG9sZSBmZWF0dXJlIGlzIGVmZmVjdGl2ZWx5IGJ5cGFzc2VkLiBUaGUgYG5mX2N0X2xhYmVsc19maW5kYCBmdW5jdGlvbiBjaGVja3MgZm9yIGFuIGV4aXN0aW5nIGV4dGVuc2lvbiwgaWYgdGhlIGNvbmZpZyBpcyBub3QgcHJlc2VudCwgaXQgYWxzbyBqdXN0IHJldHVybnMgYE5VTExgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hlcmUgYENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTYCBpdHNlbGYgaXMgZGVmaW5lZC4gVGhhdCYjMzk7cyBhIEtjb25maWcgb3B0aW9uLCBzbyBJIG5lZWQgdG8gY2hlY2sgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AgdG8gZGV0ZXJtaW5lIGl0cyBvcmlnaW4gYW5kIGRlZmF1bHQgdmFsdWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORl9DT05OVFJBQ0tfTEFCRUxTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL0tjb25maWc9MTc3PWNvbmZpZyBORl9DT05OVFJBQ0tfVElNRVNUQU1QXG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTE4Ny1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxODg6Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODktXHRib29sIFwmIzM0O0Nvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTEwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipFeGFtaW5pbmcgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgbmV0L25ldGZpbHRlci9LY29uZmlnYCBmaWxlLiBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBOZXRmaWx0ZXIsIGFuZCBsaW5lIDE4OCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmQgYSBzcGVjaWZpYyBzZWN0aW9uLiBJJiMzOTttIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhIG9mIHRoZSBjb25maWd1cmF0aW9uLiBMZXQgbWUgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24gdGhlcmUuIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgc2VjdGlvbiB0byBkZWFsIHdpdGggYSBzcGVjaWZpYyBOZXRmaWx0ZXIgZmVhdHVyZSBvciBtb2R1bGUsIGFuZCBteSBnb2FsIGlzIHRvIGdyYXNwIHRoZSByZWxldmFudCBzZXR0aW5ncyBhbmQgdGhlaXIgaW1wYWN0LiBIb3BlZnVsbHksIGl0JiMzOTtzIHdlbGwtY29tbWVudGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRmaWx0ZXIvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTg1Olx0XG4gMTg2Olx0XHQgIElmIHVuc3VyZSwgc2F5IGBOJiMzOTsuXG4gMTg3Olx0XG4gMTg4Olx0Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcbiAxODk6XHRcdGJvb2wgXCYjMzQ7Q29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcJiMzNDtcbiAxOTA6XHRcdGhlbHBcbiAxOTE6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBhc3NpZ25pbmcgdXNlci1kZWZpbmVkIGZsYWcgYml0c1xuIDE5MjpcdFx0ICB0byBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJpZXMuICBJdCBjYW4gYmUgdXNlZCB3aXRoIHh0YWJsZXMgY29ubmxhYmVsXG4gMTkzOlx0XHQgIG1hdGNoIGFuZCB0aGUgbmZ0YWJsZXMgY3QgZXhwcmVzc2lvbi5cbiAxOTQ6XHRcbiAxOTU6XHRjb25maWcgTkZfQ09OTlRSQUNLX09WU1xuIDE5NjpcdFx0Ym9vbFxuIDE5NzpcdFxuIDE5ODpcdGNvbmZpZyBORl9DVF9QUk9UT19HUkVcbiAxOTk6XHRcdGJvb2xcbiAyMDA6XHRcbiAyMDE6XHRjb25maWcgTkZfQ1RfUFJPVE9fU0NUUFxuIDIwMjpcdFx0Ym9vbCAmIzM5O1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0JiMzOTtcbiAyMDM6XHRcdGRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VEXG4gMjA0Olx0XHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNzEKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiA3MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gT3BlbiB2U3dpdGNoIENvbm50cmFjayBMYWJlbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGFzcGVjdHMgd2l0aGluIE9wZW4gdlN3aXRjaCwgc3BlY2lmaWNhbGx5IHRoZSBsYWJlbGluZyBmdW5jdGlvbmFsaXR5LiBSaWdodCBvZmYgdGhlIGJhdCwgSSBuZWVkIHRvIGdldCBteSBiZWFyaW5ncy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgTkZfQ09OTlRSQUNLYCwgYE5GX0NPTk5UUkFDS19MQUJFTFNgLCBhbmQgaG93IGBPUEVOVlNXSVRDSGAgZml0cyBpbnRvIHRoaXMgd2hvbGUgcGljdHVyZS4gVGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrczogSSBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0aGUgbGFiZWwgc2V0dGluZyBhbmQgaW5pdGlhbGl6YXRpb24gaGFwcGVuIHdpdGhpbiB0aGUgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AgZmlsZS4gVGhlIGNvcmUgb2YgdGhpcyBpcyBnb2luZyB0byBiZSB0cmFjaW5nIHRoZSBjYWxscyB0byBgb3ZzX2N0X3NldF9sYWJlbHNgIGFuZCBgb3ZzX2N0X2luaXRfbGFiZWxzYC4gVW5kZXJzdGFuZGluZyB0aGVpciBjYWxsZXJzIHNob3VsZCBpbGx1bWluYXRlIHRoZSBjb250cm9sIGZsb3cgYW5kIGhvdyB0aGVzZSBsYWJlbHMgYXJlIGFjdHVhbGx5IG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgY29ubnRyYWNrIGNvbnRleHQuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyB3aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3Rfc2V0X2xhYmVsc3xvdnNfY3RfaW5pdF9sYWJlbHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzgwLSAqL1xubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM4MTpzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4Mi1cdFx0XHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIxLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyMjpzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIzLVx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAxNS1cdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjEwMTY6XHRcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy52YWx1ZSxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE3LVx0XHRcdFx0XHQgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTAyNDpcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cdFx0XHRcdFx0XHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTczCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHRleHQsIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uOgoKKipEaXNzZWN0aW5nIHRoZSBgb3ZzX2N0X2NvbW1pdGAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IG9mIGBvdnNfY3RfY29tbWl0YC4gVG8gZ2V0IGEgaGFuZGxlIG9uIGl0LCBJJiMzOTtsbCBzdGFydCBieSBwaW5wb2ludGluZyB0aGUgcmVsZXZhbnQgY29kZS4gVGhlIHRleHQgcG9pbnRzIG1lIHRvIGxpbmVzIDk5MCB0byAxMDQwIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEkgY2FuIHF1aWNrbHkgc2tpbSB0aGF0IHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhbmQgaG93IHRoZSBmdW5jdGlvbiBpcyB1c2VkLiBXaXRoIG15IGV4cGVyaWVuY2UsIEkgY2FuIGltbWVkaWF0ZWx5IGlkZW50aWZ5IHRoZSBrZXkgY29udHJvbCBmbG93IG1lY2hhbmlzbXMgaW52b2x2ZWQuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMsIGFueSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBjaXJjdW1zdGFuY2VzIHRoYXQgdHJpZ2dlciB0aGUgZnVuY3Rpb24mIzM5O3MgZXhlY3V0aW9uLiBGcm9tIHRoZXJlIEkmIzM5O2xsIGhhdmUgYSBtdWNoIGJldHRlciBoYW5kbGUgb24gd2hlcmUgdG8gcHJvY2VlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5OTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDk5MDpcdFxuIDk5MTpcdFx0LyogU2V0IHRoZSBjb25udHJhY2sgZXZlbnQgbWFzayBpZiBnaXZlbi4gIE5FVyBhbmQgREVMRVRFIGV2ZW50cyBoYXZlXG4gOTkyOlx0XHQgKiB0aGVpciBvd24gZ3JvdXBzLCBidXQgdGhlIE5GTkxHUlBfQ09OTlRSQUNLX1VQREFURSBncm91cCBsaXN0ZW5lclxuIDk5MzpcdFx0ICogdHlwaWNhbGx5IHdvdWxkIHJlY2VpdmUgbWFueSBraW5kcyBvZiB1cGRhdGVzLiAgU2V0dGluZyB0aGUgZXZlbnRcbiA5OTQ6XHRcdCAqIG1hc2sgYWxsb3dzIHRob3NlIGV2ZW50cyB0byBiZSBmaWx0ZXJlZC4gIFRoZSBzZXQgZXZlbnQgbWFzayB3aWxsXG4gOTk1Olx0XHQgKiByZW1haW4gaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3Rpb24gdW5sZXNzIGNoYW5nZWRcbiA5OTY6XHRcdCAqIGJ5IGEgZnVydGhlciBDVCBhY3Rpb24gd2l0aCBib3RoIHRoZSBjb21taXQgZmxhZyBhbmQgdGhlIGV2ZW50bWFza1xuIDk5NzpcdFx0ICogb3B0aW9uLiAqL1xuIDk5ODpcdFx0aWYgKGluZm8tXHUwMDNlaGF2ZV9ldmVudG1hc2spIHtcbiA5OTk6XHRcdFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xuMTAwMDpcdFxuMTAwMTpcdFx0XHRpZiAoY2FjaGUpXG4xMDAyOlx0XHRcdFx0Y2FjaGUtXHUwMDNlY3RtYXNrID0gaW5mby1cdTAwM2VldmVudG1hc2s7XG4xMDAzOlx0XHR9XG4xMDA0Olx0XG4xMDA1Olx0XHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcbjEwMDY6XHRcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXG4xMDA3Olx0XHQgKiBhY3Rpb24uXG4xMDA4Olx0XHQgKi9cbjEwMDk6XHRcdGlmIChpbmZvLVx1MDAzZW1hcmsubWFzaykge1xuMTAxMDpcdFx0XHRlcnIgPSBvdnNfY3Rfc2V0X21hcmsoY3QsIGtleSwgaW5mby1cdTAwM2VtYXJrLnZhbHVlLFxuMTAxMTpcdFx0XHRcdFx0ICAgICAgaW5mby1cdTAwM2VtYXJrLm1hc2spO1xuMTAxMjpcdFx0XHRpZiAoZXJyKVxuMTAxMzpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDE0Olx0XHR9XG4xMDE1Olx0XHRpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbjEwMTY6XHRcdFx0ZXJyID0gb3ZzX2N0X2luaXRfbGFiZWxzKGN0LCBrZXksIFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLnZhbHVlLFxuMTAxNzpcdFx0XHRcdFx0XHQgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4xMDE4Olx0XHRcdGlmIChlcnIpXG4xMDE5Olx0XHRcdFx0cmV0dXJuIGVycjtcbjEwMjA6XHRcbjEwMjE6XHRcdFx0bmZfY29ubl9hY3RfY3RfZXh0X2FkZChza2IsIGN0LCBjdGluZm8pO1xuMTAyMjpcdFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTKSBcdTAwMjZcdTAwMjZcbjEwMjM6XHRcdFx0ICAgbGFiZWxzX25vbnplcm8oXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzaykpIHtcbjEwMjQ6XHRcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG4xMDI1Olx0XHRcdFx0XHRcdFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spO1xuMTAyNjpcdFx0XHRpZiAoZXJyKVxuMTAyNzpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDI4Olx0XHR9XG4xMDI5Olx0XHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXG4xMDMwOlx0XHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cbjEwMzE6XHRcdCAqL1xuMTAzMjpcdFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcbjEwMzM6XHRcbjEwMzQ6XHRcdHJldHVybiB2ZXJkaWN0X3RvX2Vycm5vKGVycik7XG4xMDM1Olx0fVxuMTAzNjpcdFxuMTAzNzpcdC8qIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOUFJPR1JFU1MgaWYgJiMzOTtza2ImIzM5OyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cbjEwMzg6XHQgKiB2YWx1ZSBpZiAmIzM5O3NrYiYjMzk7IGlzIGZyZWVkLlxuMTAzOTpcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDI0MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDc1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgaW4gT3BlbiB2U3dpdGNoKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgSSYjMzk7dmUgZm91bmQgc29tZXRoaW5nIGludGVyZXN0aW5nIGluIHRoZSBPcGVuIHZTd2l0Y2ggY29ubnRyYWNrIGltcGxlbWVudGF0aW9uLiBJdCBsb29rcyBsaWtlIHdoZW4gYGN0YCBpcyBjb25maXJtZWTigJRzcGVjaWZpY2FsbHksIGluIHRoYXQgYGVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFMpICZhbXA7JmFtcDsgbGFiZWxzX25vbnplcm8oJmFtcDtpbmZvLSZndDtsYWJlbHMubWFzaykpYCBicmFuY2jigJRgb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgLi4uKWAgZ2V0cyBjYWxsZWQuIEluc2lkZSBgb3ZzX2N0X3NldF9sYWJlbHNgLCB3ZSBnbyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLgoKUHJldmlvdXNseSwgaWYgYGNsYCAodGhlIGNvbm5lY3Rpb24gbGFiZWxzKSB3YXMgTlVMTCBvbiBhICpjb25maXJtZWQqIGNvbm5lY3Rpb24sIGl0IHdvdWxkIGNhbGwgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAsIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAuIEJ1dCBub3csICphZnRlciogdGhpcyBwYXRjaCwgdGhlIGNvbmRpdGlvbmFsIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgbWVhbnMgdGhhdCBpZiBgY2xgIGlzIE5VTEwgb24gYSBjb25maXJtZWQgY29ubmVjdGlvbiwgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIHJldHVybnMgTlVMTCwgYW5kIGBvdnNfY3Rfc2V0X2xhYmVsc2AgcmV0dXJucyBgLUVOT1NQQ2AgaW5zdGVhZC4gVGhpcyBpcyBhIGNydWNpYWwgY2hhbmdlIGluIGNvbnRyb2wgZmxvdyEKClRoaXMgY29kZSAqaXMqIHJlYWNoYWJsZSDigJMgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgY29yZSBuZXR3b3JraW5nIGNvbXBvbmVudHMgKE9wZW4gdlN3aXRjaCBjb25udHJhY2spLiBVc2Vyc3BhY2UgY2FuIHNlbmQgT3BlbiB2U3dpdGNoIGZsb3dzIHRoYXQgc3BlY2lmeSBjb25udHJhY2sgYWN0aW9ucyB3aXRoIGxhYmVsIG1hc2tzIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgd2hpY2ggd291bGQgaGl0IHRoaXMgY29kZSBwYXRoIHZpYSB0aGUgbmV0bGluayBpbnRlcmZhY2VzIChgb3ZzX2N0X2V4ZWN1dGVgLCBgb3ZzX2V4ZWN1dGVfYWN0aW9uc2AsIGV0Yy4pLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhpcyBpcyByaXBlIGZvciBpbnZlc3RpZ2F0aW9uLgoKU28sIGlzIGl0IHdvcnRoIGZ1enppbmc/IExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKKiAgICoqQ29yZSBTdWJzeXN0ZW1zOioqIFllcywgY29yZSBuZXR3b3JraW5nIChPcGVuIHZTd2l0Y2gsIGNvbm50cmFjaykKKiAgICoqUmVhY2hhYmxlIGNvZGU6KiogWWVzLCBPcGVuIHZTd2l0Y2ggdmlhIGdlbmVyaWMgbmV0bGluay4KKiAgICoqTW9kaWZpZWQgZXhlY3V0YWJsZSBsb2dpYzoqKiBZZXMsIHRoZSBsb2dpYyBpbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpYCBoYXMgYmVlbiBjaGFuZ2VkLCBzcGVjaWZpY2FsbHkgcHJldmVudGluZyB0aGUgZXh0ZW5zaW9uIGFkZGl0aW9uIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNvbmZpcm1lZC4KCkFic29sdXRlbHkuIFRoaXMgd2FycmFudHMgZnV6emluZy4gYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdywgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGZvY3VzLiBMZXQmIzM5O3MgbG9vayBhdCB0aGUga2V5IHN5bWJvbHMuIEkgbmVlZCB0byBmb2N1cyBvbiB0aGlzIGNoYW5nZSwgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGFuZCBpdHMgY2FsbGVycy4gVGhlIGltbWVkaWF0ZSBjYWxscyBhcmU6IGBvdnNfY3RfaW5pdF9sYWJlbHNgIGFuZCBgb3ZzX2N0X3NldF9sYWJlbHNgLCBib3RoIHN0YXRpYyBhbmQgY2FsbGVkIGZyb20gYG92c19jdF9jb21taXRgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBgb3ZzX2N0X2V4ZWN1dGVgLiBJIG5lZWQgdG8gZW5zdXJlIEkgY2hlY2sgY2FsbGVycyBvZiBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHdlbGwuIFRoYXQgaXMgd2hlcmUgSSBjYW4gYXBwbHkgZnV6emluZyBmb3IgdGhpcyBhbmFseXNpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7b3ZzX2N0X2V4ZWN1dGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYz0xMjU1PXN0YXRpYyBpbnQgZG9fZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYy0xMzg1LVxubmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYzoxMzg2Olx0XHRcdGVyciA9IG92c19jdF9leGVjdXRlKG92c19kcF9nZXRfbmV0KGRwKSwgc2tiLCBrZXksXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jLTEzODctXHRcdFx0XHRcdCAgICAgbmxhX2RhdGEoYSkpO1xuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01MzI9c3RhdGljXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NTMzOnN0cnVjdCBuZl9jb25uICpvdnNfY3RfZXhlY3V0ZWQoc3RydWN0IG5ldCAqbmV0LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTUzNC1cdFx0XHRcdGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01NjE9c3RhdGljIGJvb2wgc2tiX25mY3RfY2FjaGVkKHN0cnVjdCBuZXQgKm5ldCxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNTcxLVx0aWYgKCFjdClcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo1NzI6XHRcdGN0ID0gb3ZzX2N0X2V4ZWN1dGVkKG5ldCwga2V5LCBpbmZvLCBza2IsIFx1MDAyNmN0X2V4ZWN1dGVkKTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy01NzMtXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAzOS0gKi9cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDQwOmludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTA0MS1cdFx0ICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTIzPWludCBvdnNfY3RfYWN0aW9uX3RvX2F0dHIoY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNC1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaDoyNTppbnQgb3ZzX2N0X2V4ZWN1dGUoc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKixcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNi1cdFx0ICAgY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqKTtcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmg9NTk9c3RhdGljIGlubGluZSBpbnQgb3ZzX2N0X2FjdGlvbl90b19hdHRyKGNvbnN0IHN0cnVjdCBvdnNfY29ubnRyYWNrX2luZm8gKmluZm8sXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY0LVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oOjY1OnN0YXRpYyBpbmxpbmUgaW50IG92c19jdF9leGVjdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC02Ni1cdFx0XHRcdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzNDcKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA4OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE9wZW4gdlN3aXRjaCBDb25udHJhY2sgRnVuY3Rpb25hbGl0eSBhbmQgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb25uZWN0aW9uIHRyYWNraW5nIChjb25udHJhY2spIGxhYmVscyBpbiBPcGVuIHZTd2l0Y2ggYW5kIHRoZWlyIGRlcGVuZGVuY2llcy4gSSYjMzk7dmUgaWRlbnRpZmllZCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AsIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGBvdnNfY3RfaW5pdF9sYWJlbHNgLCBgb3ZzX2N0X2NvbW1pdGAsIGFuZCBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiwgYWxsIHJlc2lkaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBleHBvcnRlZCBgb3ZzX2N0X2V4ZWN1dGVgLiBJdCYjMzk7cyB3b3J0aCBub3RpbmcgdGhlc2UgYXJlIGFsbCBzdGF0aWMgZXhjZXB0IGBvdnNfY3RfZXhlY3V0ZWAuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogV2hhdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIG5lY2Vzc2FyeSBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIGNvbXBpbGUgYW5kIHJ1biBjb3JyZWN0bHk/IEZpcnN0LCBvYnZpb3VzbHkgYE9QRU5WU1dJVENIYCBpcyByZXF1aXJlZCwgZ2l2ZW4gdGhlIGZpbGVuYW1lIHBhdGhzLiBMb29raW5nIGF0IHRoZSBgTWFrZWZpbGVgLCBgTkZfQ09OTlRSQUNLYCBpcyBhbHNvIGEgbXVzdC1oYXZlOyBpdCBkZXRlcm1pbmVzIHdoZXRoZXIgYGNvbm50cmFjay5vYCBnZXRzIGluY2x1ZGVkIGluIHRoZSBidWlsZC4KClRoZSBiaWcgb25lLCBob3dldmVyLCBpcyBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEkgc2VlIHRoaXMgaXMgZXNzZW50aWFsIGJlY2F1c2UgYG92c19jdF9zZXRfbGFiZWxzYCBpcyBvbmx5IGNhbGxlZCBpZiBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXMgZW5hYmxlZCwgYW5kIGlmIGl0JiMzOTtzIG5vdCBlbmFibGVkLCBjYWxscyB0byBmdW5jdGlvbnMgbGlrZSBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGFyZSBlZmZlY3RpdmVseSBuby1vcHMuIFdpdGhvdXQgdGhpcywgbGFiZWwgc2V0dGluZyB3b24mIzM5O3QgZXZlbiBoYXBwZW4gb24gY29uZmlybWVkIGNvbm5lY3Rpb25zLiBUaGF0IG1ha2VzIGl0IGEgaGFyZCBkZXBlbmRlbmN5IGZvciBsYWJlbCBmdW5jdGlvbmFsaXR5LgoKSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgdGhlIG90aGVyIGRlcGVuZGVuY2llcy4gUmV2aWV3aW5nIHRoZSBgS2NvbmZpZ2AgZmlsZXMgcmV2ZWFscyBhIHBvdGVudGlhbGx5IGNvbXBsZXggc2V0IG9mIGNvbmRpdGlvbnMgZm9yIGBPUEVOVlNXSVRDSGAgaXRzZWxmLCBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYElORVRgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGFzc29ydGVkIG90aGVyIG5ldGZpbHRlciBvcHRpb25zLCBidXQgdGhvc2Ugc2VlbSBsZXNzIGltbWVkaWF0ZWx5IGltcGFjdGZ1bC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2hldGhlciBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXRzZWxmIGhhcyBhbnkgcHJlY29uZGl0aW9ucyBmcm9tIGl0cyBgS2NvbmZpZ2AgZGVmaW5pdGlvbiwgdG9vLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTkZfQ09OTlRSQUNLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGZpbHRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL0tjb25maWc9NzQ9Y29uZmlnIE5FVEZJTFRFUl9ORVRMSU5LX09TRlxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy04MS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzo4Mjpjb25maWcgTkZfQ09OTlRSQUNLXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODMtXHR0cmlzdGF0ZSBcJiMzNDtOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnPTExMT1jb25maWcgTkVURklMVEVSX0NPTk5DT1VOVFxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMTMtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTE0OmNvbmZpZyBORl9DT05OVFJBQ0tfTUFSS1xubmV0L25ldGZpbHRlci9LY29uZmlnLTExNS1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMjItXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTIzOmNvbmZpZyBORl9DT05OVFJBQ0tfU0VDTUFSS1xubmV0L25ldGZpbHRlci9LY29uZmlnLTEyNC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyBzZWN1cml0eSBtYXJrIHN1cHBvcnQmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzUtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTM2OmNvbmZpZyBORl9DT05OVFJBQ0tfWk9ORVNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzctXHRib29sICAmIzM5O0Nvbm5lY3Rpb24gdHJhY2tpbmcgem9uZXMmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNDctXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTQ4OmNvbmZpZyBORl9DT05OVFJBQ0tfUFJPQ0ZTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ5LVx0Ym9vbCBcJiMzNDtTdXBwbHkgQ1QgbGlzdCBpbiBwcm9jZnMgKE9CU09MRVRFKVwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNTYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTU3OmNvbmZpZyBORl9DT05OVFJBQ0tfRVZFTlRTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTU4LVx0Ym9vbCBcJiMzNDtDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50c1wmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNjYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTY3OmNvbmZpZyBORl9DT05OVFJBQ0tfVElNRU9VVFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE2OC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyB0aW1lb3V0JiMzOTtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc2LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjE3Nzpjb25maWcgTkZfQ09OTlRSQUNLX1RJTUVTVEFNUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE3OC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyB0aW1lc3RhbXBpbmcmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODctXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTg4OmNvbmZpZyBORl9DT05OVFJBQ0tfTEFCRUxTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg5LVx0Ym9vbCBcJiMzNDtDb25uZWN0aW9uIHRyYWNraW5nIGxhYmVsc1wmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xOTQtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTk1OmNvbmZpZyBORl9DT05OVFJBQ0tfT1ZTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk2LVx0Ym9vbFxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz0yMDE9Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjExLVxubmV0L25ldGZpbHRlci9LY29uZmlnOjIxMjpjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQVxubmV0L25ldGZpbHRlci9LY29uZmlnLTIxMy1cdHRyaXN0YXRlIFwmIzM0O0FtYW5kYSBiYWNrdXAgcHJvdG9jb2wgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MjI3OmNvbmZpZyBORl9DT05OVFJBQ0tfRlRQXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjI4LVx0dHJpc3RhdGUgXCYjMzQ7RlRQIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjM4LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjIzOTpjb25maWcgTkZfQ09OTlRSQUNLX0gzMjNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNDAtXHR0cmlzdGF0ZSBcJiMzNDtILjMyMyBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTI1Ny1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNTg6Y29uZmlnIE5GX0NPTk5UUkFDS19JUkNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNTktXHR0cmlzdGF0ZSBcJiMzNDtJUkMgRENDIHByb3RvY29sIHN1cHBvcnQgKG9ic29sZXRlKVwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzMtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6Mjc0OmNvbmZpZyBORl9DT05OVFJBQ0tfQlJPQURDQVNUXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjc1LVx0dHJpc3RhdGVcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6Mjc3OmNvbmZpZyBORl9DT05OVFJBQ0tfTkVUQklPU19OU1xubmV0L25ldGZpbHRlci9LY29uZmlnLTI3OC1cdHRyaXN0YXRlIFwmIzM0O05ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjk1LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjI5Njpjb25maWcgTkZfQ09OTlRSQUNLX1NOTVBcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yOTctXHR0cmlzdGF0ZSBcJiMzNDtTTk1QIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMTAtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzExOmNvbmZpZyBORl9DT05OVFJBQ0tfUFBUUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTMxMi1cdHRyaXN0YXRlIFwmIzM0O1BQdFAgcHJvdG9jb2wgc3VwcG9ydCAoZGVwcmVjYXRlZClcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzI5LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjMzMDpjb25maWcgTkZfQ09OTlRSQUNLX1NBTkVcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMzEtXHR0cmlzdGF0ZSBcJiMzNDtTQU5FIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzQyLVxubmV0L25ldGZpbHRlci9LY29uZmlnOjM0Mzpjb25maWcgTkZfQ09OTlRSQUNLX1NJUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTM0NC1cdHRyaXN0YXRlIFwmIzM0O1NJUCBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTM1NC1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzozNTU6Y29uZmlnIE5GX0NPTk5UUkFDS19URlRQXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzU2LVx0dHJpc3RhdGUgXCYjMzQ7VEZUUCBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MDAxCgkJCQkJCQlvdXRwdXQ6IDIwOQoJCQkJCQkJdGhvdWdodHM6IDMyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBPcGVuIHZTd2l0Y2ggQ29ubmVjdGlvbiBUcmFja2luZyB3aXRoIExhYmVscyBGdXp6aW5nIFRhcmdldCoqCgpPa2F5LCBsZXQmIzM5O3Mgc29saWRpZnkgdGhpcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmUgdGhlIGVuYWJsaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb3JyZWN0IGZvciB0aGUgT3BlbiB2U3dpdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBsYWJlbHMuIExvb2tpbmcgYXQgdGhlIGBuZXQvbmV0ZmlsdGVyL0tjb25maWdgLCBpdCYjMzk7cyBjbGVhcjogYE5GX0NPTk5UUkFDS19MQUJFTFNgIGlzIG5lc3RlZCB3aXRoaW4gdGhlIGBpZiBORl9DT05OVFJBQ0tgIGJsb2NrLCB3aGljaCBpbiB0dXJuIGRlcGVuZHMgb24gYE5FVEZJTFRFUmAuIFRodXMsIHRoZSByZXF1aXJlZCBjb25maWdzIGFyZSBgT1BFTlZTV0lUQ0hgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTm8gc3VycHJpc2VzIHRoZXJlLgoKTm93LCBsZXQmIzM5O3MgcnVuIHRocm91Z2ggdGhlIGV2YWx1YXRpb24gb25lIG1vcmUgdGltZSwgbWFraW5nIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55dGhpbmc6CgoxLiAgKipSZWFjaGFiaWxpdHk6KiogT3BlbiB2U3dpdGNoIGlzIGEgKnNvZnR3YXJlKiBkYXRhcGF0aCB3aXRoaW4gdGhlIGtlcm5lbC4gSXTigJlzIGNvbmZpZ3VyYWJsZSB2aWEgR2VuZXJpYyBOZXRsaW5rLCBzbyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHN0YW5kYXJkIHZpcnR1YWwgbmV0d29ya2luZyBwcmltaXRpdmVzLiBObyBwaHlzaWNhbCBoYXJkd2FyZSBpcyBpbnZvbHZlZCwgbWFraW5nIGl0IGlkZWFsIGZvciB2aXJ0dWFsIGVudmlyb25tZW50cyBhbmQgdGVzdGJlZHMgKFFFTVUvS1ZNKS4gVGhlIGZhY3QgdGhhdCBTeXprYWxsZXIgaGVhdmlseSBmdXp6ZXMgdGhlIE9wZW4gdlN3aXRjaCBuZXRsaW5rIGludGVyZmFjZSwgYW5kIHBhcnRpY3VsYXJseSBjb25uZWN0aW9uIHRyYWNraW5nIGFjdGlvbnMsIGlzIGEgc29saWQgaW5kaWNhdG9yIG9mIHJlYWNoYWJpbGl0eS4gQ29uZmlybWVkLgoKMi4gICoqV29ydGhGdXp6aW5nOioqIFRoaXMgaXMgYSBjbGVhciAmIzM0O3llcy4mIzM0OyBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGFuZCBkZWFscyB3aXRoIHRoZSBPcGVuIHZTd2l0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBoYW5kbGluZy4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBtb2RpZnlpbmcgdGhlIGxvZ2ljIHdoZW4gY29ubmVjdGlvbiBsYWJlbHMgYXJlIGFkZGVkIHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnkuIFRoaXMgaXMgYSB2ZXJ5IGludGVyZXN0aW5nIHNwb3QuIFdvcnRoIHRoZSBlZmZvcnQhCgozLiAgKipGb2N1c1N5bWJvbHM6KiogSSYjMzk7dmUgaWRlbnRpZmllZCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHdpdGhpbiB0aGlzIGFyZWE6IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCwgYG92c19jdF9zZXRfbGFiZWxzYCwgYG92c19jdF9pbml0X2xhYmVsc2AsIGBvdnNfY3RfY29tbWl0YCwgYW5kIGBvdnNfY3RfZXhlY3V0ZWAuIFRoZXNlIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyBJJiMzOTttIGludGVyZXN0ZWQgaW4gYXMgcG90ZW50aWFsIHRhcmdldHMgZm9yIGZ1enppbmcuIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuCgo0LiAgKipFbmFibGVDb25maWdzOioqIEFnYWluLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEFic29sdXRlbHkgY29ycmVjdC4KCkFscmlnaHQsIGV2ZXJ5dGhpbmcgbGluZXMgdXAgcGVyZmVjdGx5LiBNeSBhbmFseXNpcyBpcyBzb2xpZC4gSSYjMzk7bSBnb2luZyB0byBjYWxsIGBzZXQtcmVzdWx0c2Agbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7T1BFTlZTV0lUQ0gmIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDS19MQUJFTFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9zZXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9pbml0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfY29tbWl0JiMzNDssCiAgICAmIzM0O292c19jdF9leGVjdXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtPUEVOVlNXSVRDSCYjMzQ7LAogICAgJiMzNDtORl9DT05OVFJBQ0smIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLX0xBQkVMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O292c19jdF9nZXRfY29ubl9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X3NldF9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2luaXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9jb21taXQmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2V4ZWN1dGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpIGluIG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyB0byBwcmV2ZW50IGNhbGxpbmcgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKSB3aGVuIHRoZSBjb25udHJhY2sgZW50cnkgaXMgYWxyZWFkeSBjb25maXJtZWQuIFRoaXMgdG91Y2hlcyByZWFjaGFibGUgY29yZSBuZXR3b3JraW5nIGNvZGUgcmVhY2hhYmxlIHZpYSBPcGVuIHZTd2l0Y2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzIHRoYXQgbWFuaXB1bGF0ZSBjb25udHJhY2sgYWN0aW9ucyBhbmQgbGFiZWxzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nIGFuZCBhYnNlbmNlIG9mIHJlZ3Jlc3Npb25zIG9yIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzIHdoZW4gaGFuZGxpbmcgY29ubnRyYWNrIGxhYmVscyBvbiBjb25maXJtZWQgdnMgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMTM6NTg6MzQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKaW5kZXggMjcxMTU5NjdlNWQ5My4uMGY0MzM2ODhlMTdiOSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwpAQCAtMzY2LDcgJiM0MzszNjYsNyBAQCBzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCkKIAlzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsOwogCiAJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7Ci0JaWYgKCFjbCkgewomIzQzOwlpZiAoIWNsICZhbXA7JmFtcDsgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpOwogCQljbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTsKIAl9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDk4CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjU4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gVGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaXQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciByZXRyaWV2aW5nIGNvbm5lY3Rpb24gbGFiZWxzIChgbmZfY29ubl9sYWJlbHNgKSBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5IChgbmZfY29ubmApLgoKQ3VycmVudGx5LCB0aGUgY29kZSB0cmllcyB0byBmaW5kIGxhYmVscyB3aXRoIGBuZl9jdF9sYWJlbHNfZmluZChjdClgLiBJZiBpdCBkb2VzbiYjMzk7dCBmaW5kIGFueSwgaXQgYWRkcyB0aGVtIHdpdGggYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgYW5kIHRoZW4gdHJpZXMgdG8gZmluZCB0aGVtIGFnYWluLiBNYWtlcyBzZW5zZSwgdGhhdCYjMzk7cyB0aGUgc3RhbmRhcmQgaW5pdGlhbGl6YXRpb24gcGF0dGVybi4KClRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhpcyBjb25kaXRpb25hbDogYGlmICghY2wgJmFtcDsmYW1wOyAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSlgLiBCZWZvcmUsIHRoZSBjb2RlIHdvdWxkIGFkZCB0aGUgbGFiZWxzIGlmIGBjbGAgd2FzIE5VTEwuIE5vdywgaXQgYWRkcyBsYWJlbHMgKm9ubHkqIGlmIGBjbGAgaXMgTlVMTCAqYW5kKiB0aGUgY29ubmVjdGlvbiBpcyAqbm90KiBjb25maXJtZWQuIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBpdCBzdWdnZXN0cyB0aGUgb3JpZ2luYWwgY29kZSBjb3VsZCBiZSBuZWVkbGVzc2x5IGFkZGluZyBsYWJlbHMgZm9yIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLgoKSSBpbW1lZGlhdGVseSB3b25kZXIgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBoZXJlLiBBcmUgdGhlcmUgcGVyZm9ybWFuY2UgaW1wYWN0cz8gSXMgdGhpcyBhIGJ1ZyBmaXgsIGFuZCBhcmUgd2UgaW5hZHZlcnRlbnRseSBtYWtpbmcgYSBjaGFuZ2UgdG8gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgcHJvY2Vzcz8KCkkgbmVlZCB0byBkaWcgaW50byB0aGUgYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGZ1bmN0aW9uIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gVGhhdCBmdW5jdGlvbiBsaWtlbHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIHBhc3NlZCBhIGNlcnRhaW4gc3RhdGUgb3IgaXMgc3RpbGwgaW4gYSBwcmVsaW1pbmFyeSBzdGFnZS4gSWYgdGhpcyBwYXRjaCBpcyBjb3JyZWN0LCB0aGVuIGFkZGluZyBsYWJlbHMgdG8gdW5jb25maXJtZWQgY29ubmVjdGlvbnMgaXMgdW5uZWNlc3NhcnksIHBvdGVudGlhbGx5IHdhc3RlZnVsLCBvciBldmVuIGJ1Z2d5LgoKTXkgbmV4dCBzdGVwIGlzIGRlZmluaXRlbHkgdG8gcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSB1c2UgY2FzZXMgd2hlcmUgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGlzIGNhbGxlZC4gSXQmIzM5O3MgYWxzbyBpbXBvcnRhbnQgdG8gYW5hbHl6ZSB3aGF0IHByb2JsZW1zIHRoaXMgY2hhbmdlIGlzIHNvbHZpbmcsIGFuZCBlbnN1cmUgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIGFueSByZWdyZXNzaW9ucywgbGlrZSwgZm9yIGluc3RhbmNlLCBhIGNoYW5nZSBpbiBiZWhhdmlvdXIgd2l0aCBob3cgdW5jb25maXJtZWQgY29ubmVjdGlvbnMgYXJlIGhhbmRsZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNTU6XHRcdFx0a2V5LVx1MDAzZWN0Lm1hcmsgPSBuZXdfbWFyaztcbiAzNTY6XHRcdH1cbiAzNTc6XHRcbiAzNTg6XHRcdHJldHVybiAwO1xuIDM1OTpcdCNlbHNlXG4gMzYwOlx0XHRyZXR1cm4gLUVOT1RTVVBQO1xuIDM2MTpcdCNlbmRpZlxuIDM2MjpcdH1cbiAzNjM6XHRcbiAzNjQ6XHRzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbiAzNjU6XHR7XG4gMzY2Olx0XHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xuIDM2NzpcdFxuIDM2ODpcdFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4gMzY5Olx0XHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIDM3MDpcdFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gMzcxOlx0XHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIDM3MjpcdFx0fVxuIDM3MzpcdFxuIDM3NDpcdFx0cmV0dXJuIGNsO1xuIDM3NTpcdH1cbiAzNzY6XHRcbiAzNzc6XHQvKiBJbml0aWFsaXplIGxhYmVscyBmb3IgYSBuZXcsIHlldCB0byBiZSBjb21taXR0ZWQgY29ubnRyYWNrIGVudHJ5LiAgTm90ZSB0aGF0XG4gMzc4Olx0ICogc2luY2UgdGhlIG5ldyBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgY29uZmlybWVkLCBhbmQgdGh1cyBuby1vbmUgZWxzZSBoYXNcbiAzNzk6XHQgKiBhY2Nlc3MgdG8gaXQmIzM5O3MgbGFiZWxzLCB3ZSBzaW1wbHkgd3JpdGUgdGhlbSBvdmVyLlxuIDM4MDpcdCAqL1xuIDM4MTpcdHN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4gMzgyOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gMzgzOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICptYXNrKVxuIDM4NDpcdHtcbiAzODU6XHRcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2wsICptYXN0ZXJfY2w7XG4gMzg2Olx0XHRib29sIGhhdmVfbWFzayA9IGxhYmVsc19ub256ZXJvKG1hc2spO1xuIDM4NzpcdFxuIDM4ODpcdFx0LyogSW5oZXJpdCBtYXN0ZXImIzM5O3MgbGFiZWxzIHRvIHRoZSByZWxhdGVkIGNvbm5lY3Rpb24/ICovXG4gMzg5Olx0XHRtYXN0ZXJfY2wgPSBjdC1cdTAwM2VtYXN0ZXIgPyBuZl9jdF9sYWJlbHNfZmluZChjdC1cdTAwM2VtYXN0ZXIpIDogTlVMTDtcbiAzOTA6XHRcbiAzOTE6XHRcdGlmICghbWFzdGVyX2NsIFx1MDAyNlx1MDAyNiAhaGF2ZV9tYXNrKVxuIDM5MjpcdFx0XHRyZXR1cm4gMDsgICAvKiBOb3RoaW5nIHRvIGRvLiAqL1xuIDM5MzpcdFxuIDM5NDpcdFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbiAzOTU6XHRcdGlmICghY2wpXG4gMzk2Olx0XHRcdHJldHVybiAtRU5PU1BDO1xuIDM5NzpcdFxuIDM5ODpcdFx0LyogSW5oZXJpdCB0aGUgbWFzdGVyJiMzOTtzIGxhYmVscywgaWYgYW55LiAqL1xuIDM5OTpcdFx0aWYgKG1hc3Rlcl9jbClcbiA0MDA6XHRcdFx0KmNsID0gKm1hc3Rlcl9jbDtcbiA0MDE6XHRcbiA0MDI6XHRcdGlmIChoYXZlX21hc2spIHtcbiA0MDM6XHRcdFx0dTMyICpkc3QgPSAodTMyICopY2wtXHUwMDNlYml0cztcbiA0MDQ6XHRcdFx0aW50IGk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MzgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqSW52ZXN0aWdhdGluZyB0aGUgQ2FsbCBTaXRlcyBvZiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AqKgoKUmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgaXMgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgIGZpbGUuIFRoaXMgdGVsbHMgbWUgSSYjMzk7bSBsaWtlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGljaCBwYXJ0cyBvZiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzIGFyZSB1c2luZyB0aGUgY29ubmVjdGlvbiBsYWJlbHMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIGZpbmQgdGhlIGxvY2F0aW9ucyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBpdHMgc2lnbmlmaWNhbmNlIGFuZCB0aGUgZGF0YSBmbG93IGluIHRoYXQgcGFydCBvZiB0aGUgY29kZS4gSSYjMzk7bGwgbmVlZCB0byB1c2UgZWl0aGVyIHN0YXRpYyBhbmFseXNpcyB0b29scyBvciBzaW1wbHkgbmF2aWdhdGUgdGhlIHNvdXJjZSBjb2RlIGxvb2tpbmcgZm9yIGFsbCB0aGUgY2FsbHMgdG8gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBPbmNlIEkgaGF2ZSBhIGxpc3Qgb2YgYWxsIGNhbGxzLCBJIGNhbiB0aGVuIHVuZGVyc3RhbmQgd2h5IGFuZCB3aGVuIHRoZSBsYWJlbHMgYXJlIGJlaW5nIHF1ZXJpZWQuIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZGlnZ2luZyBkZWVwZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O292c19jdF9nZXRfY29ubl9sYWJlbHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM0ND1zdGF0aWMgaW50IG92c19jdF9zZXRfbWFyayhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzY0OnN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM2NS17XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM4MT1zdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6Mzk0Olx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXHRpZiAoIWNsKVxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjgtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5Olx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MzAtXHRpZiAoIWNsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjEwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkRpdmluZyBpbnRvIENvbm5lY3Rpb24gVHJhY2tpbmcgTGFiZWxzIGluIE9WUyBhbmQgTmV0ZmlsdGVyKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG92c19jdF9zZXRfbGFiZWxzYCBhbmQgYG5mX2N0X2xhYmVsc19leHRfYWRkYCBhbmQgaW1tZWRpYXRlbHkgbXkgZXhwZXJ0IG1pbmQganVtcHMgdG8gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gT3BlbiB2U3dpdGNoIGFuZCB0aGUgTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3lzdGVtLiBUaGVzZSBmdW5jdGlvbiBuYW1lcyB0aGVtc2VsdmVzIGhpbnQgYXQgbGFiZWwgbWFuaXB1bGF0aW9uIGFuZCBleHRlbnNpb24sIHdoaWNoIGlzIHN0YW5kYXJkIGluIGFueSByb2J1c3QgY29ubmVjdGlvbiB0cmFja2luZyBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvcmUgcXVlc3Rpb24sIGFzIGFsd2F5cywgaXMgKndoeSogdGhhdCBgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGNoZWNrPyBXaGF04oCZcyB0aGUgY29udGV4dCBpdCYjMzk7cyBwcm90ZWN0aW5nLCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgd2UgbWFraW5nIGFib3V0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlPyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRoYXQgdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIGNvbm5lY3Rpb24mIzM5O3MgbGlmZWN5Y2xlIHN0YXRlLiAqQ29uZmlybWVkKiBzdWdnZXN0cyBhIHRyYW5zaXRpb24gcG9pbnQsIGEgdmFsaWRhdGlvbiBvZiB0aGUgdHJhY2tpbmcgaW5mb3JtYXRpb24sIHBlcmhhcHMgYmVmb3JlIGl0JiMzOTtzIGRlZW1lZCBzdGFibGUgb3Igc2FmZSBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uIEkgd2FudCB0byBrbm93IHdoZW4gd2UgYXJlIGFkZGluZyB0aGUgbGFiZWxzLCBpZiB0aGV5IGFyZSBhZGRlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkLCBhbmQgd2h5IHRoYXQgaXMgZGVzaXJlZCBvciBub3QuIEFyZSB3ZSBwb3RlbnRpYWxseSBhdm9pZGluZyByYWNlIGNvbmRpdGlvbnMgb3IgdW5leHBlY3RlZCBzaWRlIGVmZmVjdHMgd2l0aCBpbW1hdHVyZSBjb25uZWN0aW9uIGVudHJpZXM/IExldCYjMzk7cyB0cmFjZSBiYWNrIGZyb20gaGVyZSwgc2VlIGhvdyBpdCYjMzk7cyBoYW5kbGVkIGluIHRoZSBPVlMgY29kZSwgYW5kIHdoYXQgdGhlIGVxdWl2YWxlbnQgTmV0ZmlsdGVyIGNvbnRleHQgc3VnZ2VzdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MjA6XHR9XG4gNDIxOlx0XG4gNDIyOlx0c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQyMzpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gNDI0Olx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiA0Mjc6XHRcdGludCBlcnI7XG4gNDI4Olx0XG4gNDI5Olx0XHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xuIDQzMDpcdFx0aWYgKCFjbClcbiA0MzE6XHRcdFx0cmV0dXJuIC1FTk9TUEM7XG4gNDMyOlx0XG4gNDMzOlx0XHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM0Olx0XHRcdFx0XHQgICAgbWFzay1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM1Olx0XHRcdFx0XHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xuIDQzNjpcdFx0aWYgKGVycilcbiA0Mzc6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mzg6XHRcbiA0Mzk6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDQwOlx0XG4gNDQxOlx0XHRyZXR1cm4gMDtcbiA0NDI6XHR9XG4gNDQzOlx0XG4gNDQ0Olx0c3RhdGljIGludCBvdnNfY3RfaGFuZGxlX2ZyYWdtZW50cyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQ0NTpcdFx0XHRcdFx0ICAgdTE2IHpvbmUsIGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICpza2IpXG4gNDQ2Olx0e1xuIDQ0NzpcdFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xuIDQ0ODpcdFx0aW50IGVycjtcbiA0NDk6XHRcbiA0NTA6XHRcdGVyciA9IG5mX2N0X2hhbmRsZV9mcmFnbWVudHMobmV0LCBza2IsIHpvbmUsIGZhbWlseSwgXHUwMDI2a2V5LVx1MDAzZWlwLnByb3RvLCBcdTAwMjZvdnNfY2IubXJ1KTtcbiA0NTE6XHRcdGlmIChlcnIpXG4gNDUyOlx0XHRcdHJldHVybiBlcnI7XG4gNDUzOlx0XG4gNDU0Olx0XHQvKiBUaGUga2V5IGV4dHJhY3RlZCBmcm9tIHRoZSBmcmFnbWVudCB0aGF0IGNvbXBsZXRlZCB0aGlzIGRhdGFncmFtXG4gNDU1Olx0XHQgKiBsaWtlbHkgZGlkbiYjMzk7dCBoYXZlIGFuIEw0IGhlYWRlciwgc28gcmVnZW5lcmF0ZSBpdC5cbiA0NTY6XHRcdCAqL1xuIDQ1NzpcdFx0b3ZzX2Zsb3dfa2V5X3VwZGF0ZV9sM2w0KHNrYiwga2V5KTtcbiA0NTg6XHRcdGtleS1cdTAwM2VpcC5mcmFnID0gT1ZTX0ZSQUdfVFlQRV9OT05FO1xuIDQ1OTpcdFx0Kk9WU19DQihza2IpID0gb3ZzX2NiO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjEyCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVlcmluZyBpbnRvIHRoZSBuZXRmaWx0ZXIgd2VlZHMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgZnVuY3Rpb24gaXMgZG9pbmcuIFRpbWUgdG8gaGl0IHRoZSBnaXQgbG9nIGFuZCBzZWUgaWYgSSBjYW4gZmluZCBzb21lIGNvbW1pdCBoaXN0b3J5LiBTZWFyY2hpbmcgZm9yIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgc3BlY2lmaWNhbGx5IGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCwgYnV0IEkgc2hvdWxkIHByb2JhYmx5IGJyb2FkZW4gdGhlIHNlYXJjaCBhIGxpdHRsZSB0byBpbmNsdWRlIHJlbGF0ZWQgdGVybXMgb3IgdmFyaWF0aW9ucyBvbiB0aGUgZnVuY3Rpb24gbmFtZS4gQSBkZWVwZXIgZGl2ZSBpbnRvIHRoZSBjb21taXQgbWVzc2FnZXMgYW5kIGFueSByZWxhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBob3BlZnVsbHkgaWxsdW1pbmF0ZSB0aGUgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHByb2Nlc3MuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbnRleHQgYW5kIGludGVudCBiZWhpbmQgaXRzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUga2V5IHRvIGdyYXNwaW5nIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG5ldGZpbHRlciBmcmFtZXdvcmsuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgc291cmNlIGNvZGUgcmV2ZWFscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZfY3RfbGFiZWxzX2V4dF9hZGQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaD0yMz1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oOjM3OnN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM9MTc1ND1pbml0X2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25uICp0bXBsLFxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVx0bmZfY3RfdHN0YW1wX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5NC1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM6MjMwNTpcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVx0bmZjdF9zZXFhZGpfZXh0X2FkZChjdCk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MDE1CgkJCQkJCQlvdXRwdXQ6IDQzCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqRGl2aW5nIGludG8gY29ubnRyYWNrIGxhYmVscyoqCgpBbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBgaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaGAgaGVhZGVyLiBTZWVtcyBsaWtlIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgY29ubnRyYWNrIGxhYmVsIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIGZvciB1bmRlcnN0YW5kaW5nIGhvdyBjb25uZWN0aW9uIHRyYWNraW5nIHVzZXMgbGFiZWxzLCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIEkmIzM5O20gc2hhcnAgb24gd2hhdCYjMzk7cyBkZWZpbmVkLiBBbHdheXMgYmV0dGVyIHRvIHJldmlldyB0aGUgZm91bmRhdGlvbmFsIHBpZWNlcyBiZWZvcmUgdGFja2xpbmcgYW55dGhpbmcgbW9yZSBjb21wbGV4IHJlbGF0ZWQgdG8gY29ubmVjdGlvbiB0cmFja2luZyBvciBpdHMgYXNzb2NpYXRlZCBOZXRmaWx0ZXIgbW9kdWxlcy4gSSBrbm93IHRoZSBnZW5lcmFsIGlkZWEsIGJ1dCBzcGVjaWZpY3MgYXJlIGltcG9ydGFudCwgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGJpdGZpZWxkcyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zIHdpdGhpbiBhIGtlcm5lbCBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyMDpcdC8qIENhbiYjMzk7dCB1c2UgbmZfY3RfZXh0X2ZpbmQoKSwgZmxvdyBkaXNzZWN0b3IgY2Fubm90IHVzZSBzeW1ib2xzXG4gIDIxOlx0ICogZXhwb3J0ZWQgYnkgbmZfY29ubnRyYWNrIG1vZHVsZS5cbiAgMjI6XHQgKi9cbiAgMjM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuICAyNDpcdHtcbiAgMjU6XHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcbiAgMjY6XHRcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVx1MDAzZWV4dDtcbiAgMjc6XHRcbiAgMjg6XHRcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxuICAyOTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzA6XHRcbiAgMzE6XHRcdHJldHVybiAodm9pZCAqKWN0LVx1MDAzZWV4dCAmIzQzOyBjdC1cdTAwM2VleHQtXHUwMDNlb2Zmc2V0W05GX0NUX0VYVF9MQUJFTFNdO1xuICAzMjpcdCNlbHNlXG4gIDMzOlx0XHRyZXR1cm4gTlVMTDtcbiAgMzQ6XHQjZW5kaWZcbiAgMzU6XHR9XG4gIDM2Olx0XG4gIDM3Olx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcbiAgMzg6XHR7XG4gIDM5Olx0I2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTXG4gIDQwOlx0XHRzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpO1xuICA0MTpcdFxuICA0MjpcdFx0aWYgKGF0b21pY19yZWFkKFx1MDAyNm5ldC1cdTAwM2VjdC5sYWJlbHNfdXNlZCkgPT0gMClcbiAgNDM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDQ0Olx0XG4gIDQ1Olx0XHRyZXR1cm4gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX0xBQkVMUywgR0ZQX0FUT01JQyk7XG4gIDQ2Olx0I2Vsc2VcbiAgNDc6XHRcdHJldHVybiBOVUxMO1xuICA0ODpcdCNlbmRpZlxuICA0OTpcdH1cbiAgNTA6XHRcbiAgNTE6XHRpbnQgbmZfY29ubmxhYmVsc19yZXBsYWNlKHN0cnVjdCBuZl9jb25uICpjdCxcbiAgNTI6XHRcdFx0XHQgIGNvbnN0IHUzMiAqZGF0YSwgY29uc3QgdTMyICptYXNrLCB1bnNpZ25lZCBpbnQgd29yZHMpO1xuICA1MzpcdFxuICA1NDpcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xuICA1NTpcdGludCBuZl9jb25ubGFiZWxzX2dldChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBiaXQpO1xuICA1NjpcdHZvaWQgbmZfY29ubmxhYmVsc19wdXQoc3RydWN0IG5ldCAqbmV0KTtcbiAgNTc6XHQjZWxzZVxuICA1ODpcdHN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm5sYWJlbHNfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGJpdCkgeyByZXR1cm4gMDsgfVxuICA1OTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25ubGFiZWxzX3B1dChzdHJ1Y3QgbmV0ICpuZXQpIHt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4NTQKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBgbmZfY3RfZXh0X2FkZGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBuZl9jdF9leHRfYWRkYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBmcmFtZXdvcmsuIE15IGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGl0JiMzOTtzIHJlc3BvbnNpYmxlIGZvciAqYWRkaW5nKiBzb21lIGZvcm0gb2YgZXh0ZW5zaW9uIGRhdGEgb3IgbWV0YWRhdGEgdG8gYSBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5LCBidXQgdGhlIHNwZWNpZmljcyBhcmUgY3J1Y2lhbC4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGl0cyBhcmd1bWVudHM6IHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgYWNjZXB0IGFzIGlucHV0LCBhbmQgd2hhdCBkb2VzIGl0IG1vZGlmeSBvciBhbGxvY2F0ZSB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnk/IEkmIzM5O2xsIHByb2JhYmx5IGJlIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgaW50ZXJhY3RzIHdpdGggdGhlIGBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlYCBhbmQgcG90ZW50aWFsbHkgdGhlIGFzc29jaWF0ZWQgYHN0cnVjdCBuZl9jb25uYCBvciBgc3RydWN0IG5mX2Nvbm5faGVscGAgc3RydWN0dXJlcy4KCkkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIHRoaW5ncyBsaWtlIGFkZGluZyBsYXllciA3IHByb3RvY29sIGlkZW50aWZpY2F0aW9uLCBzZXNzaW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRlZnVsIGZpcmV3YWxscywgb3Igb3RoZXIgYXBwbGljYXRpb24tbGF5ZXIgbWV0YWRhdGEuIFBlcmhhcHMgaXQgZGVhbHMgd2l0aCBJUHNlYyBzZWN1cml0eSBhc3NvY2lhdGlvbnMgKFNBcykgb3Igb3RoZXIgY29udGV4dC1zcGVjaWZpYyBkZXRhaWxzLiBNeSBjb25jZXJuIGlzIHRoZSBsb2NraW5nIHNjaGVtZSB1c2VkIGFuZCB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIHRyeSB0byBtb2RpZnkgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHNpbXVsdGFuZW91c2x5LiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBhbmQgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gQWRkaXRpb25hbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHdpdGggb3RoZXIgY29ubmVjdGlvbiB0cmFja2luZyBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSBpdHMgY2FsbCBncmFwaCB3aXRoaW4gdGhlIE5ldGZpbHRlciBzdWJzeXN0ZW0uIElzIHRoaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHk/IERvZXMgaXQgYmxvY2s/IEFsbCBpbXBvcnRhbnQgcXVlc3Rpb25zIHRvIGZ1bGx5IGdyYXNwIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25mX2N0X2V4dF9hZGQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYz0zMTk9Ym9vbCBuZl9jdF9lY2FjaGVfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIHUxNiBjdG1hc2ssIHUxNiBleHBtYXNrLCBnZnBfdCBnZnApXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMtMzQ1LVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmM6MzQ2Olx0ZSA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9FQ0FDSEUsIGdmcCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYy0zNDctXHRpZiAoZSkge1xuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jPTU3PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IHRvdGFsX2V4dGVuc2lvbl9zaXplKHZvaWQpXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtODktXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYzo5MDp2b2lkICpuZl9jdF9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBuZl9jdF9leHRfaWQgaWQsIGdmcF90IGdmcClcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTkxLXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYy0xMjgtfVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6MTI5OkVYUE9SVF9TWU1CT0wobmZfY3RfZXh0X2FkZCk7XG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmM9MTgzPW5mX2N0X2hlbHBlcl9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZ2ZwX3QgZ2ZwKVxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jLTE4Ni1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jOjE4NzpcdGhlbHAgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfSEVMUEVSLCBnZnApO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMtMTg4LVx0aWYgKGhlbHApIHtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmM9NDM0PWNvbm50cmFja19wcHRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jLTQ1OC1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYzo0NTk6XHRcdGlmICghbmF0IFx1MDAyNlx1MDAyNiAhbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX05BVCwgR0ZQX0FUT01JQykpXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMtNDYwLVx0XHRcdHJldHVybiBORl9EUk9QO1xuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYz03NDU9c3RydWN0IG5mX2Nvbm5fbmF0ICpuZl9jdF9uYXRfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG4tLVxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1MS1cdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSlcbm5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYzo3NTI6XHRcdG5hdCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1My1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzk4OAoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aGlua2luZywgZXhwcmVzc2VkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyBgbmZfY29ubnRyYWNrX2V4dGVuZC5jYCAoTGluZXMgOTAtMTI4KSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4gSSYjMzk7bSBmb2N1c2luZyBvbiBgbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmNgLCBzcGVjaWZpY2FsbHkgbGluZXMgOTAgdGhyb3VnaCAxMjguIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGhlcmUgd2l0aGluIHRoZSBjb25udHJhY2sgZXh0ZW5zaW9uIGZyYW1ld29yay4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHNlY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgb3IgbWFuYWdlbWVudCBvZiBjb25udHJhY2sgZXh0ZW5zaW9uIGRhdGEgc3RydWN0dXJlcy4gR2l2ZW4gdGhlIGNvbnRleHQsIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZXh0ZW5kaW5nIHRoZSBjb3JlIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBhZGRpdGlvbmFsIHN0YXRlIG9yIG1ldGFkYXRhLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBwYXJzZSB0aGUgY29kZSB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93LCBhbnkgbG9ja2luZyBtZWNoYW5pc21zIHVzZWQsIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyB0byBga21hbGxvY2AsIGBrZnJlZWAsIG9yIHNpbWlsYXIgbWVtb3J5IGZ1bmN0aW9ucywgYW5kIGxpa2VseSByZWZlcmVuY2VzIHRvIHRoZSBgbmZfY29ubmAgc3RydWN0dXJlIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciBtb2R1bGVzIG9yIE5BVCBzdWJzeXN0ZW1zLiBUaGUgZ29hbCBpcyB0byBncmFzcCBob3cgdGhlc2UgZXh0ZW5zaW9ucyBhcmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBjb25udHJhY2sgY29yZS4gTGV0JiMzOTtzIHN0YXJ0IHJlYWRpbmcgYW5kIHNlZSB3aGF0IGluc2lnaHRzIHRoaXMgc2VjdGlvbiByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA4NTpcdFx0XHQmIzQzOyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fYWN0X2N0X2V4dClcbiAgODY6XHQjZW5kaWZcbiAgODc6XHRcdDtcbiAgODg6XHR9XG4gIDg5Olx0XG4gIDkwOlx0dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXG4gIDkxOlx0e1xuICA5MjpcdFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmLCBvbGRsZW4sIGFsbG9jO1xuICA5MzpcdFx0c3RydWN0IG5mX2N0X2V4dCAqbmV3O1xuICA5NDpcdFxuICA5NTpcdFx0LyogQ29ubnRyYWNrIG11c3Qgbm90IGJlIGNvbmZpcm1lZCB0byBhdm9pZCByYWNlcyBvbiByZWFsbG9jYXRpb24uICovXG4gIDk2Olx0XHRXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpO1xuICA5NzpcdFxuICA5ODpcdFx0Lyogc3RydWN0IG5mX2N0X2V4dCB1c2VzIHU4IHRvIHN0b3JlIG9mZnNldHMvc2l6ZSAqL1xuICA5OTpcdFx0QlVJTERfQlVHX09OKHRvdGFsX2V4dGVuc2lvbl9zaXplKCkgXHUwMDNlIDI1NXUpO1xuIDEwMDpcdFxuIDEwMTpcdFx0aWYgKGN0LVx1MDAzZWV4dCkge1xuIDEwMjpcdFx0XHRjb25zdCBzdHJ1Y3QgbmZfY3RfZXh0ICpvbGQgPSBjdC1cdTAwM2VleHQ7XG4gMTAzOlx0XG4gMTA0Olx0XHRcdGlmIChfX25mX2N0X2V4dF9leGlzdChvbGQsIGlkKSlcbiAxMDU6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiAxMDY6XHRcdFx0b2xkbGVuID0gb2xkLVx1MDAzZWxlbjtcbiAxMDc6XHRcdH0gZWxzZSB7XG4gMTA4Olx0XHRcdG9sZGxlbiA9IHNpemVvZigqbmV3KTtcbiAxMDk6XHRcdH1cbiAxMTA6XHRcbiAxMTE6XHRcdG5ld29mZiA9IEFMSUdOKG9sZGxlbiwgX19hbGlnbm9mX18oc3RydWN0IG5mX2N0X2V4dCkpO1xuIDExMjpcdFx0bmV3bGVuID0gbmV3b2ZmICYjNDM7IG5mX2N0X2V4dF90eXBlX2xlbltpZF07XG4gMTEzOlx0XG4gMTE0Olx0XHRhbGxvYyA9IG1heChuZXdsZW4sIE5GX0NUX0VYVF9QUkVBTExPQyk7XG4gMTE1Olx0XHRuZXcgPSBrcmVhbGxvYyhjdC1cdTAwM2VleHQsIGFsbG9jLCBnZnApO1xuIDExNjpcdFx0aWYgKCFuZXcpXG4gMTE3Olx0XHRcdHJldHVybiBOVUxMO1xuIDExODpcdFxuIDExOTpcdFx0aWYgKCFjdC1cdTAwM2VleHQpXG4gMTIwOlx0XHRcdG1lbXNldChuZXctXHUwMDNlb2Zmc2V0LCAwLCBzaXplb2YobmV3LVx1MDAzZW9mZnNldCkpO1xuIDEyMTpcdFxuIDEyMjpcdFx0bmV3LVx1MDAzZW9mZnNldFtpZF0gPSBuZXdvZmY7XG4gMTIzOlx0XHRuZXctXHUwMDNlbGVuID0gbmV3bGVuO1xuIDEyNDpcdFx0bWVtc2V0KCh2b2lkICopbmV3ICYjNDM7IG5ld29mZiwgMCwgbmV3bGVuIC0gbmV3b2ZmKTtcbiAxMjU6XHRcbiAxMjY6XHRcdGN0LVx1MDAzZWV4dCA9IG5ldztcbiAxMjc6XHRcdHJldHVybiAodm9pZCAqKW5ldyAmIzQzOyBuZXdvZmY7XG4gMTI4Olx0fVxuIDEyOTpcdEVYUE9SVF9TWU1CT0wobmZfY3RfZXh0X2FkZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg5NzUKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA5NjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDb25udHJhY2sgRXh0ZW5zaW9uIGFuZCBPcGVuIHZTd2l0Y2ggSW50ZWdyYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTGluZSA5NiBpbiBgbmZfY3RfZXh0X2FkZGAgaXMgdGhlIGtleTogYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgLiAgVGhhdCYjMzk7cyBiZWNhdXNlIGEgY29uZmlybWVkIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgbWVhbnMgb3RoZXIgQ1BVcyAqY291bGQqIGJlIGFjY2Vzc2luZyBgY3QtJmd0O2V4dGAgY29uY3VycmVudGx5LiAgVGhlbiwgdGhlIGBrcmVhbGxvYyhjdC0mZ3Q7ZXh0LCBhbGxvYywgZ2ZwKWAgaW4gdGhlIHNhbWUgZnVuY3Rpb24gY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uLCBsZWFkaW5nIHRvIHVzZS1hZnRlci1mcmVlLCBvciBhIGBXQVJOX09OYCBzcGxhdCBpZiBpdCAqaXMqIGNvbmZpcm1lZCBhbmQgcmVhbGxvY2F0ZWQgY29uY3VycmVudGx5LgoKTm93LCBsb29raW5nIGF0IGBuZl9uYXRfY29yZS5jYCwgdGhlIGxvZ2ljIGluIGBuZl9jdF9uYXRfZXh0X2FkZGAgaXMgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzOiBpdCBjaGVja3MgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCAqYmVmb3JlKiBjYWxsaW5nIGBuZl9jdF9leHRfYWRkYC4gVGhpcyBpcyBnb29kIHByYWN0aWNlLiBCdXQsIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgd2hpY2ggKml0c2VsZiogY2FsbHMgYG5mX2N0X2V4dF9hZGRgIHdoZW4gdGhlIGVudHJ5ICppcyogY29uZmlybWVkIHRyaWdnZXJzIHRoZSBgV0FSTl9PTmAgYW5kIGludHJvZHVjZXMgYSByYWNlL1VBRiBzY2VuYXJpbyEKCkxldCYjMzk7cyBsb29rIGF0IHRoZSBwYXRjaCB0byBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4uLiBhaCwgaGVyZSB3ZSBnby4gVGhlIGZpeCBpcyB0byBhZGQgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCB0byB0aGUgYGlmICghY2wpYCBjb25kaXRpb24gaW4gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBUaGlzICpzaG91bGQqIHByZXZlbnQgdGhlIHByb2JsZW1hdGljIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgZnJvbSBiZWluZyBjYWxsZWQgd2hlbiBgY3RgIGlzIGNvbmZpcm1lZCwgcmlnaHQ/CgpCdXQsIGxldCYjMzk7cyBmb2xsb3cgdGhlIGNvbnRyb2wgZmxvdzogSWYgYGNsYCAqaXMqIE5VTEwgKGFuZCBgbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgaXMgZmFsc2UpLCB0aGUgYG92c19jdF9pbml0X2xhYmVsc2AgZnVuY3Rpb24gY2FsbHMgYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCwgY2hlY2tzIGZvciBOVUxMLCBhbmQgcmV0dXJucyBgLUVOT1NQQ2AgaWYgbm8gYGNsYCEgVGhlIGNvbW1lbnQgaW4gYG92c19jdF9pbml0X2xhYmVsc2AgbWFrZXMgaXQgc291bmQgbGlrZSBsYWJlbHMgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgb24gYSBuZXcsIHVuY29uZmlybWVkIGVudHJ5LCB0aGF0IGhhc24mIzM5O3QgYmVlbiBjb21taXR0ZWQsIHNvIG5vIGNvbmN1cnJlbnQgYWNjZXNzIGlzIGludm9sdmVkLgoKSW4gYG92c19jdF9zZXRfbGFiZWxzYCwgd2UgYWdhaW4gY2FsbCBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLiAgSWYgaXQgcmV0dXJucyBOVUxMLCB3ZSBhZ2FpbiBnZXQgYC1FTk9TUENgLiBBaGEhIFRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIG5vdyB0aGF0IHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkIGFuZCB0aGUgZXh0ZW5zaW9uIHdhc24mIzM5O3QgYXR0YWNoZWQuIFRoZW4gYGNsYCBpcyBOVUxMLiBUaGVuIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCByZXR1cm5zIE5VTEwuIFRoZW4gYG92c19jdF9zZXRfbGFiZWxzYCByZXR1cm5zIGAtRU5PU1BDYC4KCi4uLldhaXQgYSBtaW51dGUhICBJZiBpdCYjMzk7cyByZXR1cm5pbmcgYC1FTk9TUENgIHdoZW4gdGhlIGV4dGVuc2lvbiBpc24mIzM5O3QgdGhlcmUsIGFuZCB0aGUgY29ubmVjdGlvbiAqaXMqIGNvbmZpcm1lZCwgZG9lc24mIzM5O3QgdGhhdCBtZWFuIGBrZXktJmd0O2N0LmxhYmVsc2AgaXMgKnVuaW5pdGlhbGl6ZWQqPyBUaGUgZmxvdyBvZiBsb2dpYyBhcHBlYXJzIHNvdW5kLCBidXQuLi4gd2hlcmUgKmRvZXMqIGBrZXlgIGNvbWUgZnJvbSBpbiBgb3ZzX2N0X3NldF9sYWJlbHNgPyBXZSBtdXN0IGNoZWNrIHRoZSBjYWxsZXJzIG9mIGBvdnNfY3Rfc2V0X2xhYmVsc2AgdG8gZW5zdXJlIHRoaXMgaXNuJiMzOTt0IGFuIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3Rfc2V0X2xhYmVscyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzgxPXN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo0MjI6c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMy1cdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTAyNDpcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cdFx0XHRcdFx0XHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTY1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgQ29ubmVjdGlvbiBUcmFja2luZyBDb21taXQgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIHplcm8gaW4gb24gYG92c19jdF9jb21taXRgLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgY29kZSBhcm91bmQgbGluZSAxMDIwLCBsaWtlbHkgaW4gdGhlIG1haW4gT1ZTIGRhdGFwYXRoIGtlcm5lbCBtb2R1bGUuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIGlzIHdoZXJlIHRoZSBjcnVjaWFsIGNvbm5lY3Rpb24gdHJhY2tpbmcgZGVjaXNpb25zIGFyZSBmaW5hbGl6ZWQgYW5kIGVuZm9yY2VkIGFmdGVyIGEgZmxvdyBoYXMgdHJhdmVyc2VkIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hY2hpbmUuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyB0aGUgY29ubmVjdGlvbiBnZXRzIG1hcmtlZCBhcyBlc3RhYmxpc2hlZCBvciByZWxhdGVkLCBob3cgTkFUIGlzIGFwcGxpZWQgKGlmIHByZXNlbnQpLCBhbmQgaG93IHRoaXMgYWxsIGludGVyYWN0cyB3aXRoIHRoZSBjb25udHJhY2sgdGFibGUgZW50cmllcy4gSeKAmWxsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMgb3Igc3BpbmxvY2tzIHVzZWQgZm9yIGNvbmN1cnJlbmN5IGNvbnRyb2wsIGFueSBjYWxscyB0byBoZWxwZXIgZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRvIG9yIHVwZGF0aW5nIHRoZSBjb25udHJhY2sgdGFibGUsIGFuZCB0aGUgaGFuZGxpbmcgb2YgYW55IGFzc29jaWF0ZWQgZmxhZ3Mgb3IgbWV0YWRhdGEuIEkmIzM5O20gYWxzbyBjdXJpb3VzIHRvIHNlZSBob3cgYW55IGFzc29jaWF0ZWQgc2tiIGRhdGEgaXMgdXBkYXRlZCBvciBtb2RpZmllZCBhdCB0aGlzIGNvbW1pdCBzdGFnZS4gSXQmIzM5O3MgbGlrZWx5IHdlIHdpbGwgZmluZCBzb21lIG9mIHRoZSBjcml0aWNhbCBjb2RlIGZvciBwcm9wZXJseSBoYW5kbGluZyBhc3ltbWV0cmljIGZsb3dzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDk2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgOTYwOlx0c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4gOTYxOlx0XHRcdFx0IGNvbnN0IHN0cnVjdCBvdnNfY29ubnRyYWNrX2luZm8gKmluZm8sXG4gOTYyOlx0XHRcdFx0IHN0cnVjdCBza19idWZmICpza2IpXG4gOTYzOlx0e1xuIDk2NDpcdFx0ZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87XG4gOTY1Olx0XHRzdHJ1Y3QgbmZfY29ubiAqY3Q7XG4gOTY2Olx0XHRpbnQgZXJyO1xuIDk2NzpcdFxuIDk2ODpcdFx0ZXJyID0gX19vdnNfY3RfbG9va3VwKG5ldCwga2V5LCBpbmZvLCBza2IpO1xuIDk2OTpcdFx0aWYgKGVycilcbiA5NzA6XHRcdFx0cmV0dXJuIGVycjtcbiA5NzE6XHRcbiA5NzI6XHRcdC8qIFRoZSBjb25uZWN0aW9uIGNvdWxkIGJlIGludmFsaWQsIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIG5vLW9wLiovXG4gOTczOlx0XHRjdCA9IG5mX2N0X2dldChza2IsIFx1MDAyNmN0aW5mbyk7XG4gOTc0Olx0XHRpZiAoIWN0KVxuIDk3NTpcdFx0XHRyZXR1cm4gMDtcbiA5NzY6XHRcbiA5Nzc6XHQjaWZcdElTX0VOQUJMRUQoQ09ORklHX05FVEZJTFRFUl9DT05OQ09VTlQpXG4gOTc4Olx0XHRpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseShcdTAwMjZvdnNfY3RfbGltaXRfZW5hYmxlZCkpIHtcbiA5Nzk6XHRcdFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4gOTgwOlx0XHRcdFx0ZXJyID0gb3ZzX2N0X2NoZWNrX2xpbWl0KG5ldCwgc2tiLCBpbmZvKTtcbiA5ODE6XHRcdFx0XHRpZiAoZXJyKSB7XG4gOTgyOlx0XHRcdFx0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcJiMzNDtvcGVudnN3aXRjaDogem9uZTogJXUgXCYjMzQ7XG4gOTgzOlx0XHRcdFx0XHRcdFwmIzM0O2V4Y2VlZHMgY29ubnRyYWNrIGxpbWl0XFxuXCYjMzQ7LFxuIDk4NDpcdFx0XHRcdFx0XHRpbmZvLVx1MDAzZXpvbmUuaWQpO1xuIDk4NTpcdFx0XHRcdFx0cmV0dXJuIGVycjtcbiA5ODY6XHRcdFx0XHR9XG4gOTg3Olx0XHRcdH1cbiA5ODg6XHRcdH1cbiA5ODk6XHQjZW5kaWZcbiA5OTA6XHRcbiA5OTE6XHRcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxuIDk5MjpcdFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcbiA5OTM6XHRcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XG4gOTk0Olx0XHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxuIDk5NTpcdFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXG4gOTk2Olx0XHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcbiA5OTc6XHRcdCAqIG9wdGlvbi4gKi9cbiA5OTg6XHRcdGlmIChpbmZvLVx1MDAzZWhhdmVfZXZlbnRtYXNrKSB7XG4gOTk5Olx0XHRcdHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICpjYWNoZSA9IG5mX2N0X2VjYWNoZV9maW5kKGN0KTtcbjEwMDA6XHRcbjEwMDE6XHRcdFx0aWYgKGNhY2hlKVxuMTAwMjpcdFx0XHRcdGNhY2hlLVx1MDAzZWN0bWFzayA9IGluZm8tXHUwMDNlZXZlbnRtYXNrO1xuMTAwMzpcdFx0fVxuMTAwNDpcdFxuMTAwNTpcdFx0LyogQXBwbHkgY2hhbmdlcyBiZWZvcmUgY29uZmlybWluZyB0aGUgY29ubmVjdGlvbiBzbyB0aGF0IHRoZSBpbml0aWFsXG4xMDA2Olx0XHQgKiBjb25udHJhY2sgTkVXIG5ldGxpbmsgZXZlbnQgY2FycmllcyB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBDVFxuMTAwNzpcdFx0ICogYWN0aW9uLlxuMTAwODpcdFx0ICovXG4xMDA5Olx0XHRpZiAoaW5mby1cdTAwM2VtYXJrLm1hc2spIHtcbjEwMTA6XHRcdFx0ZXJyID0gb3ZzX2N0X3NldF9tYXJrKGN0LCBrZXksIGluZm8tXHUwMDNlbWFyay52YWx1ZSxcbjEwMTE6XHRcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlbWFyay5tYXNrKTtcbjEwMTI6XHRcdFx0aWYgKGVycilcbjEwMTM6XHRcdFx0XHRyZXR1cm4gZXJyO1xuMTAxNDpcdFx0fVxuMTAxNTpcdFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4xMDE2Olx0XHRcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy52YWx1ZSxcbjEwMTc6XHRcdFx0XHRcdFx0IFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spO1xuMTAxODpcdFx0XHRpZiAoZXJyKVxuMTAxOTpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDIwOlx0XG4xMDIxOlx0XHRcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcbjEwMjI6XHRcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXHUwMDI2XHUwMDI2XG4xMDIzOlx0XHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG4xMDI0Olx0XHRcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLnZhbHVlLFxuMTAyNTpcdFx0XHRcdFx0XHRcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy5tYXNrKTtcbjEwMjY6XHRcdFx0aWYgKGVycilcbjEwMjc6XHRcdFx0XHRyZXR1cm4gZXJyO1xuMTAyODpcdFx0fVxuMTAyOTpcdFx0LyogVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBzZW5kaW5nIHF1ZXVlZCBldmVudHMgZXZlbiBpZiB0aGUgY29ubmVjdGlvblxuMTAzMDpcdFx0ICogaXMgYWxyZWFkeSBjb25maXJtZWQuXG4xMDMxOlx0XHQgKi9cbjEwMzI6XHRcdGVyciA9IG5mX2Nvbm50cmFja19jb25maXJtKHNrYik7XG4xMDMzOlx0XG4xMDM0Olx0XHRyZXR1cm4gdmVyZGljdF90b19lcnJubyhlcnIpO1xuMTAzNTpcdH1cbjEwMzY6XHRcbjEwMzc6XHQvKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlBST0dSRVNTIGlmICYjMzk7c2tiJiMzOTsgaXMgc3RvbGVuLCBvciBvdGhlciBub256ZXJvXG4xMDM4Olx0ICogdmFsdWUgaWYgJiMzOTtza2ImIzM5OyBpcyBmcmVlZC5cbjEwMzk6XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI0OTIKCQkJCQkJCW91dHB1dDogMjEyCgkJCQkJCQl0aG91Z2h0czogMTE1NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBsb29raW5nIGF0IHRoaXMgQ29ubnRyYWNrIGxhYmVsIGhhbmRsaW5nIGNvZGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBhIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBhbmQgaXRzIGltcGFjdCBvbiBtZW1vcnkgc2FmZXR5LiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgYXJvdW5kIG1vZGlmeWluZyBvciBleHRlbmRpbmcgdGhlIGBjdC0mZ3Q7ZXh0YCBmaWVsZCBvZiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uIHRyYWNrIGVudHJ5IChgY3RgKS4gVGhlIG9yaWdpbmFsIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgd2FzIGJlaW5nIGNhbGxlZCBvbiBjb25maXJtZWQgY29ubmVjdGlvbnMsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBkYXRhIHJhY2UgYmVjYXVzZSBvZiByZWFsbG9jYXRpb24uCgpNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhlIGZpeCBhZGRyZXNzZXMgdGhpcyBieSBvbmx5IGFkZGluZyB0aGUgbGFiZWxzIGV4dGVuc2lvbiBpZiB0aGUgY29ubmVjdGlvbiBpc24mIzM5O3QgY29uZmlybWVkICphbmQqIHRoZSBsYWJlbHMgaGF2ZW4mIzM5O3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgbG9naWMgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaWYgdGhlIGNvbm5lY3Rpb24gaXNuJiMzOTt0IGNvbmZpcm1lZCwgaXQgY2FsbHMgYG92c19jdF9pbml0X2xhYmVsc2Agd2hpY2ggaXMgZmluZS4gSWYgdGhlIGNvbm5lY3Rpb24gKmlzKiBjb25maXJtZWQgYW5kIGxhYmVscyBhcmUgbmVlZGVkLCBpdCBjYWxscyBgb3ZzX2N0X3NldF9sYWJlbHNgLCBob3dldmVyIHdpdGggdGhpcyBwYXRjaCB0aGUgbGFiZWxzIGFyZSBvbmx5IGNyZWF0ZWQgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KCk5vdywgdGhlIGltcG9ydGFudCBxdWVzdGlvbjogZG9lcyB0aGlzIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzPyAgTGV0IG1lIGdvIHRocm91Z2ggbXkgdGhvdWdodCBwcm9jZXNzLgoKMS4gICoqV2hlbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBgTlVMTGA6KiogSWYgdGhlIGNvbm50cmFjayBlbnRyeSBpcyBjb25maXJtZWQsIGFuZCB0aGUgbGFiZWxzIGFyZSBub3QgYWxyZWFkeSBhbGxvY2F0ZWQsIGBvdnNfY3Rfc2V0X2xhYmVsc2Agd2lsbCByZXR1cm4gYC1FTk9TUENgLiBUaGlzIG1lYW5zIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQuCgoyLiAgKipPdGhlciBjYWxsZXJzIG9mIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYDoqKiBUaGVyZSBhcmUgb25seSBgb3ZzX2N0X2luaXRfbGFiZWxzYCBhbmQgYG92c19jdF9zZXRfbGFiZWxzYC4gIGBvdnNfY3RfaW5pdF9sYWJlbHNgIGhhbmRsZXMgdGhlIG5vbi1jb25maXJtZWQgY2FzZSwgc28gYWdhaW4sIG5vIGlzc3VlLgoKMy4gICoqYG5mX2N0X2xhYmVsc19leHRfYWRkYCBhbmQgaXRzIHN1cnJvdW5kaW5nczoqKiBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGFkZHJlc3NlZCBieSB0aGUgY29kZSBtb2RpZmljYXRpb24gaXMgYSBjb25jdXJyZW5jeSBidWcgd2l0aCByZWFsbG9jYXRpbmcgY29uZmlybWVkIGNvbm5lY3Rpb25zLCBsZWFkaW5nIHRvIHJhY2UgY29uZGl0aW9ucyBvciBVc2UgQWZ0ZXIgRnJlZSBzY2VuYXJpb3MuIEl0IGlzIG5vdCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeS4KCjQuICAqKkFyZSB0aGVyZSBhbnkgb3RoZXIga2VybmVsLXRvLXVzZXIgY29waWVzLCBwYWRkaW5nIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCByZWFkcywgb3IgdW5pbml0aWFsaXplZCBicmFuY2hlcyBhZmZlY3RlZD8qKiBJIGRvbiYjMzk7dCBzZWUgYW55dGhpbmcuIFRoZSBtYWluIGNoYW5nZSBhZGRzIGEgZ3VhcmQgY29uZGl0aW9uLiBUaGUgY29kZSBwYXRoIHJlbGF0ZWQgdG8gYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGFjY2Vzc2VzIHRoZSBgc3RhdHVzYCBiaXRmaWVsZCBvZiBgY3RgLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCB3aGVuIHRoZSBgY3RgIGlzIGNyZWF0ZWQuCgpTbywgYWZ0ZXIgdGhpcyByaWdvcm91cyBhbmFseXNpcywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzICpub3QqIGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gIFRoZSBleGlzdGluZyBLQVNBTiBhbmQgYFdBUk5fT05gIG1lY2hhbmlzbXMgc2hvdWxkIGhhbmRsZSB0aGUgY29uY3VycmVuY3kgaXNzdWUgYmVpbmcgZml4ZWQgaGVyZS4gIEtNU0FOIHdvdWxkIG5vdCBvZmZlciBhbnkgYWRkaXRpb25hbCBiZW5lZml0cy4gVGhlIGBOZWVkc0tNU0FOYCBmbGFnIGlzIGZhbHNlLiBUaGUgcmVhc29uaW5nIGlzIGNsZWFyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjM1Ljc0MDE0NTExMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDQ5OTE1Mzc5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHByZXZlbnRzIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKClgIG9uIGFuIGFscmVhZHkgY29uZmlybWVkIGNvbm50cmFjayBjb25uZWN0aW9uIChgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgKSwgYXZvaWRpbmcgYW4gaW52YWxpZCByZWFsbG9jYXRpb24gb2YgYGN0LVxcdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cXG5cXG5UaGUgY2hhbmdlIG1lcmVseSB0aWdodGVucyBhIGNvbmRpdGlvbmFsIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGV4dGVuc2lvbiBhbGxvY2F0aW9uOyBpdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zLCBvciBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS4gSWYgYGNsYCBpcyBOVUxMIG9uIGEgY29uZmlybWVkIGNvbm5lY3Rpb24sIGBvdnNfY3Rfc2V0X2xhYmVscygpYCBzYWZlbHkgcmV0dXJucyBgLUVOT1NQQ2Agd2l0aG91dCBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBUaGUgYnVnIGJlaW5nIGFkZHJlc3NlZCByZWxhdGVzIHRvIGNvbmN1cnJlbmN5LCBleHRlbnNpb24gbGlmZWN5Y2xlLCBhbmQgcG90ZW50aWFsIHVzZS1hZnRlci1mcmVlLCB3aGljaCBmYWxsIHVuZGVyIHN0YW5kYXJkIGtlcm5lbCB3YXJuaW5ncyBhbmQgS0FTQU4sIG5vdCBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6MzUuNzQwMTUxMTAyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mzk0OTQ1NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xcbmluZGV4IDI3MTE1OTY3ZTVkOTMuLjBmNDMzNjg4ZTE3YjkgMTAwNjQ0XFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXFxuKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXFxuQEAgLTM2Niw3ICszNjYsNyBAQCBzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4gXFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcXG4gXFxuIFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcbi1cXHRpZiAoIWNsKSB7XFxuK1xcdGlmICghY2wgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcXG4gXFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbiBcXHRcXHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcXG4gXFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODozNi4xODAzODYwODVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjc0MDk1MTg4MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk9QRU5WU1dJVENIXCIsXG4gICAgXCJORl9DT05OVFJBQ0tcIixcbiAgICBcIk5GX0NPTk5UUkFDS19MQUJFTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzXCIsXG4gICAgXCJvdnNfY3Rfc2V0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2luaXRfbGFiZWxzXCIsXG4gICAgXCJvdnNfY3RfY29tbWl0XCIsXG4gICAgXCJvdnNfY3RfZXhlY3V0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDlkYjYzZGY2YWRhYWVhMzQxZDM1ODE0YjU4NWEyYmQ2YmRmMTJlNzZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IFNlcCAxMiAxMzo1ODozNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xuaW5kZXggMjcxMTU5NjdlNWQ5My4uMGY0MzM2ODhlMTdiOSAxMDA2NDRcbi0tLSBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xuKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5AQCAtMzY2LDcgKzM2Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxuIFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiBcbiBcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuLVx0aWYgKCFjbCkge1xuK1x0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbiBcdFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xuIFx0XHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcbiBcdH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjM2LjE4MDM4OTU3NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE1NTMxMDM2Mjg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggZm9yIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLiBUaGUgZGlmZiBpdHNlbGYgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgaW4gdGhlIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBmdW5jdGlvbi4gSSBzZWUgdGhlIGNvbmRpdGlvbmFsIGNoZWNrIGhhcyBiZWVuIG1vZGlmaWVkLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHdlJ3JlIG5vdyBjaGVja2luZyAqYm90aCogaWYgYG5mX2N0X2xhYmVsc19maW5kKGN0KWAgcmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgKmFuZCogdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgdmlhIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAuIFRoaXMgaXMgaW50ZXJlc3Rpbmc7IGl0J3MgYSBzdWJ0bGUgYnV0IHBvdGVudGlhbGx5IHNpZ25pZmljYW50IGNoYW5nZSBpbiBob3cgY29ubmVjdGlvbiBsYWJlbHMgYXJlIGhhbmRsZWQsIHNwZWNpZmljYWxseSBhdCB0aGUgcG9pbnQgb2YgbGFiZWwgcmV0cmlldmFsLlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dC4gSSdsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBmb2N1c2luZyBhcm91bmQgbGluZSAzNjYuIEknbSB3b25kZXJpbmcgd2hhdCBzY2VuYXJpb3MgbWlnaHQgbGVhZCB0byBgbmZfY3RfbGFiZWxzX2ZpbmRgIHJldHVybmluZyBOVUxMLCBhbmQgd2h5IHdlJ3JlIG5vdyAqYWxzbyogY29uc2lkZXJpbmcgdGhlIGNvbmZpcm1lZCBzdGF0ZS4gUGVyaGFwcyB0aGVyZSdzIGEgcmFjZSBjb25kaXRpb24gdGhpcyBhZGRyZXNzZXMsIG9yIG1heWJlIGl0J3MgcmVsYXRlZCB0byBob3cgY29ubmVjdGlvbiB0cmFja2luZyBpcyBpbml0aWFsaXplZCBvciBjbGVhbmVkIHVwLiBJIGFsc28gbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBPcGVuIHZTd2l0Y2ggaXMgY29uZmlndXJlZCB0byB1c2UgdGhlIGNvbm50cmFjayBmdW5jdGlvbmFsaXR5LiBIb3cgZG9lcyBPcGVuIHZTd2l0Y2ggcmVhY2ggYW5kIHV0aWxpemUgdGhlc2UgZnVuY3Rpb25zP1xuXG5JJ2xsIG5lZWQgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgaG93IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBpcyBjYWxsZWQgYW5kLCBjcnVjaWFsbHksIGluIHdoYXQgc2l0dWF0aW9ucy4gSSdsbCBhbHNvIGJlIGxvb2tpbmcgYXQgdGhlIGNhbGxpbmcgY29udGV4dCB0byB1bmRlcnN0YW5kIHdoYXQgaW1wbGljYXRpb25zIHRoaXMgY2hhbmdlIGhhcyBvbiB0aGUgY29ubmVjdGlvbidzIHN0YXRlIGFuZCBkYXRhIHN0cnVjdHVyZXMuIEl0J3MgaW1wb3J0YW50IHRvIHNlZSBpZiB0aGVyZSBhcmUgYXNzb2NpYXRlZCBjaGFuZ2VzIG9yIGRlcGVuZGVuY2llcyBlbHNld2hlcmUgaW4gdGhlIGNvZGUuIEknbSBlc3BlY2lhbGx5IGtlZW4gdG8gc2VlIGhvdyB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgYW5kIHdoYXQgdGhlIGltcGxpY2F0aW9ucyBvZiBhIG5vdC1jb25maXJtZWQgY29ubmVjdGlvbiBhcmUuIEZyb20gdGhlcmUsIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgYnVnIGZpeCwgYW4gb3B0aW1pemF0aW9uLCBvciBzb21ldGhpbmcgbW9yZSBmdW5kYW1lbnRhbC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg4NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjUxLjcxMTQyODAxOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMzk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzUwOlxcdFxcdG5ld19tYXJrID0gY3RfbWFyayB8IChSRUFEX09OQ0UoY3QtXFx1MDAzZW1hcmspIFxcdTAwMjYgfihtYXNrKSk7XFxuIDM1MTpcXHRcXHRpZiAoUkVBRF9PTkNFKGN0LVxcdTAwM2VtYXJrKSAhPSBuZXdfbWFyaykge1xcbiAzNTI6XFx0XFx0XFx0V1JJVEVfT05DRShjdC1cXHUwMDNlbWFyaywgbmV3X21hcmspO1xcbiAzNTM6XFx0XFx0XFx0aWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpXFxuIDM1NDpcXHRcXHRcXHRcXHRuZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBjdCk7XFxuIDM1NTpcXHRcXHRcXHRrZXktXFx1MDAzZWN0Lm1hcmsgPSBuZXdfbWFyaztcXG4gMzU2OlxcdFxcdH1cXG4gMzU3OlxcdFxcbiAzNTg6XFx0XFx0cmV0dXJuIDA7XFxuIDM1OTpcXHQjZWxzZVxcbiAzNjA6XFx0XFx0cmV0dXJuIC1FTk9UU1VQUDtcXG4gMzYxOlxcdCNlbmRpZlxcbiAzNjI6XFx0fVxcbiAzNjM6XFx0XFxuIDM2NDpcXHRzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4gMzY1OlxcdHtcXG4gMzY2OlxcdFxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2w7XFxuIDM2NzpcXHRcXG4gMzY4OlxcdFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcbiAzNjk6XFx0XFx0aWYgKCFjbCBcXHUwMDI2XFx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbiAzNzA6XFx0XFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbiAzNzE6XFx0XFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuIDM3MjpcXHRcXHR9XFxuIDM3MzpcXHRcXG4gMzc0OlxcdFxcdHJldHVybiBjbDtcXG4gMzc1OlxcdH1cXG4gMzc2OlxcdFxcbiAzNzc6XFx0LyogSW5pdGlhbGl6ZSBsYWJlbHMgZm9yIGEgbmV3LCB5ZXQgdG8gYmUgY29tbWl0dGVkIGNvbm50cmFjayBlbnRyeS4gIE5vdGUgdGhhdFxcbiAzNzg6XFx0ICogc2luY2UgdGhlIG5ldyBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgY29uZmlybWVkLCBhbmQgdGh1cyBuby1vbmUgZWxzZSBoYXNcXG4gMzc5OlxcdCAqIGFjY2VzcyB0byBpdCdzIGxhYmVscywgd2Ugc2ltcGx5IHdyaXRlIHRoZW0gb3Zlci5cXG4gMzgwOlxcdCAqL1xcbiAzODE6XFx0c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gMzgyOlxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbiAzODM6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICptYXNrKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbCwgKm1hc3Rlcl9jbDtcXG4gMzg2OlxcdFxcdGJvb2wgaGF2ZV9tYXNrID0gbGFiZWxzX25vbnplcm8obWFzayk7XFxuIDM4NzpcXHRcXG4gMzg4OlxcdFxcdC8qIEluaGVyaXQgbWFzdGVyJ3MgbGFiZWxzIHRvIHRoZSByZWxhdGVkIGNvbm5lY3Rpb24/ICovXFxuIDM4OTpcXHRcXHRtYXN0ZXJfY2wgPSBjdC1cXHUwMDNlbWFzdGVyID8gbmZfY3RfbGFiZWxzX2ZpbmQoY3QtXFx1MDAzZW1hc3RlcikgOiBOVUxMO1xcbiAzOTA6XFx0XFxuIDM5MTpcXHRcXHRpZiAoIW1hc3Rlcl9jbCBcXHUwMDI2XFx1MDAyNiAhaGF2ZV9tYXNrKVxcbiAzOTI6XFx0XFx0XFx0cmV0dXJuIDA7ICAgLyogTm90aGluZyB0byBkby4gKi9cXG4gMzkzOlxcdFxcbiAzOTQ6XFx0XFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcXG4gMzk1OlxcdFxcdGlmICghY2wpXFxuIDM5NjpcXHRcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4gMzk3OlxcdFxcbiAzOTg6XFx0XFx0LyogSW5oZXJpdCB0aGUgbWFzdGVyJ3MgbGFiZWxzLCBpZiBhbnkuICovXFxuIDM5OTpcXHRcXHRpZiAobWFzdGVyX2NsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODo1MS43MTE1NDM5NjlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxODgxNzkyODgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIENhbGwgU2l0ZXMqKlxuXG5Pa2F5LCBJJ20gdGhpbmtpbmcgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCBvZiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AuIFRvIHJlYWxseSBncmFzcCBpdHMgcm9sZSBhbmQgcG90ZW50aWFsIGltcGFjdCwgSSBuZWVkIGEgaG9saXN0aWMgdmlldy4gSSdtIGdvaW5nIHRvIHRyYWNrIGRvd24gZXZlcnkgY2FsbCBzaXRlIGZvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIGlzbid0IGp1c3QgYWJvdXQgZmluZGluZyB3aGVyZSBpdCdzICp1c2VkKiwgYnV0ICpob3cqIGl0J3MgdXNlZCBhbmQgd2hhdCBkYXRhIGZsb3dzIGludG8gaXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cy4gS25vd2luZyB0aGUgZnVsbCBjYWxsaW5nIGNvbnRleHQgaXMga2V5IHRvIGFueSBkZWVwZXIgYW5hbHlzaXMsIHBhcnRpY3VsYXJseSB0byBpZGVudGlmeSBwb3NzaWJsZSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBzdWJ0bGUgYmVoYXZpb3JhbCBudWFuY2VzLiBTbywgbGV0J3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBjb2RlYmFzZSBhbmQgdHJhY2luZyB0aG9zZSBmdW5jdGlvbiBjYWxscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQxOSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6NTMuNTkzMzM4NzY5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNDQ5MTU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9nZXRfY29ubl9sYWJlbHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L29wZW52c3dpdGNoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY1LXtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXFx0aWYgKCFjbClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyOC1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5OlxcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQzMC1cXHRpZiAoIWNsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODo1My42NDU3OTI3NThaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyODM0NTAzNjQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGNvbm50cmFjay5jIChMaW5lcyA0MDAtNDUwKSoqXG5cbk9rYXksIHRpbWUgdG8gemVybyBpbi4gTGV0J3MgZ2V0IHJpZ2h0IGludG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgd2l0aGluIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLCBzcGVjaWZpY2FsbHkgYmV0d2VlbiBsaW5lcyA0MDAgYW5kIDQ1MC4gSSdtIGFzc3VtaW5nIHRoaXMgc2VjdGlvbiBsaWtlbHkgaW52b2x2ZXMgc29tZSBjb3JlIGNvbm50cmFjayBmdW5jdGlvbmFsaXR5LiBHaXZlbiB0aGUgZmlsZSBhbmQgZnVuY3Rpb24gbmFtaW5nIGNvbnZlbnRpb25zIGluIE9WUywgdGhpcyBwcm9iYWJseSBkZWFscyB3aXRoIHNvbWUgYXNwZWN0IG9mIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWFuaXB1bGF0aW9uLCBtYXliZSBhIGtleSB0cmFuc2l0aW9uIG9yIGEgbG9va3VwL2luc2VydGlvbiBvcGVyYXRpb24uIEknbGwgYmUgbG9va2luZyBmb3IgY2x1ZXMg4oCTIHZhcmlhYmxlIGFzc2lnbm1lbnRzLCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBmdW5jdGlvbiBjYWxscyDigJMgdGhhdCBpbGx1bWluYXRlIHRoZSBsb2dpYyBmbG93LlxuXG5JJ20gbWVudGFsbHkgcHJlcGFyaW5nIGZvciBwb3RlbnRpYWwgcGl0ZmFsbHMgbGlrZSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zLCBpbmVmZmljaWVudCBkYXRhIHN0cnVjdHVyZXMsIG9yIHVuZXhwZWN0ZWQgZWRnZSBjYXNlcy4gSSdsbCBiZSBtZW50YWxseSBwYXJzaW5nIGFueSBuZXN0ZWQgbG9vcHMgb3IgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYywgZm9jdXNpbmcgb24gaG93IGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZC4gSSdtIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBkYXRhcGF0aCwgd2hpY2ggaXMgYSBjb21tb24gYXJlYSBvZiBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIGluIGNvbm50cmFjayBpbXBsZW1lbnRhdGlvbnMuIEhvcGVmdWxseSwgdGhlIGNvZGUgY29tbWVudHMgYXJlIGRlc2NyaXB0aXZlLCBidXQgZXZlbiBpZiB0aGV5IGFyZW4ndCwgSSdtIHJlYWR5IHRvIGluZmVyIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBmcm9tIHRoZSBzdXJyb3VuZGluZyBjb2RlLlxuXG5NeSBvYmplY3RpdmUgaXMgdG8gZ3Jhc3AgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gYW5kIGhvdyBpdCBjb250cmlidXRlcyB0byB0aGUgb3ZlcmFsbCBjb25udHJhY2sgaW1wbGVtZW50YXRpb24uIE9uY2UgSSd2ZSBnb3R0ZW4gdGhpcyBzZWN0aW9uJ3MgbWVhbmluZyBjbGVhciwgSSBjYW4gZXZhbHVhdGUgaXRzIGRlc2lnbiBmb3IgYW55IHBvdGVudGlhbCBpc3N1ZXMuIElmIEkgZmluZCBzb21ldGhpbmcgdGhhdCBzZWVtcyB1bmNsZWFyIG9yIHBvdGVudGlhbGx5IHByb2JsZW1hdGljLCBJIGNhbiBmb2xsb3cgdGhlIGNhbGwgc3RhY2sgdG8gc2VlIHRoZSBicm9hZGVyIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTAyNCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjU2LjQ4MDI5ODc2NFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDAwOlxcdFxcdFxcdCpjbCA9ICptYXN0ZXJfY2w7XFxuIDQwMTpcXHRcXG4gNDAyOlxcdFxcdGlmIChoYXZlX21hc2spIHtcXG4gNDAzOlxcdFxcdFxcdHUzMiAqZHN0ID0gKHUzMiAqKWNsLVxcdTAwM2ViaXRzO1xcbiA0MDQ6XFx0XFx0XFx0aW50IGk7XFxuIDQwNTpcXHRcXG4gNDA2OlxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBPVlNfQ1RfTEFCRUxTX0xFTl8zMjsgaSsrKVxcbiA0MDc6XFx0XFx0XFx0XFx0ZHN0W2ldID0gKGRzdFtpXSBcXHUwMDI2IH5tYXNrLVxcdTAwM2VjdF9sYWJlbHNfMzJbaV0pIHxcXG4gNDA4OlxcdFxcdFxcdFxcdFxcdChsYWJlbHMtXFx1MDAzZWN0X2xhYmVsc18zMltpXVxcbiA0MDk6XFx0XFx0XFx0XFx0XFx0IFxcdTAwMjYgbWFzay1cXHUwMDNlY3RfbGFiZWxzXzMyW2ldKTtcXG4gNDEwOlxcdFxcdH1cXG4gNDExOlxcdFxcbiA0MTI6XFx0XFx0LyogTGFiZWxzIGFyZSBpbmNsdWRlZCBpbiB0aGUgSVBDVE5MX01TR19DVF9ORVcgZXZlbnQgb25seSBpZiB0aGVcXG4gNDEzOlxcdFxcdCAqIElQQ1RfTEFCRUwgYml0IGlzIHNldCBpbiB0aGUgZXZlbnQgY2FjaGUuXFxuIDQxNDpcXHRcXHQgKi9cXG4gNDE1OlxcdFxcdG5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0xBQkVMLCBjdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdG1lbWNweShcXHUwMDI2a2V5LVxcdTAwM2VjdC5sYWJlbHMsIGNsLVxcdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XFxuIDQxODpcXHRcXG4gNDE5OlxcdFxcdHJldHVybiAwO1xcbiA0MjA6XFx0fVxcbiA0MjE6XFx0XFxuIDQyMjpcXHRzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuIDQyMzpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbiA0MjQ6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXFxuIDQyNTpcXHR7XFxuIDQyNjpcXHRcXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xcbiA0Mjc6XFx0XFx0aW50IGVycjtcXG4gNDI4OlxcdFxcbiA0Mjk6XFx0XFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcXG4gNDMwOlxcdFxcdGlmICghY2wpXFxuIDQzMTpcXHRcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4gNDMyOlxcdFxcbiA0MzM6XFx0XFx0ZXJyID0gbmZfY29ubmxhYmVsc19yZXBsYWNlKGN0LCBsYWJlbHMtXFx1MDAzZWN0X2xhYmVsc18zMixcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICBtYXNrLVxcdTAwM2VjdF9sYWJlbHNfMzIsXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xcbiA0MzY6XFx0XFx0aWYgKGVycilcXG4gNDM3OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdG1lbWNweShcXHUwMDI2a2V5LVxcdTAwM2VjdC5sYWJlbHMsIGNsLVxcdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XFxuIDQ0MDpcXHRcXG4gNDQxOlxcdFxcdHJldHVybiAwO1xcbiA0NDI6XFx0fVxcbiA0NDM6XFx0XFxuIDQ0NDpcXHRzdGF0aWMgaW50IG92c19jdF9oYW5kbGVfZnJhZ21lbnRzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuIDQ0NTpcXHRcXHRcXHRcXHRcXHQgICB1MTYgem9uZSwgaW50IGZhbWlseSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4gNDQ2OlxcdHtcXG4gNDQ3OlxcdFxcdHN0cnVjdCBvdnNfc2tiX2NiIG92c19jYiA9ICpPVlNfQ0Ioc2tiKTtcXG4gNDQ4OlxcdFxcdGludCBlcnI7XFxuIDQ0OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6NTYuNDgwNDI0MzI0WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjU5MzgwODIyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBNeSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgZnVuY3Rpb24uIEdpdmVuIG15IGV4cGVydGlzZSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBicm9hZGVyIGZyYW1ld29yay4gSSdsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBkb2VzIGFuZCB3aGVyZSBpdCBmaXRzIHdpdGhpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUuIExldCdzIHNlZSBob3cgaXQgb3BlcmF0ZXMuIE15IHByaW9yaXR5IGlzIHRvIGdyYXNwIGl0cyBmdW5jdGlvbmFsaXR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MjE0LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowMy4wNzQyMzUxOVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM1Nzk4MzA3MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZl9jdF9sYWJlbHNfZXh0X2FkZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oPTIzPXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuLS1cXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM2LVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmg6Mzc6c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYz0xNzU0PWluaXRfY29ubnRyYWNrKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2Nvbm4gKnRtcGwsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5Mi1cXHRuZl9jdF90c3RhbXBfZXh0X2FkZChjdCwgR0ZQX0FUT01JQyk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzk0LVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jPTIyMjQ9Y3RuZXRsaW5rX2NyZWF0ZV9jb25udHJhY2soc3RydWN0IG5ldCAqbmV0LFxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXFx0bmZfY3RfZWNhY2hlX2V4dF9hZGQoY3QsIDAsIDAsIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYzoyMzA1OlxcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMtMjMwNi1cXHRuZmN0X3NlcWFkal9leHRfYWRkKGN0KTtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNjQ9c3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVxcdGlmICghY2wgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzcwOlxcdFxcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzcxLVxcdFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowNS40MzIyMjg1NjJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjA5MDU4NjUyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYG5mX2Nvbm50cmFja19sYWJlbHMuaGAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXNzZWN0IGBpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBjb25uZWN0aW9uIHRyYWNraW5nIGxhYmVscyBhcmUgaGFuZGxlZCBhdCBhIGdyYW51bGFyIGxldmVsLiBJIHN1c3BlY3QgSSdsbCBiZSByZXZpc2l0aW5nIHRoaXMgY29kZSB0byB1bmRlcnN0YW5kIGhvdyBhIHJlY2VudCBwZXJmb3JtYW5jZSBhbm9tYWx5IGlzIGludGVyYWN0aW5nIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIGZyYW1ld29yay4gSSdtIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgcGF0dGVybnMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB0aGUgbGFiZWwgbWFza3MgYW5kIGhvdyB0aGV5J3JlIHVzZWQgdG8gZWZmaWNpZW50bHkgZmlsdGVyIGFuZCBjbGFzc2lmeSBjb25uZWN0aW9ucyB3aXRoaW4gTmV0ZmlsdGVyLiBLbm93aW5nIHRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGludGVyYWN0cyBhdCB0aGUgcGFja2V0IGxldmVsLiBJdCdzIHRpbWUgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NzQsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowNy41MjI4MTc4OTlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0NjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbiAgIDI6XFx0XFxuICAgMzpcXHQjaWZuZGVmIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcXG4gICA0OlxcdCNkZWZpbmUgX05GX0NPTk5UUkFDS19MQUJFTFNfSFxcbiAgIDU6XFx0XFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaFxcdTAwM2VcXG4gICA3OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDEwOlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oXFx1MDAzZVxcbiAgMTE6XFx0I2luY2x1ZGUgXFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oXFx1MDAzZVxcbiAgMTI6XFx0I2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5sYWJlbC5oXFx1MDAzZVxcbiAgMTM6XFx0XFxuICAxNDpcXHQjZGVmaW5lIE5GX0NUX0xBQkVMU19NQVhfU0laRSAoKFhUX0NPTk5MQUJFTF9NQVhCSVQgKyAxKSAvIEJJVFNfUEVSX0JZVEUpXFxuICAxNTpcXHRcXG4gIDE2OlxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyB7XFxuICAxNzpcXHRcXHR1bnNpZ25lZCBsb25nIGJpdHNbTkZfQ1RfTEFCRUxTX01BWF9TSVpFIC8gc2l6ZW9mKGxvbmcpXTtcXG4gIDE4OlxcdH07XFxuICAxOTpcXHRcXG4gIDIwOlxcdC8qIENhbid0IHVzZSBuZl9jdF9leHRfZmluZCgpLCBmbG93IGRpc3NlY3RvciBjYW5ub3QgdXNlIHN5bWJvbHNcXG4gIDIxOlxcdCAqIGV4cG9ydGVkIGJ5IG5mX2Nvbm50cmFjayBtb2R1bGUuXFxuICAyMjpcXHQgKi9cXG4gIDIzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuICAyNDpcXHR7XFxuICAyNTpcXHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcXG4gIDI2OlxcdFxcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVxcdTAwM2VleHQ7XFxuICAyNzpcXHRcXG4gIDI4OlxcdFxcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdHJldHVybiAodm9pZCAqKWN0LVxcdTAwM2VleHQgKyBjdC1cXHUwMDNlZXh0LVxcdTAwM2VvZmZzZXRbTkZfQ1RfRVhUX0xBQkVMU107XFxuICAzMjpcXHQjZWxzZVxcbiAgMzM6XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzNDpcXHQjZW5kaWZcXG4gIDM1OlxcdH1cXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG4gIDM4OlxcdHtcXG4gIDM5OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTtcXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0aWYgKGF0b21pY19yZWFkKFxcdTAwMjZuZXQtXFx1MDAzZWN0LmxhYmVsc191c2VkKSA9PSAwKVxcbiAgNDM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA0NDpcXHRcXG4gIDQ1OlxcdFxcdHJldHVybiBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTEFCRUxTLCBHRlBfQVRPTUlDKTtcXG4gIDQ2OlxcdCNlbHNlXFxuICA0NzpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDQ4OlxcdCNlbmRpZlxcbiAgNDk6XFx0fVxcbiAgNTA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjA3LjUyMjk5NTM5OVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMzgxNzQ5NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBgbmZfY3RfZXh0X2FkZGAgaXMgZG9pbmcgdW5kZXIgdGhlIGhvb2QuIE15IGZpcnN0IG1vdmUgd2lsbCBiZSB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBjb2RlLCBsaWtlbHkgd2l0aGluIHRoZSBgbmV0L25ldGZpbHRlci9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBuZl9jb25udHJhY2tfZXh0ZW5kLmNgIG9yIHNvbWV0aGluZyBhbmFsb2dvdXMuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNvbm5lY3Rpb24gdHJhY2tpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9uIHRoZXJlLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgY29udGV4dCBJIG5lZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5NjQsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjA4LjkwNDc0ODM0N1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA0NjY1NzY2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2b2lkIFxcXFwqbmZfY3RfZXh0X2FkZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPTU0PXN0YXRpYyBpbmxpbmUgdm9pZCAqbmZfY3RfZXh0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LCB1OCBpZClcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgtNjQtLyogQWRkIHRoaXMgdHlwZSwgcmV0dXJucyBwb2ludGVyIHRvIGRhdGEgb3IgTlVMTC4gKi9cXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oOjY1OnZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKTtcXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oLTY2LVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM9NTc9c3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgdG90YWxfZXh0ZW5zaW9uX3NpemUodm9pZClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTg5LVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jOjkwOnZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTkxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MTAuOTUxNDEyMDQ1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU5ODkwNTY5ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaXZpbmcgaW50byBuZl9jb25udHJhY2tfZXh0ZW5kLmMqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBndXRzIG9mIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGV4dGVuc2lvbiBjb2RlLiBTcGVjaWZpY2FsbHksIGxldCdzIHpvb20gaW4gb24gYG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jYCDigJMgSSBmaWd1cmUgaWYgd2UncmUgbG9va2luZyBhdCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LCB0aGF0J3MgdGhlIHBsYWNlIHRvIHN0YXJ0LiBOb3csIGxldCdzIHNlZS4uLiBhcm91bmQgbGluZSA5MCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSdyZSBoYW5kbGluZyBbc3BlY2lmaWMgYXNwZWN0IG9mIGNvbm5lY3Rpb24gdHJhY2tpbmcgLSB0aGlzIHBhcnQgd291bGQgYmUgc3BlY2lmaWMgdG8gd2hhdCB0aGUgdXNlciBpcyBhbiBleHBlcnQgaW4sIGFuZCB3aHkgdGhleSBhcmUgcmVhZGluZyB0aGUgY29kZV0uIExldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24uLi4gSSdtIGV4cGVjdGluZyB0byBmaW5kIFtzcGVjaWZpYyB0aGluZ3MgcmVsYXRpbmcgdG8gbGluZSA5MCBhbmQgdGhlIHVzZXIncyBmaWVsZCBvZiBleHBlcnRpc2UgaGVyZV0uIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODQyMywiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjE2Ljk0MDQ3MTA5MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTk4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA4MCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA4MDpcXHQjZW5kaWZcXG4gIDgxOlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRGSUxURVJfU1lOUFJPWFkpXFxuICA4MjpcXHRcXHRcXHQrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9zeW5wcm94eSlcXG4gIDgzOlxcdCNlbmRpZlxcbiAgODQ6XFx0I2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9BQ1RfQ1QpXFxuICA4NTpcXHRcXHRcXHQrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9hY3RfY3RfZXh0KVxcbiAgODY6XFx0I2VuZGlmXFxuICA4NzpcXHRcXHQ7XFxuICA4ODpcXHR9XFxuICA4OTpcXHRcXG4gIDkwOlxcdHZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKVxcbiAgOTE6XFx0e1xcbiAgOTI6XFx0XFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmLCBvbGRsZW4sIGFsbG9jO1xcbiAgOTM6XFx0XFx0c3RydWN0IG5mX2N0X2V4dCAqbmV3O1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRcXHQvKiBDb25udHJhY2sgbXVzdCBub3QgYmUgY29uZmlybWVkIHRvIGF2b2lkIHJhY2VzIG9uIHJlYWxsb2NhdGlvbi4gKi9cXG4gIDk2OlxcdFxcdFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7XFxuICA5NzpcXHRcXG4gIDk4OlxcdFxcdC8qIHN0cnVjdCBuZl9jdF9leHQgdXNlcyB1OCB0byBzdG9yZSBvZmZzZXRzL3NpemUgKi9cXG4gIDk5OlxcdFxcdEJVSUxEX0JVR19PTih0b3RhbF9leHRlbnNpb25fc2l6ZSgpIFxcdTAwM2UgMjU1dSk7XFxuIDEwMDpcXHRcXG4gMTAxOlxcdFxcdGlmIChjdC1cXHUwMDNlZXh0KSB7XFxuIDEwMjpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmZfY3RfZXh0ICpvbGQgPSBjdC1cXHUwMDNlZXh0O1xcbiAxMDM6XFx0XFxuIDEwNDpcXHRcXHRcXHRpZiAoX19uZl9jdF9leHRfZXhpc3Qob2xkLCBpZCkpXFxuIDEwNTpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTA2OlxcdFxcdFxcdG9sZGxlbiA9IG9sZC1cXHUwMDNlbGVuO1xcbiAxMDc6XFx0XFx0fSBlbHNlIHtcXG4gMTA4OlxcdFxcdFxcdG9sZGxlbiA9IHNpemVvZigqbmV3KTtcXG4gMTA5OlxcdFxcdH1cXG4gMTEwOlxcdFxcbiAxMTE6XFx0XFx0bmV3b2ZmID0gQUxJR04ob2xkbGVuLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY3RfZXh0KSk7XFxuIDExMjpcXHRcXHRuZXdsZW4gPSBuZXdvZmYgKyBuZl9jdF9leHRfdHlwZV9sZW5baWRdO1xcbiAxMTM6XFx0XFxuIDExNDpcXHRcXHRhbGxvYyA9IG1heChuZXdsZW4sIE5GX0NUX0VYVF9QUkVBTExPQyk7XFxuIDExNTpcXHRcXHRuZXcgPSBrcmVhbGxvYyhjdC1cXHUwMDNlZXh0LCBhbGxvYywgZ2ZwKTtcXG4gMTE2OlxcdFxcdGlmICghbmV3KVxcbiAxMTc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmICghY3QtXFx1MDAzZWV4dClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MTYuOTQwNTM1MDcxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQ2MzU0ODQ4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgQ29ubnRyYWNrIEJ1ZyBpbiBPcGVuIHZTd2l0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIExpbmUgOTYgb2YgYG5mX2N0X2V4dF9hZGRgIGlzIHNjcmVhbWluZyBhdCBtZTogYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7YC4gVGhlIGNvbW1lbnQgc2F5cyBpdCBhbGw6IHdlIGFic29sdXRlbHkgKmNhbm5vdCogcmVhbGxvY2F0ZSBhIGNvbmZpcm1lZCBjb25udHJhY2sgZW50cnkuIEl0J3MgYSByYWNlIGNvbmRpdGlvbiB3YWl0aW5nIHRvIGhhcHBlbi5cblxuTm93LCBJIHNlZSB0aGUgcHJvYmxlbSBpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCB3YXMgY2FzdWFsbHkgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBldmVuIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgd2FzICphbHJlYWR5KiBjb25maXJtZWQhIFRoaXMgd291bGQgdHJpZ2dlciB0aGF0IGBXQVJOX09OYCBhbmQsIHdvcnNlLCBsZWFkIHRvIGEgYGtyZWFsbG9jYCBvbiBhIGNvbmZpcm1lZCBlbnRyeSDigJMgYSByZWNpcGUgZm9yIHJhY2VzIGFuZCBVc2VyLUFmdGVyLUZyZWUgdnVsbmVyYWJpbGl0aWVzLiBUaGlzIGlzIGNsYXNzaWMuXG5cblNvLCB0aGUgcHJvcG9zZWQgcGF0Y2ggaXMgYWRkaW5nIGEgY3J1Y2lhbCBjaGVjazpcblxuYGBgZGlmZlxuIFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4tXHRpZiAoIWNsKSB7XG4rXHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIFx0fVxuYGBgXG5cblRoYXQgbWFrZXMgc2Vuc2UuIE9ubHkgYWRkIHRoZSBsYWJlbHMgZXh0ZW5zaW9uIGlmIGl0ICpkb2Vzbid0KiBhbHJlYWR5IGV4aXN0IEFORCB0aGUgY29ubnRyYWNrIGVudHJ5IGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBwcmV2ZW50cyB0aGUgcHJvYmxlbWF0aWMgcmVhbGxvY2F0aW9uIG9uIGNvbmZpcm1lZCBlbnRyaWVzLlxuXG5Ob3csIGEgcXVpY2sgc2FuaXR5IGNoZWNrOiBpcyBPcGVuIHZTd2l0Y2ggZXZlbiBhY2Nlc3NpYmxlIGluIFN5emthbGxlcj8gQW5kLCB0aGUgYW5zd2VyIGlzIHllcywgdGhhdCdzIGdvb2QgbmV3cy4gT3BlbiB2U3dpdGNoIGlzIGEgZnVuZGFtZW50YWwgbmV0d29ya2luZyBtb2R1bGUgKGBDT05GSUdfT1BFTlZTV0lUQ0hgKSwgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIChgTkVUTElOS19HRU5FUklDYCwgZmFtaWx5IGBvdnNfZGF0YXBhdGhgLCBgb3ZzX3Zwb3J0YCwgYG92c19mbG93YCwgYG92c19wYWNrZXRgKS4gU3l6a2FsbGVyIGhhcyBzb2xpZCBzdXBwb3J0IGZvciB0aGUgT3BlbiB2U3dpdGNoIG5ldGxpbmsgaW50ZXJmYWNlLiBUaGUgZmFjdCB0aGF0IFN5emthbGxlciBoZWF2aWx5IGZ1enplZCB0aGUgY29ubnRyYWNrIGludGVncmF0aW9uIChgQ09ORklHX09QRU5WU1dJVENIX0dFTkVWRWAsIGBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU2AsIGBDT05GSUdfTkZfQ09OTlRSQUNLYCkgaW4gT3BlbiB2U3dpdGNoIG1ha2VzIG1lIGV2ZW4gbW9yZSBjb25maWRlbnQgdGhpcyBpcyBmaXhhYmxlIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgKnRlc3RhYmxlKiB0aHJvdWdoIHN5emthbGxlci4gTm93IHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTI3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjIxLjU3NjAzNTY2OFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NTc5NTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29ubnRyYWNrXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvTWFrZWZpbGU9MjE9aWZuZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDSyksKVxcbm5ldC9vcGVudnN3aXRjaC9NYWtlZmlsZToyMjpvcGVudnN3aXRjaC15ICs9IGNvbm50cmFjay5vXFxubmV0L29wZW52c3dpdGNoL01ha2VmaWxlLTIzLWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjIxLjYyNTYwMTgxN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg1MjM3MTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkV4YW1pbmluZyB0aGUgT3BlbiB2U3dpdGNoIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIE9wZW4gdlN3aXRjaCBjb25maWd1cmF0aW9uLiBMZXQncyBzdGFydCB3aXRoIHRoZSBgbmV0L29wZW52c3dpdGNoL0tjb25maWdgIGZpbGUuIFRoYXQncyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludC4gSXQnbGwgbGF5IG91dCB0aGUgY29yZSBmZWF0dXJlcyBhbmQgb3B0aW9ucyBhdmFpbGFibGUgZm9yIGNvbmZpZ3VyaW5nIE9wZW4gdlN3aXRjaCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgdG9wLWxldmVsIG1lbnUgc3RydWN0dXJlLCBkZXBlbmRlbmNpZXMgb24gb3RoZXIga2VybmVsIHN1YnN5c3RlbXMsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgb3IgY29uZmlndXJhdGlvbnMuIEknbSBhbHNvIGludGVyZXN0ZWQgaW4gYW55IG5ldyBvciBjaGFuZ2VkIG9wdGlvbnMgc2luY2UgbXkgbGFzdCBkZWVwIGRpdmUsIGVzcGVjaWFsbHkgYW55IHJlbGF0ZWQgdG8gcmVjZW50IHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciBuZXcgcHJvdG9jb2xzLiBUaGlzIEtjb25maWcgd2lsbCBnaXZlIG1lIGEgaGlnaC1sZXZlbCB2aWV3IGFuZCBhbnkgcG90ZW50aWFsIGVudHJ5IHBvaW50cyB0byBpbnZlc3RpZ2F0ZSBzcGVjaWZpYyBhc3BlY3RzIGluIG1vcmUgZGV0YWlsLiBJJ2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGVwZW5kZW5jaWVzIOKAkyB1bmRlcnN0YW5kaW5nIHdoYXQgbmVlZHMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgY2VydGFpbiBPcGVuIHZTd2l0Y2ggZmVhdHVyZXMgaXMgY3J1Y2lhbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzMTUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyMy43MTA4NDE5NTRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzQzOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgT3BlbiB2U3dpdGNoXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBPUEVOVlNXSVRDSFxcbiAgIDc6XFx0XFx0dHJpc3RhdGUgXFxcIk9wZW4gdlN3aXRjaFxcXCJcXG4gICA4OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDk6XFx0XFx0ZGVwZW5kcyBvbiAhTkZfQ09OTlRSQUNLIHx8IFxcXFxcXG4gIDEwOlxcdFxcdFxcdCAgIChORl9DT05OVFJBQ0sgXFx1MDAyNlxcdTAwMjYgKCghTkZfREVGUkFHX0lQVjYgfHwgTkZfREVGUkFHX0lQVjYpIFxcdTAwMjZcXHUwMDI2IFxcXFxcXG4gIDExOlxcdFxcdFxcdFxcdFxcdCAgICAgKCFORl9OQVQgfHwgTkZfTkFUKSBcXHUwMDI2XFx1MDAyNiBcXFxcXFxuICAxMjpcXHRcXHRcXHRcXHRcXHQgICAgICghTkVURklMVEVSX0NPTk5DT1VOVCB8fCBORVRGSUxURVJfQ09OTkNPVU5UKSkpXFxuICAxMzpcXHRcXHRkZXBlbmRzIG9uIFBTQU1QTEUgfHwgIVBTQU1QTEVcXG4gIDE0OlxcdFxcdHNlbGVjdCBNUExTXFxuICAxNTpcXHRcXHRzZWxlY3QgTkVUX0NSQzMyQ1xcbiAgMTY6XFx0XFx0c2VsZWN0IE5FVF9NUExTX0dTT1xcbiAgMTc6XFx0XFx0c2VsZWN0IERTVF9DQUNIRVxcbiAgMTg6XFx0XFx0c2VsZWN0IE5FVF9OU0hcXG4gIDE5OlxcdFxcdHNlbGVjdCBORl9DT05OVFJBQ0tfT1ZTIGlmIE5GX0NPTk5UUkFDS1xcbiAgMjA6XFx0XFx0c2VsZWN0IE5GX05BVF9PVlMgaWYgTkZfTkFUXFxuICAyMTpcXHRcXHRoZWxwXFxuICAyMjpcXHRcXHQgIE9wZW4gdlN3aXRjaCBpcyBhIG11bHRpbGF5ZXIgRXRoZXJuZXQgc3dpdGNoIHRhcmdldGVkIGF0IHZpcnR1YWxpemVkXFxuICAyMzpcXHRcXHQgIGVudmlyb25tZW50cy4gIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgYSB2YXJpZXR5IG9mIGZlYXR1cmVzXFxuICAyNDpcXHRcXHQgIGV4cGVjdGVkIGluIGEgdHJhZGl0aW9uYWwgaGFyZHdhcmUgc3dpdGNoLCBpdCBlbmFibGVzIGZpbmUtZ3JhaW5lZFxcbiAgMjU6XFx0XFx0ICBwcm9ncmFtbWF0aWMgZXh0ZW5zaW9uIGFuZCBmbG93LWJhc2VkIGNvbnRyb2wgb2YgdGhlIG5ldHdvcmsuICBUaGlzXFxuICAyNjpcXHRcXHQgIGNvbnRyb2wgaXMgdXNlZnVsIGluIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucyBidXQgaXNcXG4gIDI3OlxcdFxcdCAgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiBtdWx0aS1zZXJ2ZXIgdmlydHVhbGl6YXRpb24gZGVwbG95bWVudHMsXFxuICAyODpcXHRcXHQgIHdoaWNoIGFyZSBvZnRlbiBjaGFyYWN0ZXJpemVkIGJ5IGhpZ2hseSBkeW5hbWljIGVuZHBvaW50cyBhbmQgdGhlXFxuICAyOTpcXHRcXHQgIG5lZWQgdG8gbWFpbnRhaW4gbG9naWNhbCBhYnN0cmFjdGlvbnMgZm9yIG11bHRpcGxlIHRlbmFudHMuXFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdCAgVGhlIE9wZW4gdlN3aXRjaCBkYXRhcGF0aCBwcm92aWRlcyBhbiBpbi1rZXJuZWwgZmFzdCBwYXRoIGZvciBwYWNrZXRcXG4gIDMyOlxcdFxcdCAgZm9yd2FyZGluZy4gIEl0IGlzIGNvbXBsZW1lbnRlZCBieSBhIHVzZXJzcGFjZSBkYWVtb24sIG92cy12c3dpdGNoZCxcXG4gIDMzOlxcdFxcdCAgd2hpY2ggaXMgYWJsZSB0byBhY2NlcHQgY29uZmlndXJhdGlvbiBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZFxcbiAgMzQ6XFx0XFx0ICB0cmFuc2xhdGUgaXQgaW50byBwYWNrZXQgcHJvY2Vzc2luZyBydWxlcy5cXG4gIDM1OlxcdFxcbiAgMzY6XFx0XFx0ICBTZWUgaHR0cDovL29wZW52c3dpdGNoLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlcnNwYWNlXFxuICAzNzpcXHRcXHQgIHV0aWxpdGllcy5cXG4gIDM4OlxcdFxcbiAgMzk6XFx0XFx0ICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlXFxuICA0MDpcXHRcXHQgIGNhbGxlZCBvcGVudnN3aXRjaC5cXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyMy43MTA5MTc5MzRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzMwMjU2MzE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB3ZSBhY3R1YWxseSByZXF1aXJlIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTGV0J3MgZGl2ZSBpbnRvIHRoZSBjb2RlLiBMb29raW5nIGF0IGBpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oYCwgSSBzZWUgdGhlIGZ1bmN0aW9ucyBgbmZfY3RfbGFiZWxzX2ZpbmRgIGFuZCBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgLiAgRXNzZW50aWFsbHksIGlmIGBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXNuJ3QgZGVmaW5lZCwgYm90aCBmdW5jdGlvbnMganVzdCByZXR1cm4gYE5VTExgLiBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIHNwZWNpZmljYWxseSBjYWxscyBgbmZfY3RfZXh0X2FkZGAgaWYgdGhlIGNvbmZpZyBpcyBlbmFibGVkLCBhbG9uZyB3aXRoIGEgY2hlY2sgdGhhdCBgbmV0LVx1MDAzZWN0LmxhYmVsc191c2VkYCBpcyBncmVhdGVyIHRoYW4gemVyby4gU28gaWYgdGhlIGNvbmZpZyBpc24ndCBzZXQsIHRoZW4gdGhlIHdob2xlIGZlYXR1cmUgaXMgZWZmZWN0aXZlbHkgYnlwYXNzZWQuIFRoZSBgbmZfY3RfbGFiZWxzX2ZpbmRgIGZ1bmN0aW9uIGNoZWNrcyBmb3IgYW4gZXhpc3RpbmcgZXh0ZW5zaW9uLCBpZiB0aGUgY29uZmlnIGlzIG5vdCBwcmVzZW50LCBpdCBhbHNvIGp1c3QgcmV0dXJucyBgTlVMTGAuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyB3aGVyZSBgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNgIGl0c2VsZiBpcyBkZWZpbmVkLiBUaGF0J3MgYSBLY29uZmlnIG9wdGlvbiwgc28gSSBuZWVkIHRvIGNoZWNrIGBuZXQvbmV0ZmlsdGVyL0tjb25maWdgIHRvIGRldGVybWluZSBpdHMgb3JpZ2luIGFuZCBkZWZhdWx0IHZhbHVlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTE4MCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjI3LjAxMzQ4MzY5MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAxNzE4ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0ZmlsdGVyL0tjb25maWc9MTc3PWNvbmZpZyBORl9DT05OVFJBQ0tfVElNRVNUQU1QXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxODg6Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg5LVxcdGJvb2wgXFxcIkNvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyNy4wODM2NjAwMzFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTY3MTI4MTE3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipFeGFtaW5pbmcgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgTmV0ZmlsdGVyLCBhbmQgbGluZSAxODggc2VlbXMgbGlrZSBhIGxpa2VseSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGEgc3BlY2lmaWMgc2VjdGlvbi4gSSdtIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhIG9mIHRoZSBjb25maWd1cmF0aW9uLiBMZXQgbWUgc2VlIHdoYXQncyBnb2luZyBvbiB0aGVyZS4gSSdtIGV4cGVjdGluZyB0aGlzIHNlY3Rpb24gdG8gZGVhbCB3aXRoIGEgc3BlY2lmaWMgTmV0ZmlsdGVyIGZlYXR1cmUgb3IgbW9kdWxlLCBhbmQgbXkgZ29hbCBpcyB0byBncmFzcCB0aGUgcmVsZXZhbnQgc2V0dGluZ3MgYW5kIHRoZWlyIGltcGFjdC4gSG9wZWZ1bGx5LCBpdCdzIHdlbGwtY29tbWVudGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTkxMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjI4Ljc1NDk0NDI0NVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGZpbHRlci9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4NTpcXHRcXG4gMTg2OlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgYE4nLlxcbiAxODc6XFx0XFxuIDE4ODpcXHRjb25maWcgTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAxODk6XFx0XFx0Ym9vbCBcXFwiQ29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcXFwiXFxuIDE5MDpcXHRcXHRoZWxwXFxuIDE5MTpcXHRcXHQgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYXNzaWduaW5nIHVzZXItZGVmaW5lZCBmbGFnIGJpdHNcXG4gMTkyOlxcdFxcdCAgdG8gY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzLiAgSXQgY2FuIGJlIHVzZWQgd2l0aCB4dGFibGVzIGNvbm5sYWJlbFxcbiAxOTM6XFx0XFx0ICBtYXRjaCBhbmQgdGhlIG5mdGFibGVzIGN0IGV4cHJlc3Npb24uXFxuIDE5NDpcXHRcXG4gMTk1OlxcdGNvbmZpZyBORl9DT05OVFJBQ0tfT1ZTXFxuIDE5NjpcXHRcXHRib29sXFxuIDE5NzpcXHRcXG4gMTk4OlxcdGNvbmZpZyBORl9DVF9QUk9UT19HUkVcXG4gMTk5OlxcdFxcdGJvb2xcXG4gMjAwOlxcdFxcbiAyMDE6XFx0Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcXG4gMjAyOlxcdFxcdGJvb2wgJ1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0J1xcbiAyMDM6XFx0XFx0ZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRURcXG4gMjA0OlxcdFxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyOC43NTUwOTA2NjVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEzNzA0Njk2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gT3BlbiB2U3dpdGNoIENvbm50cmFjayBMYWJlbGluZyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBhc3BlY3RzIHdpdGhpbiBPcGVuIHZTd2l0Y2gsIHNwZWNpZmljYWxseSB0aGUgbGFiZWxpbmcgZnVuY3Rpb25hbGl0eS4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgbmVlZCB0byBnZXQgbXkgYmVhcmluZ3MuIEknbSB0aGlua2luZyBhYm91dCBgTkZfQ09OTlRSQUNLYCwgYE5GX0NPTk5UUkFDS19MQUJFTFNgLCBhbmQgaG93IGBPUEVOVlNXSVRDSGAgZml0cyBpbnRvIHRoaXMgd2hvbGUgcGljdHVyZS4gVGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrczogSSBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0aGUgbGFiZWwgc2V0dGluZyBhbmQgaW5pdGlhbGl6YXRpb24gaGFwcGVuIHdpdGhpbiB0aGUgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AgZmlsZS4gVGhlIGNvcmUgb2YgdGhpcyBpcyBnb2luZyB0byBiZSB0cmFjaW5nIHRoZSBjYWxscyB0byBgb3ZzX2N0X3NldF9sYWJlbHNgIGFuZCBgb3ZzX2N0X2luaXRfbGFiZWxzYC4gVW5kZXJzdGFuZGluZyB0aGVpciBjYWxsZXJzIHNob3VsZCBpbGx1bWluYXRlIHRoZSBjb250cm9sIGZsb3cgYW5kIGhvdyB0aGVzZSBsYWJlbHMgYXJlIGFjdHVhbGx5IG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgY29ubnRyYWNrIGNvbnRleHQuIExldCdzIHNlZSB3aGF0J3Mgd2hhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzNzEsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjMwLjg5MjE0NTcxMVoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUzMTA1NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwib3ZzX2N0X3NldF9sYWJlbHN8b3ZzX2N0X2luaXRfbGFiZWxzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzY0PXN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4MC0gKi9cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzgxOnN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4Mi1cXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjEtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyMjpzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMy1cXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE1LVxcdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDE2OlxcdFxcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLnZhbHVlLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE3LVxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXFx0XFx0ICAgbGFiZWxzX25vbnplcm8oXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy5tYXNrKSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDI0OlxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjUtXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy5tYXNrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MzAuOTM3NDYxNzlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzA4NjIxMTAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCB0ZXh0LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uOlxuXG4qKkRpc3NlY3RpbmcgdGhlIGBvdnNfY3RfY29tbWl0YCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IG9mIGBvdnNfY3RfY29tbWl0YC4gVG8gZ2V0IGEgaGFuZGxlIG9uIGl0LCBJJ2xsIHN0YXJ0IGJ5IHBpbnBvaW50aW5nIHRoZSByZWxldmFudCBjb2RlLiBUaGUgdGV4dCBwb2ludHMgbWUgdG8gbGluZXMgOTkwIHRvIDEwNDAgd2l0aGluIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIGNhbiBxdWlja2x5IHNraW0gdGhhdCBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgYW5kIGhvdyB0aGUgZnVuY3Rpb24gaXMgdXNlZC4gV2l0aCBteSBleHBlcmllbmNlLCBJIGNhbiBpbW1lZGlhdGVseSBpZGVudGlmeSB0aGUga2V5IGNvbnRyb2wgZmxvdyBtZWNoYW5pc21zIGludm9sdmVkLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMsIGFueSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBjaXJjdW1zdGFuY2VzIHRoYXQgdHJpZ2dlciB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24uIEZyb20gdGhlcmUgSSdsbCBoYXZlIGEgbXVjaCBiZXR0ZXIgaGFuZGxlIG9uIHdoZXJlIHRvIHByb2NlZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMTczLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MzQuMDIzNjc1NloiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk5MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk5MDpcXHRcXG4gOTkxOlxcdFxcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxcbiA5OTI6XFx0XFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcXG4gOTkzOlxcdFxcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XFxuIDk5NDpcXHRcXHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxcbiA5OTU6XFx0XFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXFxuIDk5NjpcXHRcXHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcXG4gOTk3OlxcdFxcdCAqIG9wdGlvbi4gKi9cXG4gOTk4OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VoYXZlX2V2ZW50bWFzaykge1xcbiA5OTk6XFx0XFx0XFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xcbjEwMDA6XFx0XFxuMTAwMTpcXHRcXHRcXHRpZiAoY2FjaGUpXFxuMTAwMjpcXHRcXHRcXHRcXHRjYWNoZS1cXHUwMDNlY3RtYXNrID0gaW5mby1cXHUwMDNlZXZlbnRtYXNrO1xcbjEwMDM6XFx0XFx0fVxcbjEwMDQ6XFx0XFxuMTAwNTpcXHRcXHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcXG4xMDA2OlxcdFxcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXFxuMTAwNzpcXHRcXHQgKiBhY3Rpb24uXFxuMTAwODpcXHRcXHQgKi9cXG4xMDA5OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VtYXJrLm1hc2spIHtcXG4xMDEwOlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbWFyayhjdCwga2V5LCBpbmZvLVxcdTAwM2VtYXJrLnZhbHVlLFxcbjEwMTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW5mby1cXHUwMDNlbWFyay5tYXNrKTtcXG4xMDEyOlxcdFxcdFxcdGlmIChlcnIpXFxuMTAxMzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjEwMTQ6XFx0XFx0fVxcbjEwMTU6XFx0XFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuMTAxNjpcXHRcXHRcXHRlcnIgPSBvdnNfY3RfaW5pdF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG4xMDE3OlxcdFxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMTg6XFx0XFx0XFx0aWYgKGVycilcXG4xMDE5OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyMDpcXHRcXG4xMDIxOlxcdFxcdFxcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcXG4xMDIyOlxcdFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXFx1MDAyNlxcdTAwMjZcXG4xMDIzOlxcdFxcdFxcdCAgIGxhYmVsc19ub256ZXJvKFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMubWFzaykpIHtcXG4xMDI0OlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxuMTAyNTpcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMjY6XFx0XFx0XFx0aWYgKGVycilcXG4xMDI3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyODpcXHRcXHR9XFxuMTAyOTpcXHRcXHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXFxuMTAzMDpcXHRcXHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cXG4xMDMxOlxcdFxcdCAqL1xcbjEwMzI6XFx0XFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcXG4xMDMzOlxcdFxcbjEwMzQ6XFx0XFx0cmV0dXJuIHZlcmRpY3RfdG9fZXJybm8oZXJyKTtcXG4xMDM1OlxcdH1cXG4xMDM2OlxcdFxcbjEwMzc6XFx0LyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5QUk9HUkVTUyBpZiAnc2tiJyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cXG4xMDM4OlxcdCAqIHZhbHVlIGlmICdza2InIGlzIGZyZWVkLlxcbjEwMzk6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjM0LjAyMzgzMDI4WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU4ODkwODkxNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgQ29ubnRyYWNrIExhYmVsIEhhbmRsaW5nIGluIE9wZW4gdlN3aXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBJJ3ZlIGZvdW5kIHNvbWV0aGluZyBpbnRlcmVzdGluZyBpbiB0aGUgT3BlbiB2U3dpdGNoIGNvbm50cmFjayBpbXBsZW1lbnRhdGlvbi4gSXQgbG9va3MgbGlrZSB3aGVuIGBjdGAgaXMgY29uZmlybWVk4oCUc3BlY2lmaWNhbGx5LCBpbiB0aGF0IGBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTKSBcdTAwMjZcdTAwMjYgbGFiZWxzX25vbnplcm8oXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzaykpYCBicmFuY2jigJRgb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgLi4uKWAgZ2V0cyBjYWxsZWQuIEluc2lkZSBgb3ZzX2N0X3NldF9sYWJlbHNgLCB3ZSBnbyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLlxuXG5QcmV2aW91c2x5LCBpZiBgY2xgICh0aGUgY29ubmVjdGlvbiBsYWJlbHMpIHdhcyBOVUxMIG9uIGEgKmNvbmZpcm1lZCogY29ubmVjdGlvbiwgaXQgd291bGQgY2FsbCBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCwgd2hpY2ggd291bGQgdHJpZ2dlciBhIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYC4gQnV0IG5vdywgKmFmdGVyKiB0aGlzIHBhdGNoLCB0aGUgY29uZGl0aW9uYWwgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCBtZWFucyB0aGF0IGlmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBOVUxMLCBhbmQgYG92c19jdF9zZXRfbGFiZWxzYCByZXR1cm5zIGAtRU5PU1BDYCBpbnN0ZWFkLiBUaGlzIGlzIGEgY3J1Y2lhbCBjaGFuZ2UgaW4gY29udHJvbCBmbG93IVxuXG5UaGlzIGNvZGUgKmlzKiByZWFjaGFibGUg4oCTIHdlJ3JlIHRhbGtpbmcgYWJvdXQgY29yZSBuZXR3b3JraW5nIGNvbXBvbmVudHMgKE9wZW4gdlN3aXRjaCBjb25udHJhY2spLiBVc2Vyc3BhY2UgY2FuIHNlbmQgT3BlbiB2U3dpdGNoIGZsb3dzIHRoYXQgc3BlY2lmeSBjb25udHJhY2sgYWN0aW9ucyB3aXRoIGxhYmVsIG1hc2tzIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgd2hpY2ggd291bGQgaGl0IHRoaXMgY29kZSBwYXRoIHZpYSB0aGUgbmV0bGluayBpbnRlcmZhY2VzIChgb3ZzX2N0X2V4ZWN1dGVgLCBgb3ZzX2V4ZWN1dGVfYWN0aW9uc2AsIGV0Yy4pLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhpcyBpcyByaXBlIGZvciBpbnZlc3RpZ2F0aW9uLlxuXG5TbywgaXMgaXQgd29ydGggZnV6emluZz8gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuKiAgICoqQ29yZSBTdWJzeXN0ZW1zOioqIFllcywgY29yZSBuZXR3b3JraW5nIChPcGVuIHZTd2l0Y2gsIGNvbm50cmFjaylcbiogICAqKlJlYWNoYWJsZSBjb2RlOioqIFllcywgT3BlbiB2U3dpdGNoIHZpYSBnZW5lcmljIG5ldGxpbmsuXG4qICAgKipNb2RpZmllZCBleGVjdXRhYmxlIGxvZ2ljOioqIFllcywgdGhlIGxvZ2ljIGluIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKClgIGhhcyBiZWVuIGNoYW5nZWQsIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIHRoZSBleHRlbnNpb24gYWRkaXRpb24gaWYgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkLlxuXG5BYnNvbHV0ZWx5LiBUaGlzIHdhcnJhbnRzIGZ1enppbmcuIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbk5vdywgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGZvY3VzLiBMZXQncyBsb29rIGF0IHRoZSBrZXkgc3ltYm9scy4gSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgY2hhbmdlLCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgYW5kIGl0cyBjYWxsZXJzLiBUaGUgaW1tZWRpYXRlIGNhbGxzIGFyZTogYG92c19jdF9pbml0X2xhYmVsc2AgYW5kIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGJvdGggc3RhdGljIGFuZCBjYWxsZWQgZnJvbSBgb3ZzX2N0X2NvbW1pdGAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBvdnNfY3RfZXhlY3V0ZWAuIEkgbmVlZCB0byBlbnN1cmUgSSBjaGVjayBjYWxsZXJzIG9mIGBvdnNfY3RfZXhlY3V0ZWAgYXMgd2VsbC4gVGhhdCBpcyB3aGVyZSBJIGNhbiBhcHBseSBmdXp6aW5nIGZvciB0aGlzIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDI0MywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc1NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjM5LjkxMjkyMTU0OFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQyOTU1NDQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9leGVjdXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jPTEyNTU9c3RhdGljIGludCBkb19leGVjdXRlX2FjdGlvbnMoc3RydWN0IGRhdGFwYXRoICpkcCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMtMTM4NS1cXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jOjEzODY6XFx0XFx0XFx0ZXJyID0gb3ZzX2N0X2V4ZWN1dGUob3ZzX2RwX2dldF9uZXQoZHApLCBza2IsIGtleSxcXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jLTEzODctXFx0XFx0XFx0XFx0XFx0ICAgICBubGFfZGF0YShhKSk7XFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9NTMyPXN0YXRpY1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo1MzM6c3RydWN0IG5mX2Nvbm4gKm92c19jdF9leGVjdXRlZChzdHJ1Y3QgbmV0ICpuZXQsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTUzNC1cXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01NjE9c3RhdGljIGJvb2wgc2tiX25mY3RfY2FjaGVkKHN0cnVjdCBuZXQgKm5ldCxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy01NzEtXFx0aWYgKCFjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NTcyOlxcdFxcdGN0ID0gb3ZzX2N0X2V4ZWN1dGVkKG5ldCwga2V5LCBpbmZvLCBza2IsIFxcdTAwMjZjdF9leGVjdXRlZCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTU3My1cXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAzOS0gKi9cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTA0MDppbnQgb3ZzX2N0X2V4ZWN1dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDQxLVxcdFxcdCAgIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTIzPWludCBvdnNfY3RfYWN0aW9uX3RvX2F0dHIoY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmgtMjQtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oOjI1OmludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBza19idWZmICosIHN0cnVjdCBzd19mbG93X2tleSAqLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNi1cXHRcXHQgICBjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICopO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTU5PXN0YXRpYyBpbmxpbmUgaW50IG92c19jdF9hY3Rpb25fdG9fYXR0cihjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICppbmZvLFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY0LVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaDo2NTpzdGF0aWMgaW5saW5lIGludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY2LVxcdFxcdFxcdFxcdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NDAuMzU1ODg2MzgxWiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU1MTU0OTM1NDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE9wZW4gdlN3aXRjaCBDb25udHJhY2sgRnVuY3Rpb25hbGl0eSBhbmQgRGVwZW5kZW5jaWVzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY29ubmVjdGlvbiB0cmFja2luZyAoY29ubnRyYWNrKSBsYWJlbHMgaW4gT3BlbiB2U3dpdGNoIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuIEkndmUgaWRlbnRpZmllZCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AsIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGBvdnNfY3RfaW5pdF9sYWJlbHNgLCBgb3ZzX2N0X2NvbW1pdGAsIGFuZCBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiwgYWxsIHJlc2lkaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBleHBvcnRlZCBgb3ZzX2N0X2V4ZWN1dGVgLiBJdCdzIHdvcnRoIG5vdGluZyB0aGVzZSBhcmUgYWxsIHN0YXRpYyBleGNlcHQgYG92c19jdF9leGVjdXRlYC5cblxuTm93LCB0aGUgY3JpdGljYWwgcXVlc3Rpb246IFdoYXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBuZWNlc3NhcnkgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byBjb21waWxlIGFuZCBydW4gY29ycmVjdGx5PyBGaXJzdCwgb2J2aW91c2x5IGBPUEVOVlNXSVRDSGAgaXMgcmVxdWlyZWQsIGdpdmVuIHRoZSBmaWxlbmFtZSBwYXRocy4gTG9va2luZyBhdCB0aGUgYE1ha2VmaWxlYCwgYE5GX0NPTk5UUkFDS2AgaXMgYWxzbyBhIG11c3QtaGF2ZTsgaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGBjb25udHJhY2sub2AgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG5cblRoZSBiaWcgb25lLCBob3dldmVyLCBpcyBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEkgc2VlIHRoaXMgaXMgZXNzZW50aWFsIGJlY2F1c2UgYG92c19jdF9zZXRfbGFiZWxzYCBpcyBvbmx5IGNhbGxlZCBpZiBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXMgZW5hYmxlZCwgYW5kIGlmIGl0J3Mgbm90IGVuYWJsZWQsIGNhbGxzIHRvIGZ1bmN0aW9ucyBsaWtlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYXJlIGVmZmVjdGl2ZWx5IG5vLW9wcy4gV2l0aG91dCB0aGlzLCBsYWJlbCBzZXR0aW5nIHdvbid0IGV2ZW4gaGFwcGVuIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucy4gVGhhdCBtYWtlcyBpdCBhIGhhcmQgZGVwZW5kZW5jeSBmb3IgbGFiZWwgZnVuY3Rpb25hbGl0eS5cblxuSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgdGhlIG90aGVyIGRlcGVuZGVuY2llcy4gUmV2aWV3aW5nIHRoZSBgS2NvbmZpZ2AgZmlsZXMgcmV2ZWFscyBhIHBvdGVudGlhbGx5IGNvbXBsZXggc2V0IG9mIGNvbmRpdGlvbnMgZm9yIGBPUEVOVlNXSVRDSGAgaXRzZWxmLCBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYElORVRgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGFzc29ydGVkIG90aGVyIG5ldGZpbHRlciBvcHRpb25zLCBidXQgdGhvc2Ugc2VlbSBsZXNzIGltbWVkaWF0ZWx5IGltcGFjdGZ1bC4gSSdsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB3aGV0aGVyIGBORl9DT05OVFJBQ0tfTEFCRUxTYCBpdHNlbGYgaGFzIGFueSBwcmVjb25kaXRpb25zIGZyb20gaXRzIGBLY29uZmlnYCBkZWZpbml0aW9uLCB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MzQ3LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODk5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjQ1Ljg3MTM4MTk2NFoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk0OTM4MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5GX0NPTk5UUkFDS1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0ZmlsdGVyXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz03ND1jb25maWcgTkVURklMVEVSX05FVExJTktfT1NGXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODEtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjgyOmNvbmZpZyBORl9DT05OVFJBQ0tcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODMtXFx0dHJpc3RhdGUgXFxcIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc9MTExPWNvbmZpZyBORVRGSUxURVJfQ09OTkNPVU5UXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTEzLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMTQ6Y29uZmlnIE5GX0NPTk5UUkFDS19NQVJLXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTExNS1cXHRib29sICAnQ29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTIyLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMjM6Y29uZmlnIE5GX0NPTk5UUkFDS19TRUNNQVJLXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTEyNC1cXHRib29sICAnQ29ubmVjdGlvbiB0cmFja2luZyBzZWN1cml0eSBtYXJrIHN1cHBvcnQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTM1LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMzY6Y29uZmlnIE5GX0NPTk5UUkFDS19aT05FU1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzctXFx0Ym9vbCAgJ0Nvbm5lY3Rpb24gdHJhY2tpbmcgem9uZXMnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxNDg6Y29uZmlnIE5GX0NPTk5UUkFDS19QUk9DRlNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ5LVxcdGJvb2wgXFxcIlN1cHBseSBDVCBsaXN0IGluIHByb2NmcyAoT0JTT0xFVEUpXFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE1Ni1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTU3OmNvbmZpZyBORl9DT05OVFJBQ0tfRVZFTlRTXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE1OC1cXHRib29sIFxcXCJDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50c1xcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNjYtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjE2Nzpjb25maWcgTkZfQ09OTlRSQUNLX1RJTUVPVVRcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTY4LVxcdGJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHRpbWVvdXQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc2LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxNzc6Y29uZmlnIE5GX0NPTk5UUkFDS19USU1FU1RBTVBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc4LVxcdGJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHRpbWVzdGFtcGluZydcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODctXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjE4ODpjb25maWcgTkZfQ09OTlRSQUNLX0xBQkVMU1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODktXFx0Ym9vbCBcXFwiQ29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk0LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxOTU6Y29uZmlnIE5GX0NPTk5UUkFDS19PVlNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk2LVxcdGJvb2xcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz0yMDE9Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMTEtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjIxMjpjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMTMtXFx0dHJpc3RhdGUgXFxcIkFtYW5kYSBiYWNrdXAgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjYtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjIyNzpjb25maWcgTkZfQ09OTlRSQUNLX0ZUUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjgtXFx0dHJpc3RhdGUgXFxcIkZUUCBwcm90b2NvbCBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTIzOC1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MjM5OmNvbmZpZyBORl9DT05OVFJBQ0tfSDMyM1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNDAtXFx0dHJpc3RhdGUgXFxcIkguMzIzIHByb3RvY29sIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjU3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNTg6Y29uZmlnIE5GX0NPTk5UUkFDS19JUkNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjU5LVxcdHRyaXN0YXRlIFxcXCJJUkMgRENDIHByb3RvY29sIHN1cHBvcnQgKG9ic29sZXRlKVxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzMtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjI3NDpjb25maWcgTkZfQ09OTlRSQUNLX0JST0FEQ0FTVFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzUtXFx0dHJpc3RhdGVcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjc2LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNzc6Y29uZmlnIE5GX0NPTk5UUkFDS19ORVRCSU9TX05TXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTI3OC1cXHR0cmlzdGF0ZSBcXFwiTmV0QklPUyBuYW1lIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yOTUtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjI5Njpjb25maWcgTkZfQ09OTlRSQUNLX1NOTVBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjk3LVxcdHRyaXN0YXRlIFxcXCJTTk1QIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMTAtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjMxMTpjb25maWcgTkZfQ09OTlRSQUNLX1BQVFBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzEyLVxcdHRyaXN0YXRlIFxcXCJQUHRQIHByb3RvY29sIHN1cHBvcnQgKGRlcHJlY2F0ZWQpXFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTMyOS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzMwOmNvbmZpZyBORl9DT05OVFJBQ0tfU0FORVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMzEtXFx0dHJpc3RhdGUgXFxcIlNBTkUgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNDItXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjM0Mzpjb25maWcgTkZfQ09OTlRSQUNLX1NJUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNDQtXFx0dHJpc3RhdGUgXFxcIlNJUCBwcm90b2NvbCBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTM1NC1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzU1OmNvbmZpZyBORl9DT05OVFJBQ0tfVEZUUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNTYtXFx0dHJpc3RhdGUgXFxcIlRGVFAgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NDUuOTIwODg2MzAzWiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQyODI3NDE4NDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgT3BlbiB2U3dpdGNoIENvbm5lY3Rpb24gVHJhY2tpbmcgd2l0aCBMYWJlbHMgRnV6emluZyBUYXJnZXQqKlxuXG5Pa2F5LCBsZXQncyBzb2xpZGlmeSB0aGlzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZSB0aGUgZW5hYmxpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGNvcnJlY3QgZm9yIHRoZSBPcGVuIHZTd2l0Y2ggY29ubmVjdGlvbiB0cmFja2luZyB3aXRoIGxhYmVscy4gTG9va2luZyBhdCB0aGUgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AsIGl0J3MgY2xlYXI6IGBORl9DT05OVFJBQ0tfTEFCRUxTYCBpcyBuZXN0ZWQgd2l0aGluIHRoZSBgaWYgTkZfQ09OTlRSQUNLYCBibG9jaywgd2hpY2ggaW4gdHVybiBkZXBlbmRzIG9uIGBORVRGSUxURVJgLiBUaHVzLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIE5vIHN1cnByaXNlcyB0aGVyZS5cblxuTm93LCBsZXQncyBydW4gdGhyb3VnaCB0aGUgZXZhbHVhdGlvbiBvbmUgbW9yZSB0aW1lLCBtYWtpbmcgc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nOlxuXG4xLiAgKipSZWFjaGFiaWxpdHk6KiogT3BlbiB2U3dpdGNoIGlzIGEgKnNvZnR3YXJlKiBkYXRhcGF0aCB3aXRoaW4gdGhlIGtlcm5lbC4gSXTigJlzIGNvbmZpZ3VyYWJsZSB2aWEgR2VuZXJpYyBOZXRsaW5rLCBzbyB3ZSdyZSBkZWFsaW5nIHdpdGggc3RhbmRhcmQgdmlydHVhbCBuZXR3b3JraW5nIHByaW1pdGl2ZXMuIE5vIHBoeXNpY2FsIGhhcmR3YXJlIGlzIGludm9sdmVkLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHZpcnR1YWwgZW52aXJvbm1lbnRzIGFuZCB0ZXN0YmVkcyAoUUVNVS9LVk0pLiBUaGUgZmFjdCB0aGF0IFN5emthbGxlciBoZWF2aWx5IGZ1enplcyB0aGUgT3BlbiB2U3dpdGNoIG5ldGxpbmsgaW50ZXJmYWNlLCBhbmQgcGFydGljdWxhcmx5IGNvbm5lY3Rpb24gdHJhY2tpbmcgYWN0aW9ucywgaXMgYSBzb2xpZCBpbmRpY2F0b3Igb2YgcmVhY2hhYmlsaXR5LiBDb25maXJtZWQuXG5cbjIuICAqKldvcnRoRnV6emluZzoqKiBUaGlzIGlzIGEgY2xlYXIgXCJ5ZXMuXCIgVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBhbmQgZGVhbHMgd2l0aCB0aGUgT3BlbiB2U3dpdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGFuZGxpbmcuIFNwZWNpZmljYWxseSwgaXQgaW52b2x2ZXMgbW9kaWZ5aW5nIHRoZSBsb2dpYyB3aGVuIGNvbm5lY3Rpb24gbGFiZWxzIGFyZSBhZGRlZCB0byBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5LiBUaGlzIGlzIGEgdmVyeSBpbnRlcmVzdGluZyBzcG90LiBXb3J0aCB0aGUgZWZmb3J0IVxuXG4zLiAgKipGb2N1c1N5bWJvbHM6KiogSSd2ZSBpZGVudGlmaWVkIHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgd2l0aGluIHRoaXMgYXJlYTogYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLCBgb3ZzX2N0X3NldF9sYWJlbHNgLCBgb3ZzX2N0X2luaXRfbGFiZWxzYCwgYG92c19jdF9jb21taXRgLCBhbmQgYG92c19jdF9leGVjdXRlYC4gVGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEknbSBpbnRlcmVzdGVkIGluIGFzIHBvdGVudGlhbCB0YXJnZXRzIGZvciBmdXp6aW5nLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG40LiAgKipFbmFibGVDb25maWdzOioqIEFnYWluLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEFic29sdXRlbHkgY29ycmVjdC5cblxuQWxyaWdodCwgZXZlcnl0aGluZyBsaW5lcyB1cCBwZXJmZWN0bHkuIE15IGFuYWx5c2lzIGlzIHNvbGlkLiBJJ20gZ29pbmcgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkwMDEsIk91dHB1dFRva2VucyI6MjA5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjUwLjIwMzYzMTM3NloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxOTM2MjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NTAuMjc1NTc4NTI1WiIsIlNlcSI6MzUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTk2MzcwMjI5MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjUwLjI3NjAwNjU0NVoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjU5OTYzMjY4MDkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cXHUwMDNlZXh0YCB0aGF0IHRyaWdnZXJzIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYCBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy91c2UtYWZ0ZXItZnJlZSBvbiBzaGFyZWQgY29ubnRyYWNrIGV4dGVuc2lvbnMuXFxuXFxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWRiNjNkZjZhZGFhZWEzNDFkMzU4MTRiNTg1YTJiZDZiZGYxMmU3NlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5pbmRleCAyNzExNTk2N2U1ZDkzLi4wZjQzMzY4OGUxN2I5IDEwMDY0NFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG4rKysgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcbkBAIC0zNjYsNyArMzY2LDcgQEAgc3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXG4gXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xuIFxuIFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4tXHRpZiAoIWNsKSB7XG4rXHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIFx0fVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NTAuMjc2MDA3Mzk1WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEzNDIxNDQxMTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuIFRoZSBjb3JlIG9mIGl0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IG1vZGlmaWVzIHRoZSBsb2dpYyBmb3IgcmV0cmlldmluZyBjb25uZWN0aW9uIGxhYmVscyAoYG5mX2Nvbm5fbGFiZWxzYCkgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyeSAoYG5mX2Nvbm5gKS5cblxuQ3VycmVudGx5LCB0aGUgY29kZSB0cmllcyB0byBmaW5kIGxhYmVscyB3aXRoIGBuZl9jdF9sYWJlbHNfZmluZChjdClgLiBJZiBpdCBkb2Vzbid0IGZpbmQgYW55LCBpdCBhZGRzIHRoZW0gd2l0aCBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBhbmQgdGhlbiB0cmllcyB0byBmaW5kIHRoZW0gYWdhaW4uIE1ha2VzIHNlbnNlLCB0aGF0J3MgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uIHBhdHRlcm4uXG5cblRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhpcyBjb25kaXRpb25hbDogYGlmICghY2wgXHUwMDI2XHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKWAuIEJlZm9yZSwgdGhlIGNvZGUgd291bGQgYWRkIHRoZSBsYWJlbHMgaWYgYGNsYCB3YXMgTlVMTC4gTm93LCBpdCBhZGRzIGxhYmVscyAqb25seSogaWYgYGNsYCBpcyBOVUxMICphbmQqIHRoZSBjb25uZWN0aW9uIGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIGl0IHN1Z2dlc3RzIHRoZSBvcmlnaW5hbCBjb2RlIGNvdWxkIGJlIG5lZWRsZXNzbHkgYWRkaW5nIGxhYmVscyBmb3IgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuXG5cbkkgaW1tZWRpYXRlbHkgd29uZGVyIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgaGVyZS4gQXJlIHRoZXJlIHBlcmZvcm1hbmNlIGltcGFjdHM/IElzIHRoaXMgYSBidWcgZml4LCBhbmQgYXJlIHdlIGluYWR2ZXJ0ZW50bHkgbWFraW5nIGEgY2hhbmdlIHRvIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHByb2Nlc3M/XG5cbkkgbmVlZCB0byBkaWcgaW50byB0aGUgYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGZ1bmN0aW9uIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gVGhhdCBmdW5jdGlvbiBsaWtlbHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIHBhc3NlZCBhIGNlcnRhaW4gc3RhdGUgb3IgaXMgc3RpbGwgaW4gYSBwcmVsaW1pbmFyeSBzdGFnZS4gSWYgdGhpcyBwYXRjaCBpcyBjb3JyZWN0LCB0aGVuIGFkZGluZyBsYWJlbHMgdG8gdW5jb25maXJtZWQgY29ubmVjdGlvbnMgaXMgdW5uZWNlc3NhcnksIHBvdGVudGlhbGx5IHdhc3RlZnVsLCBvciBldmVuIGJ1Z2d5LlxuXG5NeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byByZXZpZXcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIHVuZGVyc3RhbmQgdGhlIHVzZSBjYXNlcyB3aGVyZSBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgaXMgY2FsbGVkLiBJdCdzIGFsc28gaW1wb3J0YW50IHRvIGFuYWx5emUgd2hhdCBwcm9ibGVtcyB0aGlzIGNoYW5nZSBpcyBzb2x2aW5nLCBhbmQgZW5zdXJlIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmVncmVzc2lvbnMsIGxpa2UsIGZvciBpbnN0YW5jZSwgYSBjaGFuZ2UgaW4gYmVoYXZpb3VyIHdpdGggaG93IHVuY29uZmlybWVkIGNvbm5lY3Rpb25zIGFyZSBoYW5kbGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDk4LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjU4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MDMuNjk3NDUyMjQzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NjIyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzU1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzU1OlxcdFxcdFxcdGtleS1cXHUwMDNlY3QubWFyayA9IG5ld19tYXJrO1xcbiAzNTY6XFx0XFx0fVxcbiAzNTc6XFx0XFxuIDM1ODpcXHRcXHRyZXR1cm4gMDtcXG4gMzU5OlxcdCNlbHNlXFxuIDM2MDpcXHRcXHRyZXR1cm4gLUVOT1RTVVBQO1xcbiAzNjE6XFx0I2VuZGlmXFxuIDM2MjpcXHR9XFxuIDM2MzpcXHRcXG4gMzY0OlxcdHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbiAzNjU6XFx0e1xcbiAzNjY6XFx0XFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcXG4gMzY3OlxcdFxcbiAzNjg6XFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuIDM2OTpcXHRcXHRpZiAoIWNsIFxcdTAwMjZcXHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuIDM3MDpcXHRcXHRcXHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XFxuIDM3MTpcXHRcXHRcXHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcXG4gMzcyOlxcdFxcdH1cXG4gMzczOlxcdFxcbiAzNzQ6XFx0XFx0cmV0dXJuIGNsO1xcbiAzNzU6XFx0fVxcbiAzNzY6XFx0XFxuIDM3NzpcXHQvKiBJbml0aWFsaXplIGxhYmVscyBmb3IgYSBuZXcsIHlldCB0byBiZSBjb21taXR0ZWQgY29ubnRyYWNrIGVudHJ5LiAgTm90ZSB0aGF0XFxuIDM3ODpcXHQgKiBzaW5jZSB0aGUgbmV3IGNvbm5lY3Rpb24gaXMgbm90IHlldCBjb25maXJtZWQsIGFuZCB0aHVzIG5vLW9uZSBlbHNlIGhhc1xcbiAzNzk6XFx0ICogYWNjZXNzIHRvIGl0J3MgbGFiZWxzLCB3ZSBzaW1wbHkgd3JpdGUgdGhlbSBvdmVyLlxcbiAzODA6XFx0ICovXFxuIDM4MTpcXHRzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbiAzODI6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXFxuIDM4MzpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXFxuIDM4NDpcXHR7XFxuIDM4NTpcXHRcXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsLCAqbWFzdGVyX2NsO1xcbiAzODY6XFx0XFx0Ym9vbCBoYXZlX21hc2sgPSBsYWJlbHNfbm9uemVybyhtYXNrKTtcXG4gMzg3OlxcdFxcbiAzODg6XFx0XFx0LyogSW5oZXJpdCBtYXN0ZXIncyBsYWJlbHMgdG8gdGhlIHJlbGF0ZWQgY29ubmVjdGlvbj8gKi9cXG4gMzg5OlxcdFxcdG1hc3Rlcl9jbCA9IGN0LVxcdTAwM2VtYXN0ZXIgPyBuZl9jdF9sYWJlbHNfZmluZChjdC1cXHUwMDNlbWFzdGVyKSA6IE5VTEw7XFxuIDM5MDpcXHRcXG4gMzkxOlxcdFxcdGlmICghbWFzdGVyX2NsIFxcdTAwMjZcXHUwMDI2ICFoYXZlX21hc2spXFxuIDM5MjpcXHRcXHRcXHRyZXR1cm4gMDsgICAvKiBOb3RoaW5nIHRvIGRvLiAqL1xcbiAzOTM6XFx0XFxuIDM5NDpcXHRcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbiAzOTU6XFx0XFx0aWYgKCFjbClcXG4gMzk2OlxcdFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHQvKiBJbmhlcml0IHRoZSBtYXN0ZXIncyBsYWJlbHMsIGlmIGFueS4gKi9cXG4gMzk5OlxcdFxcdGlmIChtYXN0ZXJfY2wpXFxuIDQwMDpcXHRcXHRcXHQqY2wgPSAqbWFzdGVyX2NsO1xcbiA0MDE6XFx0XFxuIDQwMjpcXHRcXHRpZiAoaGF2ZV9tYXNrKSB7XFxuIDQwMzpcXHRcXHRcXHR1MzIgKmRzdCA9ICh1MzIgKiljbC1cXHUwMDNlYml0cztcXG4gNDA0OlxcdFxcdFxcdGludCBpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDowMy42OTc2MDA0NjNaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEyMzE5OTU1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCBmaWxlLiBUaGlzIHRlbGxzIG1lIEknbSBsaWtlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGljaCBwYXJ0cyBvZiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzIGFyZSB1c2luZyB0aGUgY29ubmVjdGlvbiBsYWJlbHMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIGZpbmQgdGhlIGxvY2F0aW9ucyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBpdHMgc2lnbmlmaWNhbmNlIGFuZCB0aGUgZGF0YSBmbG93IGluIHRoYXQgcGFydCBvZiB0aGUgY29kZS4gSSdsbCBuZWVkIHRvIHVzZSBlaXRoZXIgc3RhdGljIGFuYWx5c2lzIHRvb2xzIG9yIHNpbXBseSBuYXZpZ2F0ZSB0aGUgc291cmNlIGNvZGUgbG9va2luZyBmb3IgYWxsIHRoZSBjYWxscyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AuIE9uY2UgSSBoYXZlIGEgbGlzdCBvZiBhbGwgY2FsbHMsIEkgY2FuIHRoZW4gdW5kZXJzdGFuZCB3aHkgYW5kIHdoZW4gdGhlIGxhYmVscyBhcmUgYmVpbmcgcXVlcmllZC4gVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCBpbiBkaWdnaW5nIGRlZXBlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUzOCwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MDUuODIwODAyNzRaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODk1ODk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9nZXRfY29ubl9sYWJlbHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY1LXtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXFx0aWYgKCFjbClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyOC1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5OlxcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQzMC1cXHRpZiAoIWNsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDowNS44NjY3MTEyNDlaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjIwODQzMzY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkRpdmluZyBpbnRvIENvbm5lY3Rpb24gVHJhY2tpbmcgTGFiZWxzIGluIE9WUyBhbmQgTmV0ZmlsdGVyKipcblxuUmlnaHQsIHNvIEknbSBsb29raW5nIGF0IGBvdnNfY3Rfc2V0X2xhYmVsc2AgYW5kIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYW5kIGltbWVkaWF0ZWx5IG15IGV4cGVydCBtaW5kIGp1bXBzIHRvIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIE9wZW4gdlN3aXRjaCBhbmQgdGhlIE5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN5c3RlbS4gVGhlc2UgZnVuY3Rpb24gbmFtZXMgdGhlbXNlbHZlcyBoaW50IGF0IGxhYmVsIG1hbmlwdWxhdGlvbiBhbmQgZXh0ZW5zaW9uLCB3aGljaCBpcyBzdGFuZGFyZCBpbiBhbnkgcm9idXN0IGNvbm5lY3Rpb24gdHJhY2tpbmcgaW1wbGVtZW50YXRpb24uIFRoZSBjb3JlIHF1ZXN0aW9uLCBhcyBhbHdheXMsIGlzICp3aHkqIHRoYXQgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCBjaGVjaz8gV2hhdOKAmXMgdGhlIGNvbnRleHQgaXQncyBwcm90ZWN0aW5nLCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgd2UgbWFraW5nIGFib3V0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlPyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRoYXQgdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIGNvbm5lY3Rpb24ncyBsaWZlY3ljbGUgc3RhdGUuICpDb25maXJtZWQqIHN1Z2dlc3RzIGEgdHJhbnNpdGlvbiBwb2ludCwgYSB2YWxpZGF0aW9uIG9mIHRoZSB0cmFja2luZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBiZWZvcmUgaXQncyBkZWVtZWQgc3RhYmxlIG9yIHNhZmUgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLiBJIHdhbnQgdG8ga25vdyB3aGVuIHdlIGFyZSBhZGRpbmcgdGhlIGxhYmVscywgaWYgdGhleSBhcmUgYWRkZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIGNvbmZpcm1lZCwgYW5kIHdoeSB0aGF0IGlzIGRlc2lyZWQgb3Igbm90LiBBcmUgd2UgcG90ZW50aWFsbHkgYXZvaWRpbmcgcmFjZSBjb25kaXRpb25zIG9yIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3RzIHdpdGggaW1tYXR1cmUgY29ubmVjdGlvbiBlbnRyaWVzPyBMZXQncyB0cmFjZSBiYWNrIGZyb20gaGVyZSwgc2VlIGhvdyBpdCdzIGhhbmRsZWQgaW4gdGhlIE9WUyBjb2RlLCBhbmQgd2hhdCB0aGUgZXF1aXZhbGVudCBOZXRmaWx0ZXIgY29udGV4dCBzdWdnZXN0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDIxMCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjEyLjA3NTE0ODc1MVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQ4MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQyMDpcXHR9XFxuIDQyMTpcXHRcXG4gNDIyOlxcdHN0YXRpYyBpbnQgb3ZzX2N0X3NldF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gNDIzOlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXFxuIDQyNDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbWFzaylcXG4gNDI1OlxcdHtcXG4gNDI2OlxcdFxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2w7XFxuIDQyNzpcXHRcXHRpbnQgZXJyO1xcbiA0Mjg6XFx0XFxuIDQyOTpcXHRcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbiA0MzA6XFx0XFx0aWYgKCFjbClcXG4gNDMxOlxcdFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cXHUwMDNlY3RfbGFiZWxzXzMyLFxcbiA0MzQ6XFx0XFx0XFx0XFx0XFx0ICAgIG1hc2stXFx1MDAzZWN0X2xhYmVsc18zMixcXG4gNDM1OlxcdFxcdFxcdFxcdFxcdCAgICBPVlNfQ1RfTEFCRUxTX0xFTl8zMik7XFxuIDQzNjpcXHRcXHRpZiAoZXJyKVxcbiA0Mzc6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gNDM4OlxcdFxcbiA0Mzk6XFx0XFx0bWVtY3B5KFxcdTAwMjZrZXktXFx1MDAzZWN0LmxhYmVscywgY2wtXFx1MDAzZWJpdHMsIE9WU19DVF9MQUJFTFNfTEVOKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0cmV0dXJuIDA7XFxuIDQ0MjpcXHR9XFxuIDQ0MzpcXHRcXG4gNDQ0OlxcdHN0YXRpYyBpbnQgb3ZzX2N0X2hhbmRsZV9mcmFnbWVudHMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gNDQ1OlxcdFxcdFxcdFxcdFxcdCAgIHUxNiB6b25lLCBpbnQgZmFtaWx5LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbiA0NDY6XFx0e1xcbiA0NDc6XFx0XFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xcbiA0NDg6XFx0XFx0aW50IGVycjtcXG4gNDQ5OlxcdFxcbiA0NTA6XFx0XFx0ZXJyID0gbmZfY3RfaGFuZGxlX2ZyYWdtZW50cyhuZXQsIHNrYiwgem9uZSwgZmFtaWx5LCBcXHUwMDI2a2V5LVxcdTAwM2VpcC5wcm90bywgXFx1MDAyNm92c19jYi5tcnUpO1xcbiA0NTE6XFx0XFx0aWYgKGVycilcXG4gNDUyOlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQ1MzpcXHRcXG4gNDU0OlxcdFxcdC8qIFRoZSBrZXkgZXh0cmFjdGVkIGZyb20gdGhlIGZyYWdtZW50IHRoYXQgY29tcGxldGVkIHRoaXMgZGF0YWdyYW1cXG4gNDU1OlxcdFxcdCAqIGxpa2VseSBkaWRuJ3QgaGF2ZSBhbiBMNCBoZWFkZXIsIHNvIHJlZ2VuZXJhdGUgaXQuXFxuIDQ1NjpcXHRcXHQgKi9cXG4gNDU3OlxcdFxcdG92c19mbG93X2tleV91cGRhdGVfbDNsNChza2IsIGtleSk7XFxuIDQ1ODpcXHRcXHRrZXktXFx1MDAzZWlwLmZyYWcgPSBPVlNfRlJBR19UWVBFX05PTkU7XFxuIDQ1OTpcXHRcXHQqT1ZTX0NCKHNrYikgPSBvdnNfY2I7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjEyLjA3NTI3NTMzMVoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxODkzNjc4NzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipQZWVyaW5nIGludG8gdGhlIG5ldGZpbHRlciB3ZWVkcyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGZ1bmN0aW9uIGlzIGRvaW5nLiBUaW1lIHRvIGhpdCB0aGUgZ2l0IGxvZyBhbmQgc2VlIGlmIEkgY2FuIGZpbmQgc29tZSBjb21taXQgaGlzdG9yeS4gU2VhcmNoaW5nIGZvciBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIHNwZWNpZmljYWxseSBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIHNob3VsZCBwcm9iYWJseSBicm9hZGVuIHRoZSBzZWFyY2ggYSBsaXR0bGUgdG8gaW5jbHVkZSByZWxhdGVkIHRlcm1zIG9yIHZhcmlhdGlvbnMgb24gdGhlIGZ1bmN0aW9uIG5hbWUuIEEgZGVlcGVyIGRpdmUgaW50byB0aGUgY29tbWl0IG1lc3NhZ2VzIGFuZCBhbnkgcmVsYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgaG9wZWZ1bGx5IGlsbHVtaW5hdGUgdGhlIHJvbGUgdGhpcyBmdW5jdGlvbiBwbGF5cyBpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IGFuZCBpbnRlbnQgYmVoaW5kIGl0cyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGtleSB0byBncmFzcGluZyBpdHMgcHVycG9zZSB3aXRoaW4gdGhlIGxhcmdlciBuZXRmaWx0ZXIgZnJhbWV3b3JrLiBMZXQncyBzZWUgd2hhdCB0aGUgc291cmNlIGNvZGUgcmV2ZWFscyFcblxuXG4iLCJJbnB1dFRva2VucyI6NTIxMiwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MTMuOTY4OTU3MjUyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDk3NzM5MjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5mX2N0X2xhYmVsc19leHRfYWRkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmg9MjM9c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdClcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXFxuaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaDozNzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzgte1xcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jPTE3NTQ9aW5pdF9jb25udHJhY2soc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfY29ubiAqdG1wbCxcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVxcdG5mX2N0X3RzdGFtcF9leHRfYWRkKGN0LCBHRlBfQVRPTUlDKTtcXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM6MTc5MzpcXHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jLTE3OTQtXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMtMjMwNC1cXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jOjIzMDU6XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVxcdG5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjktXFx0aWYgKCFjbCBcXHUwMDI2XFx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjE1LjQ2NjcwNDExOFoiLCJTZXEiOjQ1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDkwMTUxNzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBjb25udHJhY2sgbGFiZWxzKipcblxuQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgYGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhgIGhlYWRlci4gU2VlbXMgbGlrZSBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNvbm50cmFjayBsYWJlbCBkZWZpbml0aW9ucy4gVGhpcyBmaWxlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgdW5kZXJzdGFuZGluZyBob3cgY29ubmVjdGlvbiB0cmFja2luZyB1c2VzIGxhYmVscywgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gc2hhcnAgb24gd2hhdCdzIGRlZmluZWQuIEFsd2F5cyBiZXR0ZXIgdG8gcmV2aWV3IHRoZSBmb3VuZGF0aW9uYWwgcGllY2VzIGJlZm9yZSB0YWNrbGluZyBhbnl0aGluZyBtb3JlIGNvbXBsZXggcmVsYXRlZCB0byBjb25uZWN0aW9uIHRyYWNraW5nIG9yIGl0cyBhc3NvY2lhdGVkIE5ldGZpbHRlciBtb2R1bGVzLiBJIGtub3cgdGhlIGdlbmVyYWwgaWRlYSwgYnV0IHNwZWNpZmljcyBhcmUgaW1wb3J0YW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggYml0ZmllbGRzIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMgd2l0aGluIGEga2VybmVsIGNvbnRleHQuIExldCdzIHNlZSB3aGF0J3Mgd2hhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjAxNSwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjE3LjU1Njg1ODM4NVoiLCJTZXEiOjQ2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MDAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDIwOlxcdC8qIENhbid0IHVzZSBuZl9jdF9leHRfZmluZCgpLCBmbG93IGRpc3NlY3RvciBjYW5ub3QgdXNlIHN5bWJvbHNcXG4gIDIxOlxcdCAqIGV4cG9ydGVkIGJ5IG5mX2Nvbm50cmFjayBtb2R1bGUuXFxuICAyMjpcXHQgKi9cXG4gIDIzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuICAyNDpcXHR7XFxuICAyNTpcXHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcXG4gIDI2OlxcdFxcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVxcdTAwM2VleHQ7XFxuICAyNzpcXHRcXG4gIDI4OlxcdFxcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdHJldHVybiAodm9pZCAqKWN0LVxcdTAwM2VleHQgKyBjdC1cXHUwMDNlZXh0LVxcdTAwM2VvZmZzZXRbTkZfQ1RfRVhUX0xBQkVMU107XFxuICAzMjpcXHQjZWxzZVxcbiAgMzM6XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzNDpcXHQjZW5kaWZcXG4gIDM1OlxcdH1cXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG4gIDM4OlxcdHtcXG4gIDM5OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTtcXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0aWYgKGF0b21pY19yZWFkKFxcdTAwMjZuZXQtXFx1MDAzZWN0LmxhYmVsc191c2VkKSA9PSAwKVxcbiAgNDM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA0NDpcXHRcXG4gIDQ1OlxcdFxcdHJldHVybiBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTEFCRUxTLCBHRlBfQVRPTUlDKTtcXG4gIDQ2OlxcdCNlbHNlXFxuICA0NzpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDQ4OlxcdCNlbmRpZlxcbiAgNDk6XFx0fVxcbiAgNTA6XFx0XFxuICA1MTpcXHRpbnQgbmZfY29ubmxhYmVsc19yZXBsYWNlKHN0cnVjdCBuZl9jb25uICpjdCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgY29uc3QgdTMyICpkYXRhLCBjb25zdCB1MzIgKm1hc2ssIHVuc2lnbmVkIGludCB3b3Jkcyk7XFxuICA1MzpcXHRcXG4gIDU0OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNTU6XFx0aW50IG5mX2Nvbm5sYWJlbHNfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGJpdCk7XFxuICA1NjpcXHR2b2lkIG5mX2Nvbm5sYWJlbHNfcHV0KHN0cnVjdCBuZXQgKm5ldCk7XFxuICA1NzpcXHQjZWxzZVxcbiAgNTg6XFx0c3RhdGljIGlubGluZSBpbnQgbmZfY29ubmxhYmVsc19nZXQoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgYml0KSB7IHJldHVybiAwOyB9XFxuICA1OTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubmxhYmVsc19wdXQoc3RydWN0IG5ldCAqbmV0KSB7fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoxNy41NTY5MzAyNTVaIiwiU2VxIjo0NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY0ODY2NjIzOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYG5mX2N0X2V4dF9hZGRgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYG5mX2N0X2V4dF9hZGRgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIE5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIGZyYW1ld29yay4gTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgaXQncyByZXNwb25zaWJsZSBmb3IgKmFkZGluZyogc29tZSBmb3JtIG9mIGV4dGVuc2lvbiBkYXRhIG9yIG1ldGFkYXRhIHRvIGEgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyeSwgYnV0IHRoZSBzcGVjaWZpY3MgYXJlIGNydWNpYWwuIEknbGwgbmVlZCB0byBsb29rIGF0IGl0cyBhcmd1bWVudHM6IHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgYWNjZXB0IGFzIGlucHV0LCBhbmQgd2hhdCBkb2VzIGl0IG1vZGlmeSBvciBhbGxvY2F0ZSB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnk/IEknbGwgcHJvYmFibHkgYmUgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBpbnRlcmFjdHMgd2l0aCB0aGUgYHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVgIGFuZCBwb3RlbnRpYWxseSB0aGUgYXNzb2NpYXRlZCBgc3RydWN0IG5mX2Nvbm5gIG9yIGBzdHJ1Y3QgbmZfY29ubl9oZWxwYCBzdHJ1Y3R1cmVzLlxuXG5JJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIHRoaW5ncyBsaWtlIGFkZGluZyBsYXllciA3IHByb3RvY29sIGlkZW50aWZpY2F0aW9uLCBzZXNzaW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRlZnVsIGZpcmV3YWxscywgb3Igb3RoZXIgYXBwbGljYXRpb24tbGF5ZXIgbWV0YWRhdGEuIFBlcmhhcHMgaXQgZGVhbHMgd2l0aCBJUHNlYyBzZWN1cml0eSBhc3NvY2lhdGlvbnMgKFNBcykgb3Igb3RoZXIgY29udGV4dC1zcGVjaWZpYyBkZXRhaWxzLiBNeSBjb25jZXJuIGlzIHRoZSBsb2NraW5nIHNjaGVtZSB1c2VkIGFuZCB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIHRyeSB0byBtb2RpZnkgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHNpbXVsdGFuZW91c2x5LiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBhbmQgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBBZGRpdGlvbmFsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBvdGhlciBjb25uZWN0aW9uIHRyYWNraW5nIGZ1bmN0aW9ucywgc3BlY2lmaWNhbGx5IGl0cyBjYWxsIGdyYXBoIHdpdGhpbiB0aGUgTmV0ZmlsdGVyIHN1YnN5c3RlbS4gSXMgdGhpcyBjYWxsZWQgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseT8gRG9lcyBpdCBibG9jaz8gQWxsIGltcG9ydGFudCBxdWVzdGlvbnMgdG8gZnVsbHkgZ3Jhc3AgaXRzIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Njg1NCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MjAuMjA1NTk5MjIzWiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODgzMDY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZl9jdF9leHRfYWRkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRmaWx0ZXIvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jPTMxOT1ib29sIG5mX2N0X2VjYWNoZV9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgdTE2IGN0bWFzaywgdTE2IGV4cG1hc2ssIGdmcF90IGdmcClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jLTM0NS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYzozNDY6XFx0ZSA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9FQ0FDSEUsIGdmcCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMtMzQ3LVxcdGlmIChlKSB7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYz01Nz1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCB0b3RhbF9leHRlbnNpb25fc2l6ZSh2b2lkKVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtODktXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6OTA6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtOTEte1xcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtMTI4LX1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYzoxMjk6RVhQT1JUX1NZTUJPTChuZl9jdF9leHRfYWRkKTtcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jPTE4Mz1uZl9jdF9oZWxwZXJfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGdmcF90IGdmcClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jLTE4Ni1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYzoxODc6XFx0aGVscCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9IRUxQRVIsIGdmcCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMtMTg4LVxcdGlmIChoZWxwKSB7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmM9NDM0PWNvbm50cmFja19wcHRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMtNDU4LVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYzo0NTk6XFx0XFx0aWYgKCFuYXQgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpKVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYy00NjAtXFx0XFx0XFx0cmV0dXJuIE5GX0RST1A7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmM9NzQ1PXN0cnVjdCBuZl9jb25uX25hdCAqbmZfY3RfbmF0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1MS1cXHRpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpXFxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jOjc1MjpcXHRcXHRuYXQgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTkFULCBHRlBfQVRPTUlDKTtcXG5uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMtNzUzLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoyMC4yNTQ0MzQ5MzNaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE3NzkyNzg0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aGlua2luZywgZXhwcmVzc2VkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIGBuZl9jb25udHJhY2tfZXh0ZW5kLmNgIChMaW5lcyA5MC0xMjgpKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4gSSdtIGZvY3VzaW5nIG9uIGBuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuY2AsIHNwZWNpZmljYWxseSBsaW5lcyA5MCB0aHJvdWdoIDEyOC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBoZXJlIHdpdGhpbiB0aGUgY29ubnRyYWNrIGV4dGVuc2lvbiBmcmFtZXdvcmsuIEknbSBndWVzc2luZyB0aGlzIHNlY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgb3IgbWFuYWdlbWVudCBvZiBjb25udHJhY2sgZXh0ZW5zaW9uIGRhdGEgc3RydWN0dXJlcy4gR2l2ZW4gdGhlIGNvbnRleHQsIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZXh0ZW5kaW5nIHRoZSBjb3JlIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBhZGRpdGlvbmFsIHN0YXRlIG9yIG1ldGFkYXRhLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IHBhcnNlIHRoZSBjb2RlIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGZsb3csIGFueSBsb2NraW5nIG1lY2hhbmlzbXMgdXNlZCwgbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSSdtIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgdG8gYGttYWxsb2NgLCBga2ZyZWVgLCBvciBzaW1pbGFyIG1lbW9yeSBmdW5jdGlvbnMsIGFuZCBsaWtlbHkgcmVmZXJlbmNlcyB0byB0aGUgYG5mX2Nvbm5gIHN0cnVjdHVyZSBhbmQgcG90ZW50aWFsIGludGVyYWN0aW9uIHdpdGggY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIgbW9kdWxlcyBvciBOQVQgc3Vic3lzdGVtcy4gVGhlIGdvYWwgaXMgdG8gZ3Jhc3AgaG93IHRoZXNlIGV4dGVuc2lvbnMgYXJlIGludGVncmF0ZWQgaW50byB0aGUgY29ubnRyYWNrIGNvcmUuIExldCdzIHN0YXJ0IHJlYWRpbmcgYW5kIHNlZSB3aGF0IGluc2lnaHRzIHRoaXMgc2VjdGlvbiByZXZlYWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTg4LCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MjIuNDMyMzY0Njc4WiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDg1LFxuICBcIkxpbmVDb3VudFwiOiA0NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDg1OlxcdFxcdFxcdCsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX2FjdF9jdF9leHQpXFxuICA4NjpcXHQjZW5kaWZcXG4gIDg3OlxcdFxcdDtcXG4gIDg4OlxcdH1cXG4gIDg5OlxcdFxcbiAgOTA6XFx0dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXFxuICA5MTpcXHR7XFxuICA5MjpcXHRcXHR1bnNpZ25lZCBpbnQgbmV3bGVuLCBuZXdvZmYsIG9sZGxlbiwgYWxsb2M7XFxuICA5MzpcXHRcXHRzdHJ1Y3QgbmZfY3RfZXh0ICpuZXc7XFxuICA5NDpcXHRcXG4gIDk1OlxcdFxcdC8qIENvbm50cmFjayBtdXN0IG5vdCBiZSBjb25maXJtZWQgdG8gYXZvaWQgcmFjZXMgb24gcmVhbGxvY2F0aW9uLiAqL1xcbiAgOTY6XFx0XFx0V0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKTtcXG4gIDk3OlxcdFxcbiAgOTg6XFx0XFx0Lyogc3RydWN0IG5mX2N0X2V4dCB1c2VzIHU4IHRvIHN0b3JlIG9mZnNldHMvc2l6ZSAqL1xcbiAgOTk6XFx0XFx0QlVJTERfQlVHX09OKHRvdGFsX2V4dGVuc2lvbl9zaXplKCkgXFx1MDAzZSAyNTV1KTtcXG4gMTAwOlxcdFxcbiAxMDE6XFx0XFx0aWYgKGN0LVxcdTAwM2VleHQpIHtcXG4gMTAyOlxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZl9jdF9leHQgKm9sZCA9IGN0LVxcdTAwM2VleHQ7XFxuIDEwMzpcXHRcXG4gMTA0OlxcdFxcdFxcdGlmIChfX25mX2N0X2V4dF9leGlzdChvbGQsIGlkKSlcXG4gMTA1OlxcdFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxMDY6XFx0XFx0XFx0b2xkbGVuID0gb2xkLVxcdTAwM2VsZW47XFxuIDEwNzpcXHRcXHR9IGVsc2Uge1xcbiAxMDg6XFx0XFx0XFx0b2xkbGVuID0gc2l6ZW9mKCpuZXcpO1xcbiAxMDk6XFx0XFx0fVxcbiAxMTA6XFx0XFxuIDExMTpcXHRcXHRuZXdvZmYgPSBBTElHTihvbGRsZW4sIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jdF9leHQpKTtcXG4gMTEyOlxcdFxcdG5ld2xlbiA9IG5ld29mZiArIG5mX2N0X2V4dF90eXBlX2xlbltpZF07XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdGFsbG9jID0gbWF4KG5ld2xlbiwgTkZfQ1RfRVhUX1BSRUFMTE9DKTtcXG4gMTE1OlxcdFxcdG5ldyA9IGtyZWFsbG9jKGN0LVxcdTAwM2VleHQsIGFsbG9jLCBnZnApO1xcbiAxMTY6XFx0XFx0aWYgKCFuZXcpXFxuIDExNzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTE4OlxcdFxcbiAxMTk6XFx0XFx0aWYgKCFjdC1cXHUwMDNlZXh0KVxcbiAxMjA6XFx0XFx0XFx0bWVtc2V0KG5ldy1cXHUwMDNlb2Zmc2V0LCAwLCBzaXplb2YobmV3LVxcdTAwM2VvZmZzZXQpKTtcXG4gMTIxOlxcdFxcbiAxMjI6XFx0XFx0bmV3LVxcdTAwM2VvZmZzZXRbaWRdID0gbmV3b2ZmO1xcbiAxMjM6XFx0XFx0bmV3LVxcdTAwM2VsZW4gPSBuZXdsZW47XFxuIDEyNDpcXHRcXHRtZW1zZXQoKHZvaWQgKiluZXcgKyBuZXdvZmYsIDAsIG5ld2xlbiAtIG5ld29mZik7XFxuIDEyNTpcXHRcXG4gMTI2OlxcdFxcdGN0LVxcdTAwM2VleHQgPSBuZXc7XFxuIDEyNzpcXHRcXHRyZXR1cm4gKHZvaWQgKiluZXcgKyBuZXdvZmY7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRFWFBPUlRfU1lNQk9MKG5mX2N0X2V4dF9hZGQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoyMi40MzI0MzM0ODhaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTI5NjQzNjg5OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDb25udHJhY2sgRXh0ZW5zaW9uIGFuZCBPcGVuIHZTd2l0Y2ggSW50ZWdyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIExpbmUgOTYgaW4gYG5mX2N0X2V4dF9hZGRgIGlzIHRoZSBrZXk6IGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYC4gIFRoYXQncyBiZWNhdXNlIGEgY29uZmlybWVkIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgbWVhbnMgb3RoZXIgQ1BVcyAqY291bGQqIGJlIGFjY2Vzc2luZyBgY3QtXHUwMDNlZXh0YCBjb25jdXJyZW50bHkuICBUaGVuLCB0aGUgYGtyZWFsbG9jKGN0LVx1MDAzZWV4dCwgYWxsb2MsIGdmcClgIGluIHRoZSBzYW1lIGZ1bmN0aW9uIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiwgbGVhZGluZyB0byB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBgV0FSTl9PTmAgc3BsYXQgaWYgaXQgKmlzKiBjb25maXJtZWQgYW5kIHJlYWxsb2NhdGVkIGNvbmN1cnJlbnRseS5cblxuTm93LCBsb29raW5nIGF0IGBuZl9uYXRfY29yZS5jYCwgdGhlIGxvZ2ljIGluIGBuZl9jdF9uYXRfZXh0X2FkZGAgaXMgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzOiBpdCBjaGVja3MgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCAqYmVmb3JlKiBjYWxsaW5nIGBuZl9jdF9leHRfYWRkYC4gVGhpcyBpcyBnb29kIHByYWN0aWNlLiBCdXQsIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgd2hpY2ggKml0c2VsZiogY2FsbHMgYG5mX2N0X2V4dF9hZGRgIHdoZW4gdGhlIGVudHJ5ICppcyogY29uZmlybWVkIHRyaWdnZXJzIHRoZSBgV0FSTl9PTmAgYW5kIGludHJvZHVjZXMgYSByYWNlL1VBRiBzY2VuYXJpbyFcblxuTGV0J3MgbG9vayBhdCB0aGUgcGF0Y2ggdG8gYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuLi4gYWgsIGhlcmUgd2UgZ28uIFRoZSBmaXggaXMgdG8gYWRkIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgdG8gdGhlIGBpZiAoIWNsKWAgY29uZGl0aW9uIGluIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYC4gVGhpcyAqc2hvdWxkKiBwcmV2ZW50IHRoZSBwcm9ibGVtYXRpYyBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGZyb20gYmVpbmcgY2FsbGVkIHdoZW4gYGN0YCBpcyBjb25maXJtZWQsIHJpZ2h0P1xuXG5CdXQsIGxldCdzIGZvbGxvdyB0aGUgY29udHJvbCBmbG93OiBJZiBgY2xgICppcyogTlVMTCAoYW5kIGBuZl9jdF9pc19jb25maXJtZWQoY3QpYCBpcyBmYWxzZSksIHRoZSBgb3ZzX2N0X2luaXRfbGFiZWxzYCBmdW5jdGlvbiBjYWxscyBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLCBjaGVja3MgZm9yIE5VTEwsIGFuZCByZXR1cm5zIGAtRU5PU1BDYCBpZiBubyBgY2xgISBUaGUgY29tbWVudCBpbiBgb3ZzX2N0X2luaXRfbGFiZWxzYCBtYWtlcyBpdCBzb3VuZCBsaWtlIGxhYmVscyBhcmUgb25seSBpbml0aWFsaXplZCBvbiBhIG5ldywgdW5jb25maXJtZWQgZW50cnksIHRoYXQgaGFzbid0IGJlZW4gY29tbWl0dGVkLCBzbyBubyBjb25jdXJyZW50IGFjY2VzcyBpcyBpbnZvbHZlZC5cblxuSW4gYG92c19jdF9zZXRfbGFiZWxzYCwgd2UgYWdhaW4gY2FsbCBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLiAgSWYgaXQgcmV0dXJucyBOVUxMLCB3ZSBhZ2FpbiBnZXQgYC1FTk9TUENgLiBBaGEhIFRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIG5vdyB0aGF0IHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkIGFuZCB0aGUgZXh0ZW5zaW9uIHdhc24ndCBhdHRhY2hlZC4gVGhlbiBgY2xgIGlzIE5VTEwuIFRoZW4gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIHJldHVybnMgTlVMTC4gVGhlbiBgb3ZzX2N0X3NldF9sYWJlbHNgIHJldHVybnMgYC1FTk9TUENgLlxuXG4uLi5XYWl0IGEgbWludXRlISAgSWYgaXQncyByZXR1cm5pbmcgYC1FTk9TUENgIHdoZW4gdGhlIGV4dGVuc2lvbiBpc24ndCB0aGVyZSwgYW5kIHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkLCBkb2Vzbid0IHRoYXQgbWVhbiBga2V5LVx1MDAzZWN0LmxhYmVsc2AgaXMgKnVuaW5pdGlhbGl6ZWQqPyBUaGUgZmxvdyBvZiBsb2dpYyBhcHBlYXJzIHNvdW5kLCBidXQuLi4gd2hlcmUgKmRvZXMqIGBrZXlgIGNvbWUgZnJvbSBpbiBgb3ZzX2N0X3NldF9sYWJlbHNgPyBXZSBtdXN0IGNoZWNrIHRoZSBjYWxsZXJzIG9mIGBvdnNfY3Rfc2V0X2xhYmVsc2AgdG8gZW5zdXJlIHRoaXMgaXNuJ3QgYW4gaXNzdWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg5NzUsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NjYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDozNS4zOTY4MDQ0NTRaIiwiU2VxIjo1MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mjk3MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9zZXRfbGFiZWxzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzgxPXN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIxLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo0MjI6c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjMtXFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyMy1cXHRcXHQgICBsYWJlbHNfbm9uemVybyhcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spKSB7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjEwMjQ6XFx0XFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDozNS40NDIxMDU0ODNaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzgyMDk5NjY2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgQ29ubmVjdGlvbiBUcmFja2luZyBDb21taXQgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBvdnNfY3RfY29tbWl0YC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgY29kZSBhcm91bmQgbGluZSAxMDIwLCBsaWtlbHkgaW4gdGhlIG1haW4gT1ZTIGRhdGFwYXRoIGtlcm5lbCBtb2R1bGUuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIGlzIHdoZXJlIHRoZSBjcnVjaWFsIGNvbm5lY3Rpb24gdHJhY2tpbmcgZGVjaXNpb25zIGFyZSBmaW5hbGl6ZWQgYW5kIGVuZm9yY2VkIGFmdGVyIGEgZmxvdyBoYXMgdHJhdmVyc2VkIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hY2hpbmUuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb25uZWN0aW9uIGdldHMgbWFya2VkIGFzIGVzdGFibGlzaGVkIG9yIHJlbGF0ZWQsIGhvdyBOQVQgaXMgYXBwbGllZCAoaWYgcHJlc2VudCksIGFuZCBob3cgdGhpcyBhbGwgaW50ZXJhY3RzIHdpdGggdGhlIGNvbm50cmFjayB0YWJsZSBlbnRyaWVzLiBJ4oCZbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgbXV0ZXhlcyBvciBzcGlubG9ja3MgdXNlZCBmb3IgY29uY3VycmVuY3kgY29udHJvbCwgYW55IGNhbGxzIHRvIGhlbHBlciBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgdG8gb3IgdXBkYXRpbmcgdGhlIGNvbm50cmFjayB0YWJsZSwgYW5kIHRoZSBoYW5kbGluZyBvZiBhbnkgYXNzb2NpYXRlZCBmbGFncyBvciBtZXRhZGF0YS4gSSdtIGFsc28gY3VyaW91cyB0byBzZWUgaG93IGFueSBhc3NvY2lhdGVkIHNrYiBkYXRhIGlzIHVwZGF0ZWQgb3IgbW9kaWZpZWQgYXQgdGhpcyBjb21taXQgc3RhZ2UuIEl0J3MgbGlrZWx5IHdlIHdpbGwgZmluZCBzb21lIG9mIHRoZSBjcml0aWNhbCBjb2RlIGZvciBwcm9wZXJseSBoYW5kbGluZyBhc3ltbWV0cmljIGZsb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk2NSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjM5LjI2MzEwNDg1M1oiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjgyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk2MCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk2MDpcXHRzdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gOTYxOlxcdFxcdFxcdFxcdCBjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICppbmZvLFxcbiA5NjI6XFx0XFx0XFx0XFx0IHN0cnVjdCBza19idWZmICpza2IpXFxuIDk2MzpcXHR7XFxuIDk2NDpcXHRcXHRlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbztcXG4gOTY1OlxcdFxcdHN0cnVjdCBuZl9jb25uICpjdDtcXG4gOTY2OlxcdFxcdGludCBlcnI7XFxuIDk2NzpcXHRcXG4gOTY4OlxcdFxcdGVyciA9IF9fb3ZzX2N0X2xvb2t1cChuZXQsIGtleSwgaW5mbywgc2tiKTtcXG4gOTY5OlxcdFxcdGlmIChlcnIpXFxuIDk3MDpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA5NzE6XFx0XFxuIDk3MjpcXHRcXHQvKiBUaGUgY29ubmVjdGlvbiBjb3VsZCBiZSBpbnZhbGlkLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBuby1vcC4qL1xcbiA5NzM6XFx0XFx0Y3QgPSBuZl9jdF9nZXQoc2tiLCBcXHUwMDI2Y3RpbmZvKTtcXG4gOTc0OlxcdFxcdGlmICghY3QpXFxuIDk3NTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gOTc2OlxcdFxcbiA5Nzc6XFx0I2lmXFx0SVNfRU5BQkxFRChDT05GSUdfTkVURklMVEVSX0NPTk5DT1VOVClcXG4gOTc4OlxcdFxcdGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFxcdTAwMjZvdnNfY3RfbGltaXRfZW5hYmxlZCkpIHtcXG4gOTc5OlxcdFxcdFxcdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbiA5ODA6XFx0XFx0XFx0XFx0ZXJyID0gb3ZzX2N0X2NoZWNrX2xpbWl0KG5ldCwgc2tiLCBpbmZvKTtcXG4gOTgxOlxcdFxcdFxcdFxcdGlmIChlcnIpIHtcXG4gOTgyOlxcdFxcdFxcdFxcdFxcdG5ldF93YXJuX3JhdGVsaW1pdGVkKFxcXCJvcGVudnN3aXRjaDogem9uZTogJXUgXFxcIlxcbiA5ODM6XFx0XFx0XFx0XFx0XFx0XFx0XFxcImV4Y2VlZHMgY29ubnRyYWNrIGxpbWl0XFxcXG5cXFwiLFxcbiA5ODQ6XFx0XFx0XFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlem9uZS5pZCk7XFxuIDk4NTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA5ODY6XFx0XFx0XFx0XFx0fVxcbiA5ODc6XFx0XFx0XFx0fVxcbiA5ODg6XFx0XFx0fVxcbiA5ODk6XFx0I2VuZGlmXFxuIDk5MDpcXHRcXG4gOTkxOlxcdFxcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxcbiA5OTI6XFx0XFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcXG4gOTkzOlxcdFxcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XFxuIDk5NDpcXHRcXHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxcbiA5OTU6XFx0XFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXFxuIDk5NjpcXHRcXHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcXG4gOTk3OlxcdFxcdCAqIG9wdGlvbi4gKi9cXG4gOTk4OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VoYXZlX2V2ZW50bWFzaykge1xcbiA5OTk6XFx0XFx0XFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xcbjEwMDA6XFx0XFxuMTAwMTpcXHRcXHRcXHRpZiAoY2FjaGUpXFxuMTAwMjpcXHRcXHRcXHRcXHRjYWNoZS1cXHUwMDNlY3RtYXNrID0gaW5mby1cXHUwMDNlZXZlbnRtYXNrO1xcbjEwMDM6XFx0XFx0fVxcbjEwMDQ6XFx0XFxuMTAwNTpcXHRcXHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcXG4xMDA2OlxcdFxcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXFxuMTAwNzpcXHRcXHQgKiBhY3Rpb24uXFxuMTAwODpcXHRcXHQgKi9cXG4xMDA5OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VtYXJrLm1hc2spIHtcXG4xMDEwOlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbWFyayhjdCwga2V5LCBpbmZvLVxcdTAwM2VtYXJrLnZhbHVlLFxcbjEwMTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW5mby1cXHUwMDNlbWFyay5tYXNrKTtcXG4xMDEyOlxcdFxcdFxcdGlmIChlcnIpXFxuMTAxMzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjEwMTQ6XFx0XFx0fVxcbjEwMTU6XFx0XFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuMTAxNjpcXHRcXHRcXHRlcnIgPSBvdnNfY3RfaW5pdF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG4xMDE3OlxcdFxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMTg6XFx0XFx0XFx0aWYgKGVycilcXG4xMDE5OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyMDpcXHRcXG4xMDIxOlxcdFxcdFxcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcXG4xMDIyOlxcdFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXFx1MDAyNlxcdTAwMjZcXG4xMDIzOlxcdFxcdFxcdCAgIGxhYmVsc19ub256ZXJvKFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMubWFzaykpIHtcXG4xMDI0OlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxuMTAyNTpcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMjY6XFx0XFx0XFx0aWYgKGVycilcXG4xMDI3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyODpcXHRcXHR9XFxuMTAyOTpcXHRcXHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXFxuMTAzMDpcXHRcXHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cXG4xMDMxOlxcdFxcdCAqL1xcbjEwMzI6XFx0XFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcXG4xMDMzOlxcdFxcbjEwMzQ6XFx0XFx0cmV0dXJuIHZlcmRpY3RfdG9fZXJybm8oZXJyKTtcXG4xMDM1OlxcdH1cXG4xMDM2OlxcdFxcbjEwMzc6XFx0LyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5QUk9HUkVTUyBpZiAnc2tiJyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cXG4xMDM4OlxcdCAqIHZhbHVlIGlmICdza2InIGlzIGZyZWVkLlxcbjEwMzk6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjM5LjI2MzIzNDk1M1oiLCJTZXEiOjU1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMDk3NjAwNDAzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBhdCB0aGlzIENvbm50cmFjayBsYWJlbCBoYW5kbGluZyBjb2RlLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gYW5kIGl0cyBpbXBhY3Qgb24gbWVtb3J5IHNhZmV0eS4gVGhlIGNvcmUgb2YgdGhlIGlzc3VlIHNlZW1zIHRvIGJlIGFyb3VuZCBtb2RpZnlpbmcgb3IgZXh0ZW5kaW5nIHRoZSBgY3QtXHUwMDNlZXh0YCBmaWVsZCBvZiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uIHRyYWNrIGVudHJ5IChgY3RgKS4gVGhlIG9yaWdpbmFsIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgd2FzIGJlaW5nIGNhbGxlZCBvbiBjb25maXJtZWQgY29ubmVjdGlvbnMsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBkYXRhIHJhY2UgYmVjYXVzZSBvZiByZWFsbG9jYXRpb24uXG5cbk15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgZml4IGFkZHJlc3NlcyB0aGlzIGJ5IG9ubHkgYWRkaW5nIHRoZSBsYWJlbHMgZXh0ZW5zaW9uIGlmIHRoZSBjb25uZWN0aW9uIGlzbid0IGNvbmZpcm1lZCAqYW5kKiB0aGUgbGFiZWxzIGhhdmVuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgbG9naWMgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaWYgdGhlIGNvbm5lY3Rpb24gaXNuJ3QgY29uZmlybWVkLCBpdCBjYWxscyBgb3ZzX2N0X2luaXRfbGFiZWxzYCB3aGljaCBpcyBmaW5lLiBJZiB0aGUgY29ubmVjdGlvbiAqaXMqIGNvbmZpcm1lZCBhbmQgbGFiZWxzIGFyZSBuZWVkZWQsIGl0IGNhbGxzIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGhvd2V2ZXIgd2l0aCB0aGlzIHBhdGNoIHRoZSBsYWJlbHMgYXJlIG9ubHkgY3JlYXRlZCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIHdyaXRlcz8gIExldCBtZSBnbyB0aHJvdWdoIG15IHRob3VnaHQgcHJvY2Vzcy5cblxuMS4gICoqV2hlbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBgTlVMTGA6KiogSWYgdGhlIGNvbm50cmFjayBlbnRyeSBpcyBjb25maXJtZWQsIGFuZCB0aGUgbGFiZWxzIGFyZSBub3QgYWxyZWFkeSBhbGxvY2F0ZWQsIGBvdnNfY3Rfc2V0X2xhYmVsc2Agd2lsbCByZXR1cm4gYC1FTk9TUENgLiBUaGlzIG1lYW5zIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQuXG5cbjIuICAqKk90aGVyIGNhbGxlcnMgb2YgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgOioqIFRoZXJlIGFyZSBvbmx5IGBvdnNfY3RfaW5pdF9sYWJlbHNgIGFuZCBgb3ZzX2N0X3NldF9sYWJlbHNgLiAgYG92c19jdF9pbml0X2xhYmVsc2AgaGFuZGxlcyB0aGUgbm9uLWNvbmZpcm1lZCBjYXNlLCBzbyBhZ2Fpbiwgbm8gaXNzdWUuXG5cbjMuICAqKmBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYW5kIGl0cyBzdXJyb3VuZGluZ3M6KiogVGhlIHVuZGVybHlpbmcgcHJvYmxlbSBhZGRyZXNzZWQgYnkgdGhlIGNvZGUgbW9kaWZpY2F0aW9uIGlzIGEgY29uY3VycmVuY3kgYnVnIHdpdGggcmVhbGxvY2F0aW5nIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgbGVhZGluZyB0byByYWNlIGNvbmRpdGlvbnMgb3IgVXNlIEFmdGVyIEZyZWUgc2NlbmFyaW9zLiBJdCBpcyBub3QgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbjQuICAqKkFyZSB0aGVyZSBhbnkgb3RoZXIga2VybmVsLXRvLXVzZXIgY29waWVzLCBwYWRkaW5nIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCByZWFkcywgb3IgdW5pbml0aWFsaXplZCBicmFuY2hlcyBhZmZlY3RlZD8qKiBJIGRvbid0IHNlZSBhbnl0aGluZy4gVGhlIG1haW4gY2hhbmdlIGFkZHMgYSBndWFyZCBjb25kaXRpb24uIFRoZSBjb2RlIHBhdGggcmVsYXRlZCB0byBgbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgYWNjZXNzZXMgdGhlIGBzdGF0dXNgIGJpdGZpZWxkIG9mIGBjdGAsIHdoaWNoIGlzIGZ1bGx5IGluaXRpYWxpemVkIHdoZW4gdGhlIGBjdGAgaXMgY3JlYXRlZC5cblxuU28sIGFmdGVyIHRoaXMgcmlnb3JvdXMgYW5hbHlzaXMsIEknbSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzICpub3QqIGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gIFRoZSBleGlzdGluZyBLQVNBTiBhbmQgYFdBUk5fT05gIG1lY2hhbmlzbXMgc2hvdWxkIGhhbmRsZSB0aGUgY29uY3VycmVuY3kgaXNzdWUgYmVpbmcgZml4ZWQgaGVyZS4gIEtNU0FOIHdvdWxkIG5vdCBvZmZlciBhbnkgYWRkaXRpb25hbCBiZW5lZml0cy4gVGhlIGBOZWVkc0tNU0FOYCBmbGFnIGlzIGZhbHNlLiBUaGUgcmVhc29uaW5nIGlzIGNsZWFyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ5MiwiT3V0cHV0VG9rZW5zIjoyMTIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTU0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6NTAuMjM5MjQ0MDU5WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgyNTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cXHUwMDNlZXh0YCB0aGF0IHRyaWdnZXJzIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYCBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy91c2UtYWZ0ZXItZnJlZSBvbiBzaGFyZWQgY29ubnRyYWNrIGV4dGVuc2lvbnMuXFxuXFxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcHJldmVudHMgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKWAgb24gYW4gYWxyZWFkeSBjb25maXJtZWQgY29ubnRyYWNrIGNvbm5lY3Rpb24gKGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWApLCBhdm9pZGluZyBhbiBpbnZhbGlkIHJlYWxsb2NhdGlvbiBvZiBgY3QtXFx1MDAzZWV4dGAgdGhhdCB0cmlnZ2VycyBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAgYW5kIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMvdXNlLWFmdGVyLWZyZWUgb24gc2hhcmVkIGNvbm50cmFjayBleHRlbnNpb25zLlxcblxcblRoZSBjaGFuZ2UgbWVyZWx5IHRpZ2h0ZW5zIGEgY29uZGl0aW9uYWwgY2hlY2sgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXh0ZW5zaW9uIGFsbG9jYXRpb247IGl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMsIG9yIGluZm8tbGVha3MgdG8gdXNlcnNwYWNlLiBJZiBgY2xgIGlzIE5VTEwgb24gYSBjb25maXJtZWQgY29ubmVjdGlvbiwgYG92c19jdF9zZXRfbGFiZWxzKClgIHNhZmVseSByZXR1cm5zIGAtRU5PU1BDYCB3aXRob3V0IGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBidWcgYmVpbmcgYWRkcmVzc2VkIHJlbGF0ZXMgdG8gY29uY3VycmVuY3ksIGV4dGVuc2lvbiBsaWZlY3ljbGUsIGFuZCBwb3RlbnRpYWwgdXNlLWFmdGVyLWZyZWUsIHdoaWNoIGZhbGwgdW5kZXIgc3RhbmRhcmQga2VybmVsIHdhcm5pbmdzIGFuZCBLQVNBTiwgbm90IEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowv2pqg[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-12 13:38:13 +0000 UTC FinishedAt: 2026-09-12 14:00:51 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "OPENVSWITCH", "NF_CONNTRACK", "NF_CONNTRACK_LABELS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "OPENVSWITCH", "NF_CONNTRACK", "NF_CONNTRACK_LABELS" ], "series_id": "7cf1ae3e-5a85-4ffb-81c8-53d21d41e395" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "ovs_ct_get_conn_labels", "ovs_ct_set_labels", "ovs_ct_init_labels", "ovs_ct_commit", "ovs_ct_execute" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "e6b6078ea1731b05b3b552497b3bce4bf8b014ae", "base_tree": "net" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O09QRU5WU1dJVENIJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDSyYjMzQ7LAogICAgJiMzNDtORl9DT05OVFJBQ0tfTEFCRUxTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7b3ZzX2N0X2dldF9jb25uX2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3Rfc2V0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfaW5pdF9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2NvbW1pdCYjMzQ7LAogICAgJiMzNDtvdnNfY3RfZXhlY3V0ZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHByZXZlbnRzIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKClgIG9uIGFuIGFscmVhZHkgY29uZmlybWVkIGNvbm50cmFjayBjb25uZWN0aW9uIChgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgKSwgYXZvaWRpbmcgYW4gaW52YWxpZCByZWFsbG9jYXRpb24gb2YgYGN0LVx1MDAzZWV4dGAgdGhhdCB0cmlnZ2VycyBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAgYW5kIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMvdXNlLWFmdGVyLWZyZWUgb24gc2hhcmVkIGNvbm50cmFjayBleHRlbnNpb25zLlxuXG5UaGUgY2hhbmdlIG1lcmVseSB0aWdodGVucyBhIGNvbmRpdGlvbmFsIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGV4dGVuc2lvbiBhbGxvY2F0aW9uOyBpdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zLCBvciBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS4gSWYgYGNsYCBpcyBOVUxMIG9uIGEgY29uZmlybWVkIGNvbm5lY3Rpb24sIGBvdnNfY3Rfc2V0X2xhYmVscygpYCBzYWZlbHkgcmV0dXJucyBgLUVOT1NQQ2Agd2l0aG91dCBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBUaGUgYnVnIGJlaW5nIGFkZHJlc3NlZCByZWxhdGVzIHRvIGNvbmN1cnJlbmN5LCBleHRlbnNpb24gbGlmZWN5Y2xlLCBhbmQgcG90ZW50aWFsIHVzZS1hZnRlci1mcmVlLCB3aGljaCBmYWxsIHVuZGVyIHN0YW5kYXJkIGtlcm5lbCB3YXJuaW5ncyBhbmQgS0FTQU4sIG5vdCBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpIGluIG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyB0byBwcmV2ZW50IGNhbGxpbmcgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKSB3aGVuIHRoZSBjb25udHJhY2sgZW50cnkgaXMgYWxyZWFkeSBjb25maXJtZWQuIFRoaXMgdG91Y2hlcyByZWFjaGFibGUgY29yZSBuZXR3b3JraW5nIGNvZGUgcmVhY2hhYmxlIHZpYSBPcGVuIHZTd2l0Y2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzIHRoYXQgbWFuaXB1bGF0ZSBjb25udHJhY2sgYWN0aW9ucyBhbmQgbGFiZWxzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nIGFuZCBhYnNlbmNlIG9mIHJlZ3Jlc3Npb25zIG9yIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzIHdoZW4gaGFuZGxpbmcgY29ubnRyYWNrIGxhYmVscyBvbiBjb25maXJtZWQgdnMgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgMTIgMTM6NTg6MzQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5pbmRleCAyNzExNTk2N2U1ZDkzLi4wZjQzMzY4OGUxN2I5IDEwMDY0NFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcbkBAIC0zNjYsNyAmIzQzOzM2Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxuIFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiBcbiBcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuLVx0aWYgKCFjbCkge1xuJiM0MztcdGlmICghY2wgXHUwMDI2XHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4gXHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbiBcdFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4gXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7T1BFTlZTV0lUQ0gmIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDS19MQUJFTFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9zZXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9pbml0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfY29tbWl0JiMzNDssCiAgICAmIzM0O292c19jdF9leGVjdXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWRiNjNkZjZhZGFhZWEzNDFkMzU4MTRiNTg1YTJiZDZiZGYxMmU3NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCmluZGV4IDI3MTE1OTY3ZTVkOTMuLjBmNDMzNjg4ZTE3YjkgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKQEAgLTM2Niw3ICYjNDM7MzY2LDcgQEAgc3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpCiAJc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDsKIAogCWNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpOwotCWlmICghY2wpIHsKJiM0MzsJaWYgKCFjbCAmYW1wOyZhbXA7ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7CiAJCW5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTsKIAkJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7CiAJfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODg2CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjk5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBmb3IgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuIFRoZSBkaWZmIGl0c2VsZiBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOyB0aGUgY29yZSBjaGFuZ2UgYXBwZWFycyB0byBiZSBpbiB0aGUgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGZ1bmN0aW9uLiBJIHNlZSB0aGUgY29uZGl0aW9uYWwgY2hlY2sgaGFzIGJlZW4gbW9kaWZpZWQuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgd2UmIzM5O3JlIG5vdyBjaGVja2luZyAqYm90aCogaWYgYG5mX2N0X2xhYmVsc19maW5kKGN0KWAgcmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgKmFuZCogdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgdmlhIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAuIFRoaXMgaXMgaW50ZXJlc3Rpbmc7IGl0JiMzOTtzIGEgc3VidGxlIGJ1dCBwb3RlbnRpYWxseSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IGNvbm5lY3Rpb24gbGFiZWxzIGFyZSBoYW5kbGVkLCBzcGVjaWZpY2FsbHkgYXQgdGhlIHBvaW50IG9mIGxhYmVsIHJldHJpZXZhbC4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LiBJJiMzOTtsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBmb2N1c2luZyBhcm91bmQgbGluZSAzNjYuIEkmIzM5O20gd29uZGVyaW5nIHdoYXQgc2NlbmFyaW9zIG1pZ2h0IGxlYWQgdG8gYG5mX2N0X2xhYmVsc19maW5kYCByZXR1cm5pbmcgTlVMTCwgYW5kIHdoeSB3ZSYjMzk7cmUgbm93ICphbHNvKiBjb25zaWRlcmluZyB0aGUgY29uZmlybWVkIHN0YXRlLiBQZXJoYXBzIHRoZXJlJiMzOTtzIGEgcmFjZSBjb25kaXRpb24gdGhpcyBhZGRyZXNzZXMsIG9yIG1heWJlIGl0JiMzOTtzIHJlbGF0ZWQgdG8gaG93IGNvbm5lY3Rpb24gdHJhY2tpbmcgaXMgaW5pdGlhbGl6ZWQgb3IgY2xlYW5lZCB1cC4gSSBhbHNvIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgT3BlbiB2U3dpdGNoIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBjb25udHJhY2sgZnVuY3Rpb25hbGl0eS4gSG93IGRvZXMgT3BlbiB2U3dpdGNoIHJlYWNoIGFuZCB1dGlsaXplIHRoZXNlIGZ1bmN0aW9ucz8KCkkmIzM5O2xsIG5lZWQgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgaG93IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBpcyBjYWxsZWQgYW5kLCBjcnVjaWFsbHksIGluIHdoYXQgc2l0dWF0aW9ucy4gSSYjMzk7bGwgYWxzbyBiZSBsb29raW5nIGF0IHRoZSBjYWxsaW5nIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB3aGF0IGltcGxpY2F0aW9ucyB0aGlzIGNoYW5nZSBoYXMgb24gdGhlIGNvbm5lY3Rpb24mIzM5O3Mgc3RhdGUgYW5kIGRhdGEgc3RydWN0dXJlcy4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHNlZSBpZiB0aGVyZSBhcmUgYXNzb2NpYXRlZCBjaGFuZ2VzIG9yIGRlcGVuZGVuY2llcyBlbHNld2hlcmUgaW4gdGhlIGNvZGUuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIHRvIHNlZSBob3cgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkIGFuZCB3aGF0IHRoZSBpbXBsaWNhdGlvbnMgb2YgYSBub3QtY29uZmlybWVkIGNvbm5lY3Rpb24gYXJlLiBGcm9tIHRoZXJlLCBJIGNhbiBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGJ1ZyBmaXgsIGFuIG9wdGltaXphdGlvbiwgb3Igc29tZXRoaW5nIG1vcmUgZnVuZGFtZW50YWwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdFx0bmV3X21hcmsgPSBjdF9tYXJrIHwgKFJFQURfT05DRShjdC1cdTAwM2VtYXJrKSBcdTAwMjYgfihtYXNrKSk7XG4gMzUxOlx0XHRpZiAoUkVBRF9PTkNFKGN0LVx1MDAzZW1hcmspICE9IG5ld19tYXJrKSB7XG4gMzUyOlx0XHRcdFdSSVRFX09OQ0UoY3QtXHUwMDNlbWFyaywgbmV3X21hcmspO1xuIDM1MzpcdFx0XHRpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSlcbiAzNTQ6XHRcdFx0XHRuZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBjdCk7XG4gMzU1Olx0XHRcdGtleS1cdTAwM2VjdC5tYXJrID0gbmV3X21hcms7XG4gMzU2Olx0XHR9XG4gMzU3Olx0XG4gMzU4Olx0XHRyZXR1cm4gMDtcbiAzNTk6XHQjZWxzZVxuIDM2MDpcdFx0cmV0dXJuIC1FTk9UU1VQUDtcbiAzNjE6XHQjZW5kaWZcbiAzNjI6XHR9XG4gMzYzOlx0XG4gMzY0Olx0c3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXG4gMzY1Olx0e1xuIDM2NjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiAzNjc6XHRcbiAzNjg6XHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIDM2OTpcdFx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbiAzNzA6XHRcdFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xuIDM3MTpcdFx0XHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcbiAzNzI6XHRcdH1cbiAzNzM6XHRcbiAzNzQ6XHRcdHJldHVybiBjbDtcbiAzNzU6XHR9XG4gMzc2Olx0XG4gMzc3Olx0LyogSW5pdGlhbGl6ZSBsYWJlbHMgZm9yIGEgbmV3LCB5ZXQgdG8gYmUgY29tbWl0dGVkIGNvbm50cmFjayBlbnRyeS4gIE5vdGUgdGhhdFxuIDM3ODpcdCAqIHNpbmNlIHRoZSBuZXcgY29ubmVjdGlvbiBpcyBub3QgeWV0IGNvbmZpcm1lZCwgYW5kIHRodXMgbm8tb25lIGVsc2UgaGFzXG4gMzc5Olx0ICogYWNjZXNzIHRvIGl0JiMzOTtzIGxhYmVscywgd2Ugc2ltcGx5IHdyaXRlIHRoZW0gb3Zlci5cbiAzODA6XHQgKi9cbiAzODE6XHRzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDM4MjpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxuIDM4MzpcdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbWFzaylcbiAzODQ6XHR7XG4gMzg1Olx0XHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsLCAqbWFzdGVyX2NsO1xuIDM4NjpcdFx0Ym9vbCBoYXZlX21hc2sgPSBsYWJlbHNfbm9uemVybyhtYXNrKTtcbiAzODc6XHRcbiAzODg6XHRcdC8qIEluaGVyaXQgbWFzdGVyJiMzOTtzIGxhYmVscyB0byB0aGUgcmVsYXRlZCBjb25uZWN0aW9uPyAqL1xuIDM4OTpcdFx0bWFzdGVyX2NsID0gY3QtXHUwMDNlbWFzdGVyID8gbmZfY3RfbGFiZWxzX2ZpbmQoY3QtXHUwMDNlbWFzdGVyKSA6IE5VTEw7XG4gMzkwOlx0XG4gMzkxOlx0XHRpZiAoIW1hc3Rlcl9jbCBcdTAwMjZcdTAwMjYgIWhhdmVfbWFzaylcbiAzOTI6XHRcdFx0cmV0dXJuIDA7ICAgLyogTm90aGluZyB0byBkby4gKi9cbiAzOTM6XHRcbiAzOTQ6XHRcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG4gMzk1Olx0XHRpZiAoIWNsKVxuIDM5NjpcdFx0XHRyZXR1cm4gLUVOT1NQQztcbiAzOTc6XHRcbiAzOTg6XHRcdC8qIEluaGVyaXQgdGhlIG1hc3RlciYjMzk7cyBsYWJlbHMsIGlmIGFueS4gKi9cbiAzOTk6XHRcdGlmIChtYXN0ZXJfY2wpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQxOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSW52ZXN0aWdhdGluZyBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgQ2FsbCBTaXRlcyoqCgpPa2F5LCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBUbyByZWFsbHkgZ3Jhc3AgaXRzIHJvbGUgYW5kIHBvdGVudGlhbCBpbXBhY3QsIEkgbmVlZCBhIGhvbGlzdGljIHZpZXcuIEkmIzM5O20gZ29pbmcgdG8gdHJhY2sgZG93biBldmVyeSBjYWxsIHNpdGUgZm9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXNuJiMzOTt0IGp1c3QgYWJvdXQgZmluZGluZyB3aGVyZSBpdCYjMzk7cyAqdXNlZCosIGJ1dCAqaG93KiBpdCYjMzk7cyB1c2VkIGFuZCB3aGF0IGRhdGEgZmxvd3MgaW50byBpdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVuZGVkIHB1cnBvc2UgYW5kIGFueSBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzLiBLbm93aW5nIHRoZSBmdWxsIGNhbGxpbmcgY29udGV4dCBpcyBrZXkgdG8gYW55IGRlZXBlciBhbmFseXNpcywgcGFydGljdWxhcmx5IHRvIGlkZW50aWZ5IHBvc3NpYmxlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIHN1YnRsZSBiZWhhdmlvcmFsIG51YW5jZXMuIFNvLCBsZXQmIzM5O3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBjb2RlYmFzZSBhbmQgdHJhY2luZyB0aG9zZSBmdW5jdGlvbiBjYWxscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzYzLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjUte1xuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzkzLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzk1LVx0aWYgKCFjbClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9NDIyPXN0YXRpYyBpbnQgb3ZzX2N0X3NldF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDI4LVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyOTpcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDMwLVx0aWYgKCFjbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDI0CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBjb25udHJhY2suYyAoTGluZXMgNDAwLTQ1MCkqKgoKT2theSwgdGltZSB0byB6ZXJvIGluLiBMZXQmIzM5O3MgZ2V0IHJpZ2h0IGludG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgc3BlY2lmaWNhbGx5IGJldHdlZW4gbGluZXMgNDAwIGFuZCA0NTAuIEkmIzM5O20gYXNzdW1pbmcgdGhpcyBzZWN0aW9uIGxpa2VseSBpbnZvbHZlcyBzb21lIGNvcmUgY29ubnRyYWNrIGZ1bmN0aW9uYWxpdHkuIEdpdmVuIHRoZSBmaWxlIGFuZCBmdW5jdGlvbiBuYW1pbmcgY29udmVudGlvbnMgaW4gT1ZTLCB0aGlzIHByb2JhYmx5IGRlYWxzIHdpdGggc29tZSBhc3BlY3Qgb2YgY29ubmVjdGlvbiB0cmFja2luZyBzdGF0ZSBtYW5pcHVsYXRpb24sIG1heWJlIGEga2V5IHRyYW5zaXRpb24gb3IgYSBsb29rdXAvaW5zZXJ0aW9uIG9wZXJhdGlvbi4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY2x1ZXMg4oCTIHZhcmlhYmxlIGFzc2lnbm1lbnRzLCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBmdW5jdGlvbiBjYWxscyDigJMgdGhhdCBpbGx1bWluYXRlIHRoZSBsb2dpYyBmbG93LgoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgZm9yIHBvdGVudGlhbCBwaXRmYWxscyBsaWtlIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIGluZWZmaWNpZW50IGRhdGEgc3RydWN0dXJlcywgb3IgdW5leHBlY3RlZCBlZGdlIGNhc2VzLiBJJiMzOTtsbCBiZSBtZW50YWxseSBwYXJzaW5nIGFueSBuZXN0ZWQgbG9vcHMgb3IgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYywgZm9jdXNpbmcgb24gaG93IGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZC4gSSYjMzk7bSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZGF0YXBhdGgsIHdoaWNoIGlzIGEgY29tbW9uIGFyZWEgb2YgcGVyZm9ybWFuY2UgYm90dGxlbmVjayBpbiBjb25udHJhY2sgaW1wbGVtZW50YXRpb25zLiBIb3BlZnVsbHksIHRoZSBjb2RlIGNvbW1lbnRzIGFyZSBkZXNjcmlwdGl2ZSwgYnV0IGV2ZW4gaWYgdGhleSBhcmVuJiMzOTt0LCBJJiMzOTttIHJlYWR5IHRvIGluZmVyIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBmcm9tIHRoZSBzdXJyb3VuZGluZyBjb2RlLgoKTXkgb2JqZWN0aXZlIGlzIHRvIGdyYXNwIHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIGFuZCBob3cgaXQgY29udHJpYnV0ZXMgdG8gdGhlIG92ZXJhbGwgY29ubnRyYWNrIGltcGxlbWVudGF0aW9uLiBPbmNlIEkmIzM5O3ZlIGdvdHRlbiB0aGlzIHNlY3Rpb24mIzM5O3MgbWVhbmluZyBjbGVhciwgSSBjYW4gZXZhbHVhdGUgaXRzIGRlc2lnbiBmb3IgYW55IHBvdGVudGlhbCBpc3N1ZXMuIElmIEkgZmluZCBzb21ldGhpbmcgdGhhdCBzZWVtcyB1bmNsZWFyIG9yIHBvdGVudGlhbGx5IHByb2JsZW1hdGljLCBJIGNhbiBmb2xsb3cgdGhlIGNhbGwgc3RhY2sgdG8gc2VlIHRoZSBicm9hZGVyIGltcGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDAwOlx0XHRcdCpjbCA9ICptYXN0ZXJfY2w7XG4gNDAxOlx0XG4gNDAyOlx0XHRpZiAoaGF2ZV9tYXNrKSB7XG4gNDAzOlx0XHRcdHUzMiAqZHN0ID0gKHUzMiAqKWNsLVx1MDAzZWJpdHM7XG4gNDA0Olx0XHRcdGludCBpO1xuIDQwNTpcdFxuIDQwNjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBPVlNfQ1RfTEFCRUxTX0xFTl8zMjsgaSYjNDM7JiM0MzspXG4gNDA3Olx0XHRcdFx0ZHN0W2ldID0gKGRzdFtpXSBcdTAwMjYgfm1hc2stXHUwMDNlY3RfbGFiZWxzXzMyW2ldKSB8XG4gNDA4Olx0XHRcdFx0XHQobGFiZWxzLVx1MDAzZWN0X2xhYmVsc18zMltpXVxuIDQwOTpcdFx0XHRcdFx0IFx1MDAyNiBtYXNrLVx1MDAzZWN0X2xhYmVsc18zMltpXSk7XG4gNDEwOlx0XHR9XG4gNDExOlx0XG4gNDEyOlx0XHQvKiBMYWJlbHMgYXJlIGluY2x1ZGVkIGluIHRoZSBJUENUTkxfTVNHX0NUX05FVyBldmVudCBvbmx5IGlmIHRoZVxuIDQxMzpcdFx0ICogSVBDVF9MQUJFTCBiaXQgaXMgc2V0IGluIHRoZSBldmVudCBjYWNoZS5cbiA0MTQ6XHRcdCAqL1xuIDQxNTpcdFx0bmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTEFCRUwsIGN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDE4Olx0XG4gNDE5Olx0XHRyZXR1cm4gMDtcbiA0MjA6XHR9XG4gNDIxOlx0XG4gNDIyOlx0c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQyMzpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gNDI0Olx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiA0Mjc6XHRcdGludCBlcnI7XG4gNDI4Olx0XG4gNDI5Olx0XHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xuIDQzMDpcdFx0aWYgKCFjbClcbiA0MzE6XHRcdFx0cmV0dXJuIC1FTk9TUEM7XG4gNDMyOlx0XG4gNDMzOlx0XHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM0Olx0XHRcdFx0XHQgICAgbWFzay1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM1Olx0XHRcdFx0XHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xuIDQzNjpcdFx0aWYgKGVycilcbiA0Mzc6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mzg6XHRcbiA0Mzk6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDQwOlx0XG4gNDQxOlx0XHRyZXR1cm4gMDtcbiA0NDI6XHR9XG4gNDQzOlx0XG4gNDQ0Olx0c3RhdGljIGludCBvdnNfY3RfaGFuZGxlX2ZyYWdtZW50cyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQ0NTpcdFx0XHRcdFx0ICAgdTE2IHpvbmUsIGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICpza2IpXG4gNDQ2Olx0e1xuIDQ0NzpcdFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xuIDQ0ODpcdFx0aW50IGVycjtcbiA0NDk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MjE0CgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMzQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGZvY3VzIGlzIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBmdW5jdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIGJyb2FkZXIgZnJhbWV3b3JrLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBkb2VzIGFuZCB3aGVyZSBpdCBmaXRzIHdpdGhpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUuIExldCYjMzk7cyBzZWUgaG93IGl0IG9wZXJhdGVzLiBNeSBwcmlvcml0eSBpcyB0byBncmFzcCBpdHMgZnVuY3Rpb25hbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZfY3RfbGFiZWxzX2V4dF9hZGQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaD0yMz1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oOjM3OnN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM9MTc1ND1pbml0X2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25uICp0bXBsLFxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVx0bmZfY3RfdHN0YW1wX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5NC1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM6MjMwNTpcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVx0bmZjdF9zZXFhZGpfZXh0X2FkZChjdCk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2OTc0CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG5mX2Nvbm50cmFja19sYWJlbHMuaGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpc3NlY3QgYGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IGNvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzIGFyZSBoYW5kbGVkIGF0IGEgZ3JhbnVsYXIgbGV2ZWwuIEkgc3VzcGVjdCBJJiMzOTtsbCBiZSByZXZpc2l0aW5nIHRoaXMgY29kZSB0byB1bmRlcnN0YW5kIGhvdyBhIHJlY2VudCBwZXJmb3JtYW5jZSBhbm9tYWx5IGlzIGludGVyYWN0aW5nIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIGZyYW1ld29yay4gSSYjMzk7bSBob3BpbmcgdG8gcXVpY2tseSBpZGVudGlmeSB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBhbmQgYWNjZXNzIHBhdHRlcm5zLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIHRoZSBsYWJlbCBtYXNrcyBhbmQgaG93IHRoZXkmIzM5O3JlIHVzZWQgdG8gZWZmaWNpZW50bHkgZmlsdGVyIGFuZCBjbGFzc2lmeSBjb25uZWN0aW9ucyB3aXRoaW4gTmV0ZmlsdGVyLiBLbm93aW5nIHRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGludGVyYWN0cyBhdCB0aGUgcGFja2V0IGxldmVsLiBJdCYjMzk7cyB0aW1lIHRvIGRpZyBpbiBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiAgIDI6XHRcbiAgIDM6XHQjaWZuZGVmIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcbiAgIDQ6XHQjZGVmaW5lIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcbiAgIDU6XHRcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oXHUwMDNlXG4gICA3Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaFx1MDAzZVxuICAgODpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcdTAwM2NuZXQvbmV0X25hbWVzcGFjZS5oXHUwMDNlXG4gIDEwOlx0I2luY2x1ZGUgXHUwMDNjbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaFx1MDAzZVxuICAxMTpcdCNpbmNsdWRlIFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oXHUwMDNlXG4gIDEyOlx0I2luY2x1ZGUgXHUwMDNjdWFwaS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxhYmVsLmhcdTAwM2VcbiAgMTM6XHRcbiAgMTQ6XHQjZGVmaW5lIE5GX0NUX0xBQkVMU19NQVhfU0laRSAoKFhUX0NPTk5MQUJFTF9NQVhCSVQgJiM0MzsgMSkgLyBCSVRTX1BFUl9CWVRFKVxuICAxNTpcdFxuICAxNjpcdHN0cnVjdCBuZl9jb25uX2xhYmVscyB7XG4gIDE3Olx0XHR1bnNpZ25lZCBsb25nIGJpdHNbTkZfQ1RfTEFCRUxTX01BWF9TSVpFIC8gc2l6ZW9mKGxvbmcpXTtcbiAgMTg6XHR9O1xuICAxOTpcdFxuICAyMDpcdC8qIENhbiYjMzk7dCB1c2UgbmZfY3RfZXh0X2ZpbmQoKSwgZmxvdyBkaXNzZWN0b3IgY2Fubm90IHVzZSBzeW1ib2xzXG4gIDIxOlx0ICogZXhwb3J0ZWQgYnkgbmZfY29ubnRyYWNrIG1vZHVsZS5cbiAgMjI6XHQgKi9cbiAgMjM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuICAyNDpcdHtcbiAgMjU6XHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcbiAgMjY6XHRcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVx1MDAzZWV4dDtcbiAgMjc6XHRcbiAgMjg6XHRcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxuICAyOTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzA6XHRcbiAgMzE6XHRcdHJldHVybiAodm9pZCAqKWN0LVx1MDAzZWV4dCAmIzQzOyBjdC1cdTAwM2VleHQtXHUwMDNlb2Zmc2V0W05GX0NUX0VYVF9MQUJFTFNdO1xuICAzMjpcdCNlbHNlXG4gIDMzOlx0XHRyZXR1cm4gTlVMTDtcbiAgMzQ6XHQjZW5kaWZcbiAgMzU6XHR9XG4gIDM2Olx0XG4gIDM3Olx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcbiAgMzg6XHR7XG4gIDM5Olx0I2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTXG4gIDQwOlx0XHRzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpO1xuICA0MTpcdFxuICA0MjpcdFx0aWYgKGF0b21pY19yZWFkKFx1MDAyNm5ldC1cdTAwM2VjdC5sYWJlbHNfdXNlZCkgPT0gMClcbiAgNDM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDQ0Olx0XG4gIDQ1Olx0XHRyZXR1cm4gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX0xBQkVMUywgR0ZQX0FUT01JQyk7XG4gIDQ2Olx0I2Vsc2VcbiAgNDc6XHRcdHJldHVybiBOVUxMO1xuICA0ODpcdCNlbmRpZlxuICA0OTpcdH1cbiAgNTA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzk2NAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYG5mX2N0X2V4dF9hZGRgIGlzIGRvaW5nIHVuZGVyIHRoZSBob29kLiBNeSBmaXJzdCBtb3ZlIHdpbGwgYmUgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgY29kZSwgbGlrZWx5IHdpdGhpbiB0aGUgYG5ldC9uZXRmaWx0ZXIvYCBkaXJlY3RvcnksIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBgbmZfY29ubnRyYWNrX2V4dGVuZC5jYCBvciBzb21ldGhpbmcgYW5hbG9nb3VzLiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBjb3JlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY29ubmVjdGlvbiB0cmFja2luZyBleHRlbnNpb24gZnVuY3Rpb24gdGhlcmUuIFRoaXMgd2lsbCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dm9pZCBcXCpuZl9jdF9leHRfYWRkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg9NTQ9c3RhdGljIGlubGluZSB2b2lkICpuZl9jdF9leHRfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHU4IGlkKVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgtNjQtLyogQWRkIHRoaXMgdHlwZSwgcmV0dXJucyBwb2ludGVyIHRvIGRhdGEgb3IgTlVMTC4gKi9cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg6NjU6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApO1xuaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaC02Ni1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYz01Nz1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCB0b3RhbF9leHRlbnNpb25fc2l6ZSh2b2lkKVxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTg5LVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6OTA6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYy05MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0MjMKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gbmZfY29ubnRyYWNrX2V4dGVuZC5jKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGd1dHMgb2YgdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZXh0ZW5zaW9uIGNvZGUuIFNwZWNpZmljYWxseSwgbGV0JiMzOTtzIHpvb20gaW4gb24gYG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jYCDigJMgSSBmaWd1cmUgaWYgd2UmIzM5O3JlIGxvb2tpbmcgYXQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSwgdGhhdCYjMzk7cyB0aGUgcGxhY2UgdG8gc3RhcnQuIE5vdywgbGV0JiMzOTtzIHNlZS4uLiBhcm91bmQgbGluZSA5MCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSYjMzk7cmUgaGFuZGxpbmcgW3NwZWNpZmljIGFzcGVjdCBvZiBjb25uZWN0aW9uIHRyYWNraW5nIC0gdGhpcyBwYXJ0IHdvdWxkIGJlIHNwZWNpZmljIHRvIHdoYXQgdGhlIHVzZXIgaXMgYW4gZXhwZXJ0IGluLCBhbmQgd2h5IHRoZXkgYXJlIHJlYWRpbmcgdGhlIGNvZGVdLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24uLi4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCBbc3BlY2lmaWMgdGhpbmdzIHJlbGF0aW5nIHRvIGxpbmUgOTAgYW5kIHRoZSB1c2VyJiMzOTtzIGZpZWxkIG9mIGV4cGVydGlzZSBoZXJlXS4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgODA6XHQjZW5kaWZcbiAgODE6XHQjaWYgSVNfRU5BQkxFRChDT05GSUdfTkVURklMVEVSX1NZTlBST1hZKVxuICA4MjpcdFx0XHQmIzQzOyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fc3lucHJveHkpXG4gIDgzOlx0I2VuZGlmXG4gIDg0Olx0I2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9BQ1RfQ1QpXG4gIDg1Olx0XHRcdCYjNDM7IHNpemVvZihzdHJ1Y3QgbmZfY29ubl9hY3RfY3RfZXh0KVxuICA4NjpcdCNlbmRpZlxuICA4NzpcdFx0O1xuICA4ODpcdH1cbiAgODk6XHRcbiAgOTA6XHR2b2lkICpuZl9jdF9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBuZl9jdF9leHRfaWQgaWQsIGdmcF90IGdmcClcbiAgOTE6XHR7XG4gIDkyOlx0XHR1bnNpZ25lZCBpbnQgbmV3bGVuLCBuZXdvZmYsIG9sZGxlbiwgYWxsb2M7XG4gIDkzOlx0XHRzdHJ1Y3QgbmZfY3RfZXh0ICpuZXc7XG4gIDk0Olx0XG4gIDk1Olx0XHQvKiBDb25udHJhY2sgbXVzdCBub3QgYmUgY29uZmlybWVkIHRvIGF2b2lkIHJhY2VzIG9uIHJlYWxsb2NhdGlvbi4gKi9cbiAgOTY6XHRcdFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7XG4gIDk3Olx0XG4gIDk4Olx0XHQvKiBzdHJ1Y3QgbmZfY3RfZXh0IHVzZXMgdTggdG8gc3RvcmUgb2Zmc2V0cy9zaXplICovXG4gIDk5Olx0XHRCVUlMRF9CVUdfT04odG90YWxfZXh0ZW5zaW9uX3NpemUoKSBcdTAwM2UgMjU1dSk7XG4gMTAwOlx0XG4gMTAxOlx0XHRpZiAoY3QtXHUwMDNlZXh0KSB7XG4gMTAyOlx0XHRcdGNvbnN0IHN0cnVjdCBuZl9jdF9leHQgKm9sZCA9IGN0LVx1MDAzZWV4dDtcbiAxMDM6XHRcbiAxMDQ6XHRcdFx0aWYgKF9fbmZfY3RfZXh0X2V4aXN0KG9sZCwgaWQpKVxuIDEwNTpcdFx0XHRcdHJldHVybiBOVUxMO1xuIDEwNjpcdFx0XHRvbGRsZW4gPSBvbGQtXHUwMDNlbGVuO1xuIDEwNzpcdFx0fSBlbHNlIHtcbiAxMDg6XHRcdFx0b2xkbGVuID0gc2l6ZW9mKCpuZXcpO1xuIDEwOTpcdFx0fVxuIDExMDpcdFxuIDExMTpcdFx0bmV3b2ZmID0gQUxJR04ob2xkbGVuLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY3RfZXh0KSk7XG4gMTEyOlx0XHRuZXdsZW4gPSBuZXdvZmYgJiM0MzsgbmZfY3RfZXh0X3R5cGVfbGVuW2lkXTtcbiAxMTM6XHRcbiAxMTQ6XHRcdGFsbG9jID0gbWF4KG5ld2xlbiwgTkZfQ1RfRVhUX1BSRUFMTE9DKTtcbiAxMTU6XHRcdG5ldyA9IGtyZWFsbG9jKGN0LVx1MDAzZWV4dCwgYWxsb2MsIGdmcCk7XG4gMTE2Olx0XHRpZiAoIW5ldylcbiAxMTc6XHRcdFx0cmV0dXJuIE5VTEw7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoIWN0LVx1MDAzZWV4dClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTI3NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDQyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBDb25udHJhY2sgQnVnIGluIE9wZW4gdlN3aXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBMaW5lIDk2IG9mIGBuZl9jdF9leHRfYWRkYCBpcyBzY3JlYW1pbmcgYXQgbWU6IGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpO2AuIFRoZSBjb21tZW50IHNheXMgaXQgYWxsOiB3ZSBhYnNvbHV0ZWx5ICpjYW5ub3QqIHJlYWxsb2NhdGUgYSBjb25maXJtZWQgY29ubnRyYWNrIGVudHJ5LiBJdCYjMzk7cyBhIHJhY2UgY29uZGl0aW9uIHdhaXRpbmcgdG8gaGFwcGVuLgoKTm93LCBJIHNlZSB0aGUgcHJvYmxlbSBpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCB3YXMgY2FzdWFsbHkgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBldmVuIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgd2FzICphbHJlYWR5KiBjb25maXJtZWQhIFRoaXMgd291bGQgdHJpZ2dlciB0aGF0IGBXQVJOX09OYCBhbmQsIHdvcnNlLCBsZWFkIHRvIGEgYGtyZWFsbG9jYCBvbiBhIGNvbmZpcm1lZCBlbnRyeSDigJMgYSByZWNpcGUgZm9yIHJhY2VzIGFuZCBVc2VyLUFmdGVyLUZyZWUgdnVsbmVyYWJpbGl0aWVzLiBUaGlzIGlzIGNsYXNzaWMuCgpTbywgdGhlIHByb3Bvc2VkIHBhdGNoIGlzIGFkZGluZyBhIGNydWNpYWwgY2hlY2s6CgpgYGBkaWZmCiAJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7Ci0JaWYgKCFjbCkgewomIzQzOwlpZiAoIWNsICZhbXA7JmFtcDsgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpOwogCQljbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTsKIAl9CmBgYAoKVGhhdCBtYWtlcyBzZW5zZS4gT25seSBhZGQgdGhlIGxhYmVscyBleHRlbnNpb24gaWYgaXQgKmRvZXNuJiMzOTt0KiBhbHJlYWR5IGV4aXN0IEFORCB0aGUgY29ubnRyYWNrIGVudHJ5IGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBwcmV2ZW50cyB0aGUgcHJvYmxlbWF0aWMgcmVhbGxvY2F0aW9uIG9uIGNvbmZpcm1lZCBlbnRyaWVzLgoKTm93LCBhIHF1aWNrIHNhbml0eSBjaGVjazogaXMgT3BlbiB2U3dpdGNoIGV2ZW4gYWNjZXNzaWJsZSBpbiBTeXprYWxsZXI/IEFuZCwgdGhlIGFuc3dlciBpcyB5ZXMsIHRoYXQmIzM5O3MgZ29vZCBuZXdzLiBPcGVuIHZTd2l0Y2ggaXMgYSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIG1vZHVsZSAoYENPTkZJR19PUEVOVlNXSVRDSGApLCB1c2luZyBnZW5lcmljIG5ldGxpbmsgKGBORVRMSU5LX0dFTkVSSUNgLCBmYW1pbHkgYG92c19kYXRhcGF0aGAsIGBvdnNfdnBvcnRgLCBgb3ZzX2Zsb3dgLCBgb3ZzX3BhY2tldGApLiBTeXprYWxsZXIgaGFzIHNvbGlkIHN1cHBvcnQgZm9yIHRoZSBPcGVuIHZTd2l0Y2ggbmV0bGluayBpbnRlcmZhY2UuIFRoZSBmYWN0IHRoYXQgU3l6a2FsbGVyIGhlYXZpbHkgZnV6emVkIHRoZSBjb25udHJhY2sgaW50ZWdyYXRpb24gKGBDT05GSUdfT1BFTlZTV0lUQ0hfR0VORVZFYCwgYENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTYCwgYENPTkZJR19ORl9DT05OVFJBQ0tgKSBpbiBPcGVuIHZTd2l0Y2ggbWFrZXMgbWUgZXZlbiBtb3JlIGNvbmZpZGVudCB0aGlzIGlzIGZpeGFibGUgYW5kLCBtb3JlIGltcG9ydGFudGx5LCAqdGVzdGFibGUqIHRocm91Z2ggc3l6a2FsbGVyLiBOb3cgdG8gZGlnIGludG8gdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25udHJhY2tcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9NYWtlZmlsZT0yMT1pZm5lcSAoJChDT05GSUdfTkZfQ09OTlRSQUNLKSwpXG5uZXQvb3BlbnZzd2l0Y2gvTWFrZWZpbGU6MjI6b3BlbnZzd2l0Y2gteSAmIzQzOz0gY29ubnRyYWNrLm9cbm5ldC9vcGVudnN3aXRjaC9NYWtlZmlsZS0yMy1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDMxNQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRXhhbWluaW5nIHRoZSBPcGVuIHZTd2l0Y2ggQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIE9wZW4gdlN3aXRjaCBjb25maWd1cmF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgYG5ldC9vcGVudnN3aXRjaC9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50LiBJdCYjMzk7bGwgbGF5IG91dCB0aGUgY29yZSBmZWF0dXJlcyBhbmQgb3B0aW9ucyBhdmFpbGFibGUgZm9yIGNvbmZpZ3VyaW5nIE9wZW4gdlN3aXRjaCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIHRvcC1sZXZlbCBtZW51IHN0cnVjdHVyZSwgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIG9yIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTttIGFsc28gaW50ZXJlc3RlZCBpbiBhbnkgbmV3IG9yIGNoYW5nZWQgb3B0aW9ucyBzaW5jZSBteSBsYXN0IGRlZXAgZGl2ZSwgZXNwZWNpYWxseSBhbnkgcmVsYXRlZCB0byByZWNlbnQgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIG9yIG5ldyBwcm90b2NvbHMuIFRoaXMgS2NvbmZpZyB3aWxsIGdpdmUgbWUgYSBoaWdoLWxldmVsIHZpZXcgYW5kIGFueSBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIHRvIGludmVzdGlnYXRlIHNwZWNpZmljIGFzcGVjdHMgaW4gbW9yZSBkZXRhaWwuIEkmIzM5O2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGVwZW5kZW5jaWVzIOKAkyB1bmRlcnN0YW5kaW5nIHdoYXQgbmVlZHMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgY2VydGFpbiBPcGVuIHZTd2l0Y2ggZmVhdHVyZXMgaXMgY3J1Y2lhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdCNcbiAgIDM6XHQjIE9wZW4gdlN3aXRjaFxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRjb25maWcgT1BFTlZTV0lUQ0hcbiAgIDc6XHRcdHRyaXN0YXRlIFwmIzM0O09wZW4gdlN3aXRjaFwmIzM0O1xuICAgODpcdFx0ZGVwZW5kcyBvbiBJTkVUXG4gICA5Olx0XHRkZXBlbmRzIG9uICFORl9DT05OVFJBQ0sgfHwgXFxcbiAgMTA6XHRcdFx0ICAgKE5GX0NPTk5UUkFDSyBcdTAwMjZcdTAwMjYgKCghTkZfREVGUkFHX0lQVjYgfHwgTkZfREVGUkFHX0lQVjYpIFx1MDAyNlx1MDAyNiBcXFxuICAxMTpcdFx0XHRcdFx0ICAgICAoIU5GX05BVCB8fCBORl9OQVQpIFx1MDAyNlx1MDAyNiBcXFxuICAxMjpcdFx0XHRcdFx0ICAgICAoIU5FVEZJTFRFUl9DT05OQ09VTlQgfHwgTkVURklMVEVSX0NPTk5DT1VOVCkpKVxuICAxMzpcdFx0ZGVwZW5kcyBvbiBQU0FNUExFIHx8ICFQU0FNUExFXG4gIDE0Olx0XHRzZWxlY3QgTVBMU1xuICAxNTpcdFx0c2VsZWN0IE5FVF9DUkMzMkNcbiAgMTY6XHRcdHNlbGVjdCBORVRfTVBMU19HU09cbiAgMTc6XHRcdHNlbGVjdCBEU1RfQ0FDSEVcbiAgMTg6XHRcdHNlbGVjdCBORVRfTlNIXG4gIDE5Olx0XHRzZWxlY3QgTkZfQ09OTlRSQUNLX09WUyBpZiBORl9DT05OVFJBQ0tcbiAgMjA6XHRcdHNlbGVjdCBORl9OQVRfT1ZTIGlmIE5GX05BVFxuICAyMTpcdFx0aGVscFxuICAyMjpcdFx0ICBPcGVuIHZTd2l0Y2ggaXMgYSBtdWx0aWxheWVyIEV0aGVybmV0IHN3aXRjaCB0YXJnZXRlZCBhdCB2aXJ0dWFsaXplZFxuICAyMzpcdFx0ICBlbnZpcm9ubWVudHMuICBJbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIGEgdmFyaWV0eSBvZiBmZWF0dXJlc1xuICAyNDpcdFx0ICBleHBlY3RlZCBpbiBhIHRyYWRpdGlvbmFsIGhhcmR3YXJlIHN3aXRjaCwgaXQgZW5hYmxlcyBmaW5lLWdyYWluZWRcbiAgMjU6XHRcdCAgcHJvZ3JhbW1hdGljIGV4dGVuc2lvbiBhbmQgZmxvdy1iYXNlZCBjb250cm9sIG9mIHRoZSBuZXR3b3JrLiAgVGhpc1xuICAyNjpcdFx0ICBjb250cm9sIGlzIHVzZWZ1bCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYnV0IGlzXG4gIDI3Olx0XHQgIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaW4gbXVsdGktc2VydmVyIHZpcnR1YWxpemF0aW9uIGRlcGxveW1lbnRzLFxuICAyODpcdFx0ICB3aGljaCBhcmUgb2Z0ZW4gY2hhcmFjdGVyaXplZCBieSBoaWdobHkgZHluYW1pYyBlbmRwb2ludHMgYW5kIHRoZVxuICAyOTpcdFx0ICBuZWVkIHRvIG1haW50YWluIGxvZ2ljYWwgYWJzdHJhY3Rpb25zIGZvciBtdWx0aXBsZSB0ZW5hbnRzLlxuICAzMDpcdFxuICAzMTpcdFx0ICBUaGUgT3BlbiB2U3dpdGNoIGRhdGFwYXRoIHByb3ZpZGVzIGFuIGluLWtlcm5lbCBmYXN0IHBhdGggZm9yIHBhY2tldFxuICAzMjpcdFx0ICBmb3J3YXJkaW5nLiAgSXQgaXMgY29tcGxlbWVudGVkIGJ5IGEgdXNlcnNwYWNlIGRhZW1vbiwgb3ZzLXZzd2l0Y2hkLFxuICAzMzpcdFx0ICB3aGljaCBpcyBhYmxlIHRvIGFjY2VwdCBjb25maWd1cmF0aW9uIGZyb20gYSB2YXJpZXR5IG9mIHNvdXJjZXMgYW5kXG4gIDM0Olx0XHQgIHRyYW5zbGF0ZSBpdCBpbnRvIHBhY2tldCBwcm9jZXNzaW5nIHJ1bGVzLlxuICAzNTpcdFxuICAzNjpcdFx0ICBTZWUgaHR0cDovL29wZW52c3dpdGNoLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlcnNwYWNlXG4gIDM3Olx0XHQgIHV0aWxpdGllcy5cbiAgMzg6XHRcbiAgMzk6XHRcdCAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZVxuICA0MDpcdFx0ICBjYWxsZWQgb3BlbnZzd2l0Y2guXG4gIDQxOlx0XG4gIDQyOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTgwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgdGhlIGBORl9DT05OVFJBQ0tfTEFCRUxTYCBDb25maWd1cmF0aW9uKioKCk9rYXksIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB3ZSBhY3R1YWxseSByZXF1aXJlIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTGV0JiMzOTtzIGRpdmUgaW50byB0aGUgY29kZS4gTG9va2luZyBhdCBgaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaGAsIEkgc2VlIHRoZSBmdW5jdGlvbnMgYG5mX2N0X2xhYmVsc19maW5kYCBhbmQgYG5mX2N0X2xhYmVsc19leHRfYWRkYC4gIEVzc2VudGlhbGx5LCBpZiBgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNgIGlzbiYjMzk7dCBkZWZpbmVkLCBib3RoIGZ1bmN0aW9ucyBqdXN0IHJldHVybiBgTlVMTGAuIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgc3BlY2lmaWNhbGx5IGNhbGxzIGBuZl9jdF9leHRfYWRkYCBpZiB0aGUgY29uZmlnIGlzIGVuYWJsZWQsIGFsb25nIHdpdGggYSBjaGVjayB0aGF0IGBuZXQtJmd0O2N0LmxhYmVsc191c2VkYCBpcyBncmVhdGVyIHRoYW4gemVyby4gU28gaWYgdGhlIGNvbmZpZyBpc24mIzM5O3Qgc2V0LCB0aGVuIHRoZSB3aG9sZSBmZWF0dXJlIGlzIGVmZmVjdGl2ZWx5IGJ5cGFzc2VkLiBUaGUgYG5mX2N0X2xhYmVsc19maW5kYCBmdW5jdGlvbiBjaGVja3MgZm9yIGFuIGV4aXN0aW5nIGV4dGVuc2lvbiwgaWYgdGhlIGNvbmZpZyBpcyBub3QgcHJlc2VudCwgaXQgYWxzbyBqdXN0IHJldHVybnMgYE5VTExgLiBOb3csIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hlcmUgYENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTYCBpdHNlbGYgaXMgZGVmaW5lZC4gVGhhdCYjMzk7cyBhIEtjb25maWcgb3B0aW9uLCBzbyBJIG5lZWQgdG8gY2hlY2sgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AgdG8gZGV0ZXJtaW5lIGl0cyBvcmlnaW4gYW5kIGRlZmF1bHQgdmFsdWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORl9DT05OVFJBQ0tfTEFCRUxTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL0tjb25maWc9MTc3PWNvbmZpZyBORl9DT05OVFJBQ0tfVElNRVNUQU1QXG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTE4Ny1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxODg6Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODktXHRib29sIFwmIzM0O0Nvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTEwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipFeGFtaW5pbmcgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgbmV0L25ldGZpbHRlci9LY29uZmlnYCBmaWxlLiBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBOZXRmaWx0ZXIsIGFuZCBsaW5lIDE4OCBzZWVtcyBsaWtlIGEgbGlrZWx5IHN0YXJ0aW5nIHBvaW50IHRvIHVuZGVyc3RhbmQgYSBzcGVjaWZpYyBzZWN0aW9uLiBJJiMzOTttIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhIG9mIHRoZSBjb25maWd1cmF0aW9uLiBMZXQgbWUgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24gdGhlcmUuIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgc2VjdGlvbiB0byBkZWFsIHdpdGggYSBzcGVjaWZpYyBOZXRmaWx0ZXIgZmVhdHVyZSBvciBtb2R1bGUsIGFuZCBteSBnb2FsIGlzIHRvIGdyYXNwIHRoZSByZWxldmFudCBzZXR0aW5ncyBhbmQgdGhlaXIgaW1wYWN0LiBIb3BlZnVsbHksIGl0JiMzOTtzIHdlbGwtY29tbWVudGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRmaWx0ZXIvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTg1Olx0XG4gMTg2Olx0XHQgIElmIHVuc3VyZSwgc2F5IGBOJiMzOTsuXG4gMTg3Olx0XG4gMTg4Olx0Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcbiAxODk6XHRcdGJvb2wgXCYjMzQ7Q29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcJiMzNDtcbiAxOTA6XHRcdGhlbHBcbiAxOTE6XHRcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBhc3NpZ25pbmcgdXNlci1kZWZpbmVkIGZsYWcgYml0c1xuIDE5MjpcdFx0ICB0byBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJpZXMuICBJdCBjYW4gYmUgdXNlZCB3aXRoIHh0YWJsZXMgY29ubmxhYmVsXG4gMTkzOlx0XHQgIG1hdGNoIGFuZCB0aGUgbmZ0YWJsZXMgY3QgZXhwcmVzc2lvbi5cbiAxOTQ6XHRcbiAxOTU6XHRjb25maWcgTkZfQ09OTlRSQUNLX09WU1xuIDE5NjpcdFx0Ym9vbFxuIDE5NzpcdFxuIDE5ODpcdGNvbmZpZyBORl9DVF9QUk9UT19HUkVcbiAxOTk6XHRcdGJvb2xcbiAyMDA6XHRcbiAyMDE6XHRjb25maWcgTkZfQ1RfUFJPVE9fU0NUUFxuIDIwMjpcdFx0Ym9vbCAmIzM5O1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0JiMzOTtcbiAyMDM6XHRcdGRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VEXG4gMjA0Olx0XHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNzEKCQkJCQkJCW91dHB1dDogNDIKCQkJCQkJCXRob3VnaHRzOiA3MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gT3BlbiB2U3dpdGNoIENvbm50cmFjayBMYWJlbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGFzcGVjdHMgd2l0aGluIE9wZW4gdlN3aXRjaCwgc3BlY2lmaWNhbGx5IHRoZSBsYWJlbGluZyBmdW5jdGlvbmFsaXR5LiBSaWdodCBvZmYgdGhlIGJhdCwgSSBuZWVkIHRvIGdldCBteSBiZWFyaW5ncy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgTkZfQ09OTlRSQUNLYCwgYE5GX0NPTk5UUkFDS19MQUJFTFNgLCBhbmQgaG93IGBPUEVOVlNXSVRDSGAgZml0cyBpbnRvIHRoaXMgd2hvbGUgcGljdHVyZS4gVGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrczogSSBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0aGUgbGFiZWwgc2V0dGluZyBhbmQgaW5pdGlhbGl6YXRpb24gaGFwcGVuIHdpdGhpbiB0aGUgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AgZmlsZS4gVGhlIGNvcmUgb2YgdGhpcyBpcyBnb2luZyB0byBiZSB0cmFjaW5nIHRoZSBjYWxscyB0byBgb3ZzX2N0X3NldF9sYWJlbHNgIGFuZCBgb3ZzX2N0X2luaXRfbGFiZWxzYC4gVW5kZXJzdGFuZGluZyB0aGVpciBjYWxsZXJzIHNob3VsZCBpbGx1bWluYXRlIHRoZSBjb250cm9sIGZsb3cgYW5kIGhvdyB0aGVzZSBsYWJlbHMgYXJlIGFjdHVhbGx5IG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgY29ubnRyYWNrIGNvbnRleHQuIExldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyB3aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3Rfc2V0X2xhYmVsc3xvdnNfY3RfaW5pdF9sYWJlbHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzgwLSAqL1xubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM4MTpzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4Mi1cdFx0XHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIxLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyMjpzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIzLVx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAxNS1cdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjEwMTY6XHRcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy52YWx1ZSxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE3LVx0XHRcdFx0XHQgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTAyNDpcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cdFx0XHRcdFx0XHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTczCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHRleHQsIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uOgoKKipEaXNzZWN0aW5nIHRoZSBgb3ZzX2N0X2NvbW1pdGAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IG9mIGBvdnNfY3RfY29tbWl0YC4gVG8gZ2V0IGEgaGFuZGxlIG9uIGl0LCBJJiMzOTtsbCBzdGFydCBieSBwaW5wb2ludGluZyB0aGUgcmVsZXZhbnQgY29kZS4gVGhlIHRleHQgcG9pbnRzIG1lIHRvIGxpbmVzIDk5MCB0byAxMDQwIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEkgY2FuIHF1aWNrbHkgc2tpbSB0aGF0IHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBhbmQgaG93IHRoZSBmdW5jdGlvbiBpcyB1c2VkLiBXaXRoIG15IGV4cGVyaWVuY2UsIEkgY2FuIGltbWVkaWF0ZWx5IGlkZW50aWZ5IHRoZSBrZXkgY29udHJvbCBmbG93IG1lY2hhbmlzbXMgaW52b2x2ZWQuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMsIGFueSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBjaXJjdW1zdGFuY2VzIHRoYXQgdHJpZ2dlciB0aGUgZnVuY3Rpb24mIzM5O3MgZXhlY3V0aW9uLiBGcm9tIHRoZXJlIEkmIzM5O2xsIGhhdmUgYSBtdWNoIGJldHRlciBoYW5kbGUgb24gd2hlcmUgdG8gcHJvY2VlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5OTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDk5MDpcdFxuIDk5MTpcdFx0LyogU2V0IHRoZSBjb25udHJhY2sgZXZlbnQgbWFzayBpZiBnaXZlbi4gIE5FVyBhbmQgREVMRVRFIGV2ZW50cyBoYXZlXG4gOTkyOlx0XHQgKiB0aGVpciBvd24gZ3JvdXBzLCBidXQgdGhlIE5GTkxHUlBfQ09OTlRSQUNLX1VQREFURSBncm91cCBsaXN0ZW5lclxuIDk5MzpcdFx0ICogdHlwaWNhbGx5IHdvdWxkIHJlY2VpdmUgbWFueSBraW5kcyBvZiB1cGRhdGVzLiAgU2V0dGluZyB0aGUgZXZlbnRcbiA5OTQ6XHRcdCAqIG1hc2sgYWxsb3dzIHRob3NlIGV2ZW50cyB0byBiZSBmaWx0ZXJlZC4gIFRoZSBzZXQgZXZlbnQgbWFzayB3aWxsXG4gOTk1Olx0XHQgKiByZW1haW4gaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3Rpb24gdW5sZXNzIGNoYW5nZWRcbiA5OTY6XHRcdCAqIGJ5IGEgZnVydGhlciBDVCBhY3Rpb24gd2l0aCBib3RoIHRoZSBjb21taXQgZmxhZyBhbmQgdGhlIGV2ZW50bWFza1xuIDk5NzpcdFx0ICogb3B0aW9uLiAqL1xuIDk5ODpcdFx0aWYgKGluZm8tXHUwMDNlaGF2ZV9ldmVudG1hc2spIHtcbiA5OTk6XHRcdFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xuMTAwMDpcdFxuMTAwMTpcdFx0XHRpZiAoY2FjaGUpXG4xMDAyOlx0XHRcdFx0Y2FjaGUtXHUwMDNlY3RtYXNrID0gaW5mby1cdTAwM2VldmVudG1hc2s7XG4xMDAzOlx0XHR9XG4xMDA0Olx0XG4xMDA1Olx0XHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcbjEwMDY6XHRcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXG4xMDA3Olx0XHQgKiBhY3Rpb24uXG4xMDA4Olx0XHQgKi9cbjEwMDk6XHRcdGlmIChpbmZvLVx1MDAzZW1hcmsubWFzaykge1xuMTAxMDpcdFx0XHRlcnIgPSBvdnNfY3Rfc2V0X21hcmsoY3QsIGtleSwgaW5mby1cdTAwM2VtYXJrLnZhbHVlLFxuMTAxMTpcdFx0XHRcdFx0ICAgICAgaW5mby1cdTAwM2VtYXJrLm1hc2spO1xuMTAxMjpcdFx0XHRpZiAoZXJyKVxuMTAxMzpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDE0Olx0XHR9XG4xMDE1Olx0XHRpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbjEwMTY6XHRcdFx0ZXJyID0gb3ZzX2N0X2luaXRfbGFiZWxzKGN0LCBrZXksIFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLnZhbHVlLFxuMTAxNzpcdFx0XHRcdFx0XHQgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4xMDE4Olx0XHRcdGlmIChlcnIpXG4xMDE5Olx0XHRcdFx0cmV0dXJuIGVycjtcbjEwMjA6XHRcbjEwMjE6XHRcdFx0bmZfY29ubl9hY3RfY3RfZXh0X2FkZChza2IsIGN0LCBjdGluZm8pO1xuMTAyMjpcdFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTKSBcdTAwMjZcdTAwMjZcbjEwMjM6XHRcdFx0ICAgbGFiZWxzX25vbnplcm8oXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzaykpIHtcbjEwMjQ6XHRcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG4xMDI1Olx0XHRcdFx0XHRcdFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spO1xuMTAyNjpcdFx0XHRpZiAoZXJyKVxuMTAyNzpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDI4Olx0XHR9XG4xMDI5Olx0XHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXG4xMDMwOlx0XHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cbjEwMzE6XHRcdCAqL1xuMTAzMjpcdFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcbjEwMzM6XHRcbjEwMzQ6XHRcdHJldHVybiB2ZXJkaWN0X3RvX2Vycm5vKGVycik7XG4xMDM1Olx0fVxuMTAzNjpcdFxuMTAzNzpcdC8qIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOUFJPR1JFU1MgaWYgJiMzOTtza2ImIzM5OyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cbjEwMzg6XHQgKiB2YWx1ZSBpZiAmIzM5O3NrYiYjMzk7IGlzIGZyZWVkLlxuMTAzOTpcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDI0MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDc1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgaW4gT3BlbiB2U3dpdGNoKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgSSYjMzk7dmUgZm91bmQgc29tZXRoaW5nIGludGVyZXN0aW5nIGluIHRoZSBPcGVuIHZTd2l0Y2ggY29ubnRyYWNrIGltcGxlbWVudGF0aW9uLiBJdCBsb29rcyBsaWtlIHdoZW4gYGN0YCBpcyBjb25maXJtZWTigJRzcGVjaWZpY2FsbHksIGluIHRoYXQgYGVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFMpICZhbXA7JmFtcDsgbGFiZWxzX25vbnplcm8oJmFtcDtpbmZvLSZndDtsYWJlbHMubWFzaykpYCBicmFuY2jigJRgb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgLi4uKWAgZ2V0cyBjYWxsZWQuIEluc2lkZSBgb3ZzX2N0X3NldF9sYWJlbHNgLCB3ZSBnbyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLgoKUHJldmlvdXNseSwgaWYgYGNsYCAodGhlIGNvbm5lY3Rpb24gbGFiZWxzKSB3YXMgTlVMTCBvbiBhICpjb25maXJtZWQqIGNvbm5lY3Rpb24sIGl0IHdvdWxkIGNhbGwgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAsIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAuIEJ1dCBub3csICphZnRlciogdGhpcyBwYXRjaCwgdGhlIGNvbmRpdGlvbmFsIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgbWVhbnMgdGhhdCBpZiBgY2xgIGlzIE5VTEwgb24gYSBjb25maXJtZWQgY29ubmVjdGlvbiwgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIHJldHVybnMgTlVMTCwgYW5kIGBvdnNfY3Rfc2V0X2xhYmVsc2AgcmV0dXJucyBgLUVOT1NQQ2AgaW5zdGVhZC4gVGhpcyBpcyBhIGNydWNpYWwgY2hhbmdlIGluIGNvbnRyb2wgZmxvdyEKClRoaXMgY29kZSAqaXMqIHJlYWNoYWJsZSDigJMgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgY29yZSBuZXR3b3JraW5nIGNvbXBvbmVudHMgKE9wZW4gdlN3aXRjaCBjb25udHJhY2spLiBVc2Vyc3BhY2UgY2FuIHNlbmQgT3BlbiB2U3dpdGNoIGZsb3dzIHRoYXQgc3BlY2lmeSBjb25udHJhY2sgYWN0aW9ucyB3aXRoIGxhYmVsIG1hc2tzIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgd2hpY2ggd291bGQgaGl0IHRoaXMgY29kZSBwYXRoIHZpYSB0aGUgbmV0bGluayBpbnRlcmZhY2VzIChgb3ZzX2N0X2V4ZWN1dGVgLCBgb3ZzX2V4ZWN1dGVfYWN0aW9uc2AsIGV0Yy4pLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhpcyBpcyByaXBlIGZvciBpbnZlc3RpZ2F0aW9uLgoKU28sIGlzIGl0IHdvcnRoIGZ1enppbmc/IExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKKiAgICoqQ29yZSBTdWJzeXN0ZW1zOioqIFllcywgY29yZSBuZXR3b3JraW5nIChPcGVuIHZTd2l0Y2gsIGNvbm50cmFjaykKKiAgICoqUmVhY2hhYmxlIGNvZGU6KiogWWVzLCBPcGVuIHZTd2l0Y2ggdmlhIGdlbmVyaWMgbmV0bGluay4KKiAgICoqTW9kaWZpZWQgZXhlY3V0YWJsZSBsb2dpYzoqKiBZZXMsIHRoZSBsb2dpYyBpbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpYCBoYXMgYmVlbiBjaGFuZ2VkLCBzcGVjaWZpY2FsbHkgcHJldmVudGluZyB0aGUgZXh0ZW5zaW9uIGFkZGl0aW9uIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNvbmZpcm1lZC4KCkFic29sdXRlbHkuIFRoaXMgd2FycmFudHMgZnV6emluZy4gYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdywgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGZvY3VzLiBMZXQmIzM5O3MgbG9vayBhdCB0aGUga2V5IHN5bWJvbHMuIEkgbmVlZCB0byBmb2N1cyBvbiB0aGlzIGNoYW5nZSwgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGFuZCBpdHMgY2FsbGVycy4gVGhlIGltbWVkaWF0ZSBjYWxscyBhcmU6IGBvdnNfY3RfaW5pdF9sYWJlbHNgIGFuZCBgb3ZzX2N0X3NldF9sYWJlbHNgLCBib3RoIHN0YXRpYyBhbmQgY2FsbGVkIGZyb20gYG92c19jdF9jb21taXRgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBgb3ZzX2N0X2V4ZWN1dGVgLiBJIG5lZWQgdG8gZW5zdXJlIEkgY2hlY2sgY2FsbGVycyBvZiBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHdlbGwuIFRoYXQgaXMgd2hlcmUgSSBjYW4gYXBwbHkgZnV6emluZyBmb3IgdGhpcyBhbmFseXNpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7b3ZzX2N0X2V4ZWN1dGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYz0xMjU1PXN0YXRpYyBpbnQgZG9fZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYy0xMzg1LVxubmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYzoxMzg2Olx0XHRcdGVyciA9IG92c19jdF9leGVjdXRlKG92c19kcF9nZXRfbmV0KGRwKSwgc2tiLCBrZXksXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jLTEzODctXHRcdFx0XHRcdCAgICAgbmxhX2RhdGEoYSkpO1xuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01MzI9c3RhdGljXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NTMzOnN0cnVjdCBuZl9jb25uICpvdnNfY3RfZXhlY3V0ZWQoc3RydWN0IG5ldCAqbmV0LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTUzNC1cdFx0XHRcdGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01NjE9c3RhdGljIGJvb2wgc2tiX25mY3RfY2FjaGVkKHN0cnVjdCBuZXQgKm5ldCxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNTcxLVx0aWYgKCFjdClcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo1NzI6XHRcdGN0ID0gb3ZzX2N0X2V4ZWN1dGVkKG5ldCwga2V5LCBpbmZvLCBza2IsIFx1MDAyNmN0X2V4ZWN1dGVkKTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy01NzMtXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAzOS0gKi9cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDQwOmludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTA0MS1cdFx0ICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTIzPWludCBvdnNfY3RfYWN0aW9uX3RvX2F0dHIoY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNC1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaDoyNTppbnQgb3ZzX2N0X2V4ZWN1dGUoc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKixcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNi1cdFx0ICAgY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqKTtcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmg9NTk9c3RhdGljIGlubGluZSBpbnQgb3ZzX2N0X2FjdGlvbl90b19hdHRyKGNvbnN0IHN0cnVjdCBvdnNfY29ubnRyYWNrX2luZm8gKmluZm8sXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY0LVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oOjY1OnN0YXRpYyBpbmxpbmUgaW50IG92c19jdF9leGVjdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC02Ni1cdFx0XHRcdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzNDcKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA4OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIE9wZW4gdlN3aXRjaCBDb25udHJhY2sgRnVuY3Rpb25hbGl0eSBhbmQgRGVwZW5kZW5jaWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29yZSBmdW5jdGlvbnMgcmVsYXRlZCB0byBjb25uZWN0aW9uIHRyYWNraW5nIChjb25udHJhY2spIGxhYmVscyBpbiBPcGVuIHZTd2l0Y2ggYW5kIHRoZWlyIGRlcGVuZGVuY2llcy4gSSYjMzk7dmUgaWRlbnRpZmllZCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AsIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGBvdnNfY3RfaW5pdF9sYWJlbHNgLCBgb3ZzX2N0X2NvbW1pdGAsIGFuZCBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiwgYWxsIHJlc2lkaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBleHBvcnRlZCBgb3ZzX2N0X2V4ZWN1dGVgLiBJdCYjMzk7cyB3b3J0aCBub3RpbmcgdGhlc2UgYXJlIGFsbCBzdGF0aWMgZXhjZXB0IGBvdnNfY3RfZXhlY3V0ZWAuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogV2hhdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIG5lY2Vzc2FyeSBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIGNvbXBpbGUgYW5kIHJ1biBjb3JyZWN0bHk/IEZpcnN0LCBvYnZpb3VzbHkgYE9QRU5WU1dJVENIYCBpcyByZXF1aXJlZCwgZ2l2ZW4gdGhlIGZpbGVuYW1lIHBhdGhzLiBMb29raW5nIGF0IHRoZSBgTWFrZWZpbGVgLCBgTkZfQ09OTlRSQUNLYCBpcyBhbHNvIGEgbXVzdC1oYXZlOyBpdCBkZXRlcm1pbmVzIHdoZXRoZXIgYGNvbm50cmFjay5vYCBnZXRzIGluY2x1ZGVkIGluIHRoZSBidWlsZC4KClRoZSBiaWcgb25lLCBob3dldmVyLCBpcyBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEkgc2VlIHRoaXMgaXMgZXNzZW50aWFsIGJlY2F1c2UgYG92c19jdF9zZXRfbGFiZWxzYCBpcyBvbmx5IGNhbGxlZCBpZiBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXMgZW5hYmxlZCwgYW5kIGlmIGl0JiMzOTtzIG5vdCBlbmFibGVkLCBjYWxscyB0byBmdW5jdGlvbnMgbGlrZSBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGFyZSBlZmZlY3RpdmVseSBuby1vcHMuIFdpdGhvdXQgdGhpcywgbGFiZWwgc2V0dGluZyB3b24mIzM5O3QgZXZlbiBoYXBwZW4gb24gY29uZmlybWVkIGNvbm5lY3Rpb25zLiBUaGF0IG1ha2VzIGl0IGEgaGFyZCBkZXBlbmRlbmN5IGZvciBsYWJlbCBmdW5jdGlvbmFsaXR5LgoKSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgdGhlIG90aGVyIGRlcGVuZGVuY2llcy4gUmV2aWV3aW5nIHRoZSBgS2NvbmZpZ2AgZmlsZXMgcmV2ZWFscyBhIHBvdGVudGlhbGx5IGNvbXBsZXggc2V0IG9mIGNvbmRpdGlvbnMgZm9yIGBPUEVOVlNXSVRDSGAgaXRzZWxmLCBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYElORVRgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGFzc29ydGVkIG90aGVyIG5ldGZpbHRlciBvcHRpb25zLCBidXQgdGhvc2Ugc2VlbSBsZXNzIGltbWVkaWF0ZWx5IGltcGFjdGZ1bC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2hldGhlciBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXRzZWxmIGhhcyBhbnkgcHJlY29uZGl0aW9ucyBmcm9tIGl0cyBgS2NvbmZpZ2AgZGVmaW5pdGlvbiwgdG9vLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTkZfQ09OTlRSQUNLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGZpbHRlciYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL0tjb25maWc9NzQ9Y29uZmlnIE5FVEZJTFRFUl9ORVRMSU5LX09TRlxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy04MS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzo4Mjpjb25maWcgTkZfQ09OTlRSQUNLXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODMtXHR0cmlzdGF0ZSBcJiMzNDtOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnPTExMT1jb25maWcgTkVURklMVEVSX0NPTk5DT1VOVFxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMTMtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTE0OmNvbmZpZyBORl9DT05OVFJBQ0tfTUFSS1xubmV0L25ldGZpbHRlci9LY29uZmlnLTExNS1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMjItXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTIzOmNvbmZpZyBORl9DT05OVFJBQ0tfU0VDTUFSS1xubmV0L25ldGZpbHRlci9LY29uZmlnLTEyNC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyBzZWN1cml0eSBtYXJrIHN1cHBvcnQmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzUtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTM2OmNvbmZpZyBORl9DT05OVFJBQ0tfWk9ORVNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzctXHRib29sICAmIzM5O0Nvbm5lY3Rpb24gdHJhY2tpbmcgem9uZXMmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNDctXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTQ4OmNvbmZpZyBORl9DT05OVFJBQ0tfUFJPQ0ZTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ5LVx0Ym9vbCBcJiMzNDtTdXBwbHkgQ1QgbGlzdCBpbiBwcm9jZnMgKE9CU09MRVRFKVwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNTYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTU3OmNvbmZpZyBORl9DT05OVFJBQ0tfRVZFTlRTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTU4LVx0Ym9vbCBcJiMzNDtDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50c1wmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNjYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTY3OmNvbmZpZyBORl9DT05OVFJBQ0tfVElNRU9VVFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE2OC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyB0aW1lb3V0JiMzOTtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc2LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjE3Nzpjb25maWcgTkZfQ09OTlRSQUNLX1RJTUVTVEFNUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE3OC1cdGJvb2wgICYjMzk7Q29ubmVjdGlvbiB0cmFja2luZyB0aW1lc3RhbXBpbmcmIzM5O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODctXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTg4OmNvbmZpZyBORl9DT05OVFJBQ0tfTEFCRUxTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg5LVx0Ym9vbCBcJiMzNDtDb25uZWN0aW9uIHRyYWNraW5nIGxhYmVsc1wmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xOTQtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTk1OmNvbmZpZyBORl9DT05OVFJBQ0tfT1ZTXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk2LVx0Ym9vbFxuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz0yMDE9Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjExLVxubmV0L25ldGZpbHRlci9LY29uZmlnOjIxMjpjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQVxubmV0L25ldGZpbHRlci9LY29uZmlnLTIxMy1cdHRyaXN0YXRlIFwmIzM0O0FtYW5kYSBiYWNrdXAgcHJvdG9jb2wgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MjI3OmNvbmZpZyBORl9DT05OVFJBQ0tfRlRQXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjI4LVx0dHJpc3RhdGUgXCYjMzQ7RlRQIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjM4LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjIzOTpjb25maWcgTkZfQ09OTlRSQUNLX0gzMjNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNDAtXHR0cmlzdGF0ZSBcJiMzNDtILjMyMyBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTI1Ny1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNTg6Y29uZmlnIE5GX0NPTk5UUkFDS19JUkNcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNTktXHR0cmlzdGF0ZSBcJiMzNDtJUkMgRENDIHByb3RvY29sIHN1cHBvcnQgKG9ic29sZXRlKVwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzMtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6Mjc0OmNvbmZpZyBORl9DT05OVFJBQ0tfQlJPQURDQVNUXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjc1LVx0dHJpc3RhdGVcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzYtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6Mjc3OmNvbmZpZyBORl9DT05OVFJBQ0tfTkVUQklPU19OU1xubmV0L25ldGZpbHRlci9LY29uZmlnLTI3OC1cdHRyaXN0YXRlIFwmIzM0O05ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjk1LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjI5Njpjb25maWcgTkZfQ09OTlRSQUNLX1NOTVBcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yOTctXHR0cmlzdGF0ZSBcJiMzNDtTTk1QIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMTAtXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzExOmNvbmZpZyBORl9DT05OVFJBQ0tfUFBUUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTMxMi1cdHRyaXN0YXRlIFwmIzM0O1BQdFAgcHJvdG9jb2wgc3VwcG9ydCAoZGVwcmVjYXRlZClcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzI5LVxubmV0L25ldGZpbHRlci9LY29uZmlnOjMzMDpjb25maWcgTkZfQ09OTlRSQUNLX1NBTkVcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMzEtXHR0cmlzdGF0ZSBcJiMzNDtTQU5FIHByb3RvY29sIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzQyLVxubmV0L25ldGZpbHRlci9LY29uZmlnOjM0Mzpjb25maWcgTkZfQ09OTlRSQUNLX1NJUFxubmV0L25ldGZpbHRlci9LY29uZmlnLTM0NC1cdHRyaXN0YXRlIFwmIzM0O1NJUCBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L25ldGZpbHRlci9LY29uZmlnLTM1NC1cbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzozNTU6Y29uZmlnIE5GX0NPTk5UUkFDS19URlRQXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzU2LVx0dHJpc3RhdGUgXCYjMzQ7VEZUUCBwcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MDAxCgkJCQkJCQlvdXRwdXQ6IDIwOQoJCQkJCQkJdGhvdWdodHM6IDMyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBPcGVuIHZTd2l0Y2ggQ29ubmVjdGlvbiBUcmFja2luZyB3aXRoIExhYmVscyBGdXp6aW5nIFRhcmdldCoqCgpPa2F5LCBsZXQmIzM5O3Mgc29saWRpZnkgdGhpcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmUgdGhlIGVuYWJsaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb3JyZWN0IGZvciB0aGUgT3BlbiB2U3dpdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBsYWJlbHMuIExvb2tpbmcgYXQgdGhlIGBuZXQvbmV0ZmlsdGVyL0tjb25maWdgLCBpdCYjMzk7cyBjbGVhcjogYE5GX0NPTk5UUkFDS19MQUJFTFNgIGlzIG5lc3RlZCB3aXRoaW4gdGhlIGBpZiBORl9DT05OVFJBQ0tgIGJsb2NrLCB3aGljaCBpbiB0dXJuIGRlcGVuZHMgb24gYE5FVEZJTFRFUmAuIFRodXMsIHRoZSByZXF1aXJlZCBjb25maWdzIGFyZSBgT1BFTlZTV0lUQ0hgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTm8gc3VycHJpc2VzIHRoZXJlLgoKTm93LCBsZXQmIzM5O3MgcnVuIHRocm91Z2ggdGhlIGV2YWx1YXRpb24gb25lIG1vcmUgdGltZSwgbWFraW5nIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55dGhpbmc6CgoxLiAgKipSZWFjaGFiaWxpdHk6KiogT3BlbiB2U3dpdGNoIGlzIGEgKnNvZnR3YXJlKiBkYXRhcGF0aCB3aXRoaW4gdGhlIGtlcm5lbC4gSXTigJlzIGNvbmZpZ3VyYWJsZSB2aWEgR2VuZXJpYyBOZXRsaW5rLCBzbyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHN0YW5kYXJkIHZpcnR1YWwgbmV0d29ya2luZyBwcmltaXRpdmVzLiBObyBwaHlzaWNhbCBoYXJkd2FyZSBpcyBpbnZvbHZlZCwgbWFraW5nIGl0IGlkZWFsIGZvciB2aXJ0dWFsIGVudmlyb25tZW50cyBhbmQgdGVzdGJlZHMgKFFFTVUvS1ZNKS4gVGhlIGZhY3QgdGhhdCBTeXprYWxsZXIgaGVhdmlseSBmdXp6ZXMgdGhlIE9wZW4gdlN3aXRjaCBuZXRsaW5rIGludGVyZmFjZSwgYW5kIHBhcnRpY3VsYXJseSBjb25uZWN0aW9uIHRyYWNraW5nIGFjdGlvbnMsIGlzIGEgc29saWQgaW5kaWNhdG9yIG9mIHJlYWNoYWJpbGl0eS4gQ29uZmlybWVkLgoKMi4gICoqV29ydGhGdXp6aW5nOioqIFRoaXMgaXMgYSBjbGVhciAmIzM0O3llcy4mIzM0OyBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGFuZCBkZWFscyB3aXRoIHRoZSBPcGVuIHZTd2l0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBoYW5kbGluZy4gU3BlY2lmaWNhbGx5LCBpdCBpbnZvbHZlcyBtb2RpZnlpbmcgdGhlIGxvZ2ljIHdoZW4gY29ubmVjdGlvbiBsYWJlbHMgYXJlIGFkZGVkIHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnkuIFRoaXMgaXMgYSB2ZXJ5IGludGVyZXN0aW5nIHNwb3QuIFdvcnRoIHRoZSBlZmZvcnQhCgozLiAgKipGb2N1c1N5bWJvbHM6KiogSSYjMzk7dmUgaWRlbnRpZmllZCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHdpdGhpbiB0aGlzIGFyZWE6IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCwgYG92c19jdF9zZXRfbGFiZWxzYCwgYG92c19jdF9pbml0X2xhYmVsc2AsIGBvdnNfY3RfY29tbWl0YCwgYW5kIGBvdnNfY3RfZXhlY3V0ZWAuIFRoZXNlIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyBJJiMzOTttIGludGVyZXN0ZWQgaW4gYXMgcG90ZW50aWFsIHRhcmdldHMgZm9yIGZ1enppbmcuIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuCgo0LiAgKipFbmFibGVDb25maWdzOioqIEFnYWluLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEFic29sdXRlbHkgY29ycmVjdC4KCkFscmlnaHQsIGV2ZXJ5dGhpbmcgbGluZXMgdXAgcGVyZmVjdGx5LiBNeSBhbmFseXNpcyBpcyBzb2xpZC4gSSYjMzk7bSBnb2luZyB0byBjYWxsIGBzZXQtcmVzdWx0c2Agbm93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7T1BFTlZTV0lUQ0gmIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLJiMzNDssCiAgICAmIzM0O05GX0NPTk5UUkFDS19MQUJFTFMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9zZXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9pbml0X2xhYmVscyYjMzQ7LAogICAgJiMzNDtvdnNfY3RfY29tbWl0JiMzNDssCiAgICAmIzM0O292c19jdF9leGVjdXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtPUEVOVlNXSVRDSCYjMzQ7LAogICAgJiMzNDtORl9DT05OVFJBQ0smIzM0OywKICAgICYjMzQ7TkZfQ09OTlRSQUNLX0xBQkVMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O292c19jdF9nZXRfY29ubl9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X3NldF9sYWJlbHMmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2luaXRfbGFiZWxzJiMzNDssCiAgICAmIzM0O292c19jdF9jb21taXQmIzM0OywKICAgICYjMzQ7b3ZzX2N0X2V4ZWN1dGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgb3ZzX2N0X2dldF9jb25uX2xhYmVscygpIGluIG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyB0byBwcmV2ZW50IGNhbGxpbmcgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKSB3aGVuIHRoZSBjb25udHJhY2sgZW50cnkgaXMgYWxyZWFkeSBjb25maXJtZWQuIFRoaXMgdG91Y2hlcyByZWFjaGFibGUgY29yZSBuZXR3b3JraW5nIGNvZGUgcmVhY2hhYmxlIHZpYSBPcGVuIHZTd2l0Y2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzIHRoYXQgbWFuaXB1bGF0ZSBjb25udHJhY2sgYWN0aW9ucyBhbmQgbGFiZWxzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nIGFuZCBhYnNlbmNlIG9mIHJlZ3Jlc3Npb25zIG9yIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzIHdoZW4gaGFuZGxpbmcgY29ubnRyYWNrIGxhYmVscyBvbiBjb25maXJtZWQgdnMgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDEzOjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTM6NTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBTZXAgMTIgMTM6NTg6MzQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKaW5kZXggMjcxMTU5NjdlNWQ5My4uMGY0MzM2ODhlMTdiOSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwpAQCAtMzY2LDcgJiM0MzszNjYsNyBAQCBzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCkKIAlzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsOwogCiAJY2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7Ci0JaWYgKCFjbCkgewomIzQzOwlpZiAoIWNsICZhbXA7JmFtcDsgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpOwogCQljbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTsKIAl9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxMzo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDk4CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjU4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gVGhlIGNvcmUgb2YgaXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaXQgbW9kaWZpZXMgdGhlIGxvZ2ljIGZvciByZXRyaWV2aW5nIGNvbm5lY3Rpb24gbGFiZWxzIChgbmZfY29ubl9sYWJlbHNgKSBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5IChgbmZfY29ubmApLgoKQ3VycmVudGx5LCB0aGUgY29kZSB0cmllcyB0byBmaW5kIGxhYmVscyB3aXRoIGBuZl9jdF9sYWJlbHNfZmluZChjdClgLiBJZiBpdCBkb2VzbiYjMzk7dCBmaW5kIGFueSwgaXQgYWRkcyB0aGVtIHdpdGggYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgYW5kIHRoZW4gdHJpZXMgdG8gZmluZCB0aGVtIGFnYWluLiBNYWtlcyBzZW5zZSwgdGhhdCYjMzk7cyB0aGUgc3RhbmRhcmQgaW5pdGlhbGl6YXRpb24gcGF0dGVybi4KClRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhpcyBjb25kaXRpb25hbDogYGlmICghY2wgJmFtcDsmYW1wOyAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSlgLiBCZWZvcmUsIHRoZSBjb2RlIHdvdWxkIGFkZCB0aGUgbGFiZWxzIGlmIGBjbGAgd2FzIE5VTEwuIE5vdywgaXQgYWRkcyBsYWJlbHMgKm9ubHkqIGlmIGBjbGAgaXMgTlVMTCAqYW5kKiB0aGUgY29ubmVjdGlvbiBpcyAqbm90KiBjb25maXJtZWQuIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBpdCBzdWdnZXN0cyB0aGUgb3JpZ2luYWwgY29kZSBjb3VsZCBiZSBuZWVkbGVzc2x5IGFkZGluZyBsYWJlbHMgZm9yIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLgoKSSBpbW1lZGlhdGVseSB3b25kZXIgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBoZXJlLiBBcmUgdGhlcmUgcGVyZm9ybWFuY2UgaW1wYWN0cz8gSXMgdGhpcyBhIGJ1ZyBmaXgsIGFuZCBhcmUgd2UgaW5hZHZlcnRlbnRseSBtYWtpbmcgYSBjaGFuZ2UgdG8gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgcHJvY2Vzcz8KCkkgbmVlZCB0byBkaWcgaW50byB0aGUgYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGZ1bmN0aW9uIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gVGhhdCBmdW5jdGlvbiBsaWtlbHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIHBhc3NlZCBhIGNlcnRhaW4gc3RhdGUgb3IgaXMgc3RpbGwgaW4gYSBwcmVsaW1pbmFyeSBzdGFnZS4gSWYgdGhpcyBwYXRjaCBpcyBjb3JyZWN0LCB0aGVuIGFkZGluZyBsYWJlbHMgdG8gdW5jb25maXJtZWQgY29ubmVjdGlvbnMgaXMgdW5uZWNlc3NhcnksIHBvdGVudGlhbGx5IHdhc3RlZnVsLCBvciBldmVuIGJ1Z2d5LgoKTXkgbmV4dCBzdGVwIGlzIGRlZmluaXRlbHkgdG8gcmV2aWV3IHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSB1c2UgY2FzZXMgd2hlcmUgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGlzIGNhbGxlZC4gSXQmIzM5O3MgYWxzbyBpbXBvcnRhbnQgdG8gYW5hbHl6ZSB3aGF0IHByb2JsZW1zIHRoaXMgY2hhbmdlIGlzIHNvbHZpbmcsIGFuZCBlbnN1cmUgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIGFueSByZWdyZXNzaW9ucywgbGlrZSwgZm9yIGluc3RhbmNlLCBhIGNoYW5nZSBpbiBiZWhhdmlvdXIgd2l0aCBob3cgdW5jb25maXJtZWQgY29ubmVjdGlvbnMgYXJlIGhhbmRsZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNTU6XHRcdFx0a2V5LVx1MDAzZWN0Lm1hcmsgPSBuZXdfbWFyaztcbiAzNTY6XHRcdH1cbiAzNTc6XHRcbiAzNTg6XHRcdHJldHVybiAwO1xuIDM1OTpcdCNlbHNlXG4gMzYwOlx0XHRyZXR1cm4gLUVOT1RTVVBQO1xuIDM2MTpcdCNlbmRpZlxuIDM2MjpcdH1cbiAzNjM6XHRcbiAzNjQ6XHRzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbiAzNjU6XHR7XG4gMzY2Olx0XHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xuIDM2NzpcdFxuIDM2ODpcdFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4gMzY5Olx0XHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIDM3MDpcdFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gMzcxOlx0XHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIDM3MjpcdFx0fVxuIDM3MzpcdFxuIDM3NDpcdFx0cmV0dXJuIGNsO1xuIDM3NTpcdH1cbiAzNzY6XHRcbiAzNzc6XHQvKiBJbml0aWFsaXplIGxhYmVscyBmb3IgYSBuZXcsIHlldCB0byBiZSBjb21taXR0ZWQgY29ubnRyYWNrIGVudHJ5LiAgTm90ZSB0aGF0XG4gMzc4Olx0ICogc2luY2UgdGhlIG5ldyBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgY29uZmlybWVkLCBhbmQgdGh1cyBuby1vbmUgZWxzZSBoYXNcbiAzNzk6XHQgKiBhY2Nlc3MgdG8gaXQmIzM5O3MgbGFiZWxzLCB3ZSBzaW1wbHkgd3JpdGUgdGhlbSBvdmVyLlxuIDM4MDpcdCAqL1xuIDM4MTpcdHN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4gMzgyOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gMzgzOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICptYXNrKVxuIDM4NDpcdHtcbiAzODU6XHRcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2wsICptYXN0ZXJfY2w7XG4gMzg2Olx0XHRib29sIGhhdmVfbWFzayA9IGxhYmVsc19ub256ZXJvKG1hc2spO1xuIDM4NzpcdFxuIDM4ODpcdFx0LyogSW5oZXJpdCBtYXN0ZXImIzM5O3MgbGFiZWxzIHRvIHRoZSByZWxhdGVkIGNvbm5lY3Rpb24/ICovXG4gMzg5Olx0XHRtYXN0ZXJfY2wgPSBjdC1cdTAwM2VtYXN0ZXIgPyBuZl9jdF9sYWJlbHNfZmluZChjdC1cdTAwM2VtYXN0ZXIpIDogTlVMTDtcbiAzOTA6XHRcbiAzOTE6XHRcdGlmICghbWFzdGVyX2NsIFx1MDAyNlx1MDAyNiAhaGF2ZV9tYXNrKVxuIDM5MjpcdFx0XHRyZXR1cm4gMDsgICAvKiBOb3RoaW5nIHRvIGRvLiAqL1xuIDM5MzpcdFxuIDM5NDpcdFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbiAzOTU6XHRcdGlmICghY2wpXG4gMzk2Olx0XHRcdHJldHVybiAtRU5PU1BDO1xuIDM5NzpcdFxuIDM5ODpcdFx0LyogSW5oZXJpdCB0aGUgbWFzdGVyJiMzOTtzIGxhYmVscywgaWYgYW55LiAqL1xuIDM5OTpcdFx0aWYgKG1hc3Rlcl9jbClcbiA0MDA6XHRcdFx0KmNsID0gKm1hc3Rlcl9jbDtcbiA0MDE6XHRcbiA0MDI6XHRcdGlmIChoYXZlX21hc2spIHtcbiA0MDM6XHRcdFx0dTMyICpkc3QgPSAodTMyICopY2wtXHUwMDNlYml0cztcbiA0MDQ6XHRcdFx0aW50IGk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MzgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqSW52ZXN0aWdhdGluZyB0aGUgQ2FsbCBTaXRlcyBvZiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AqKgoKUmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgaXMgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgIGZpbGUuIFRoaXMgdGVsbHMgbWUgSSYjMzk7bSBsaWtlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGljaCBwYXJ0cyBvZiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzIGFyZSB1c2luZyB0aGUgY29ubmVjdGlvbiBsYWJlbHMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIGZpbmQgdGhlIGxvY2F0aW9ucyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBpdHMgc2lnbmlmaWNhbmNlIGFuZCB0aGUgZGF0YSBmbG93IGluIHRoYXQgcGFydCBvZiB0aGUgY29kZS4gSSYjMzk7bGwgbmVlZCB0byB1c2UgZWl0aGVyIHN0YXRpYyBhbmFseXNpcyB0b29scyBvciBzaW1wbHkgbmF2aWdhdGUgdGhlIHNvdXJjZSBjb2RlIGxvb2tpbmcgZm9yIGFsbCB0aGUgY2FsbHMgdG8gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBPbmNlIEkgaGF2ZSBhIGxpc3Qgb2YgYWxsIGNhbGxzLCBJIGNhbiB0aGVuIHVuZGVyc3RhbmQgd2h5IGFuZCB3aGVuIHRoZSBsYWJlbHMgYXJlIGJlaW5nIHF1ZXJpZWQuIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZGlnZ2luZyBkZWVwZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O292c19jdF9nZXRfY29ubl9sYWJlbHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM0ND1zdGF0aWMgaW50IG92c19jdF9zZXRfbWFyayhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzY0OnN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM2NS17XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM4MT1zdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6Mzk0Olx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXHRpZiAoIWNsKVxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjgtXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5Olx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MzAtXHRpZiAoIWNsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjEwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogNDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkRpdmluZyBpbnRvIENvbm5lY3Rpb24gVHJhY2tpbmcgTGFiZWxzIGluIE9WUyBhbmQgTmV0ZmlsdGVyKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG92c19jdF9zZXRfbGFiZWxzYCBhbmQgYG5mX2N0X2xhYmVsc19leHRfYWRkYCBhbmQgaW1tZWRpYXRlbHkgbXkgZXhwZXJ0IG1pbmQganVtcHMgdG8gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gT3BlbiB2U3dpdGNoIGFuZCB0aGUgTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3lzdGVtLiBUaGVzZSBmdW5jdGlvbiBuYW1lcyB0aGVtc2VsdmVzIGhpbnQgYXQgbGFiZWwgbWFuaXB1bGF0aW9uIGFuZCBleHRlbnNpb24sIHdoaWNoIGlzIHN0YW5kYXJkIGluIGFueSByb2J1c3QgY29ubmVjdGlvbiB0cmFja2luZyBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvcmUgcXVlc3Rpb24sIGFzIGFsd2F5cywgaXMgKndoeSogdGhhdCBgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGNoZWNrPyBXaGF04oCZcyB0aGUgY29udGV4dCBpdCYjMzk7cyBwcm90ZWN0aW5nLCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgd2UgbWFraW5nIGFib3V0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlPyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRoYXQgdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIGNvbm5lY3Rpb24mIzM5O3MgbGlmZWN5Y2xlIHN0YXRlLiAqQ29uZmlybWVkKiBzdWdnZXN0cyBhIHRyYW5zaXRpb24gcG9pbnQsIGEgdmFsaWRhdGlvbiBvZiB0aGUgdHJhY2tpbmcgaW5mb3JtYXRpb24sIHBlcmhhcHMgYmVmb3JlIGl0JiMzOTtzIGRlZW1lZCBzdGFibGUgb3Igc2FmZSBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uIEkgd2FudCB0byBrbm93IHdoZW4gd2UgYXJlIGFkZGluZyB0aGUgbGFiZWxzLCBpZiB0aGV5IGFyZSBhZGRlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkLCBhbmQgd2h5IHRoYXQgaXMgZGVzaXJlZCBvciBub3QuIEFyZSB3ZSBwb3RlbnRpYWxseSBhdm9pZGluZyByYWNlIGNvbmRpdGlvbnMgb3IgdW5leHBlY3RlZCBzaWRlIGVmZmVjdHMgd2l0aCBpbW1hdHVyZSBjb25uZWN0aW9uIGVudHJpZXM/IExldCYjMzk7cyB0cmFjZSBiYWNrIGZyb20gaGVyZSwgc2VlIGhvdyBpdCYjMzk7cyBoYW5kbGVkIGluIHRoZSBPVlMgY29kZSwgYW5kIHdoYXQgdGhlIGVxdWl2YWxlbnQgTmV0ZmlsdGVyIGNvbnRleHQgc3VnZ2VzdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MjA6XHR9XG4gNDIxOlx0XG4gNDIyOlx0c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQyMzpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXG4gNDI0Olx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiA0Mjc6XHRcdGludCBlcnI7XG4gNDI4Olx0XG4gNDI5Olx0XHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xuIDQzMDpcdFx0aWYgKCFjbClcbiA0MzE6XHRcdFx0cmV0dXJuIC1FTk9TUEM7XG4gNDMyOlx0XG4gNDMzOlx0XHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM0Olx0XHRcdFx0XHQgICAgbWFzay1cdTAwM2VjdF9sYWJlbHNfMzIsXG4gNDM1Olx0XHRcdFx0XHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xuIDQzNjpcdFx0aWYgKGVycilcbiA0Mzc6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mzg6XHRcbiA0Mzk6XHRcdG1lbWNweShcdTAwMjZrZXktXHUwMDNlY3QubGFiZWxzLCBjbC1cdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XG4gNDQwOlx0XG4gNDQxOlx0XHRyZXR1cm4gMDtcbiA0NDI6XHR9XG4gNDQzOlx0XG4gNDQ0Olx0c3RhdGljIGludCBvdnNfY3RfaGFuZGxlX2ZyYWdtZW50cyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxuIDQ0NTpcdFx0XHRcdFx0ICAgdTE2IHpvbmUsIGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICpza2IpXG4gNDQ2Olx0e1xuIDQ0NzpcdFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xuIDQ0ODpcdFx0aW50IGVycjtcbiA0NDk6XHRcbiA0NTA6XHRcdGVyciA9IG5mX2N0X2hhbmRsZV9mcmFnbWVudHMobmV0LCBza2IsIHpvbmUsIGZhbWlseSwgXHUwMDI2a2V5LVx1MDAzZWlwLnByb3RvLCBcdTAwMjZvdnNfY2IubXJ1KTtcbiA0NTE6XHRcdGlmIChlcnIpXG4gNDUyOlx0XHRcdHJldHVybiBlcnI7XG4gNDUzOlx0XG4gNDU0Olx0XHQvKiBUaGUga2V5IGV4dHJhY3RlZCBmcm9tIHRoZSBmcmFnbWVudCB0aGF0IGNvbXBsZXRlZCB0aGlzIGRhdGFncmFtXG4gNDU1Olx0XHQgKiBsaWtlbHkgZGlkbiYjMzk7dCBoYXZlIGFuIEw0IGhlYWRlciwgc28gcmVnZW5lcmF0ZSBpdC5cbiA0NTY6XHRcdCAqL1xuIDQ1NzpcdFx0b3ZzX2Zsb3dfa2V5X3VwZGF0ZV9sM2w0KHNrYiwga2V5KTtcbiA0NTg6XHRcdGtleS1cdTAwM2VpcC5mcmFnID0gT1ZTX0ZSQUdfVFlQRV9OT05FO1xuIDQ1OTpcdFx0Kk9WU19DQihza2IpID0gb3ZzX2NiO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjEyCgkJCQkJCQlvdXRwdXQ6IDIzCgkJCQkJCQl0aG91Z2h0czogMzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVlcmluZyBpbnRvIHRoZSBuZXRmaWx0ZXIgd2VlZHMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgZnVuY3Rpb24gaXMgZG9pbmcuIFRpbWUgdG8gaGl0IHRoZSBnaXQgbG9nIGFuZCBzZWUgaWYgSSBjYW4gZmluZCBzb21lIGNvbW1pdCBoaXN0b3J5LiBTZWFyY2hpbmcgZm9yIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgc3BlY2lmaWNhbGx5IGlzIGEgZ29vZCBzdGFydGluZyBwb2ludCwgYnV0IEkgc2hvdWxkIHByb2JhYmx5IGJyb2FkZW4gdGhlIHNlYXJjaCBhIGxpdHRsZSB0byBpbmNsdWRlIHJlbGF0ZWQgdGVybXMgb3IgdmFyaWF0aW9ucyBvbiB0aGUgZnVuY3Rpb24gbmFtZS4gQSBkZWVwZXIgZGl2ZSBpbnRvIHRoZSBjb21taXQgbWVzc2FnZXMgYW5kIGFueSByZWxhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBob3BlZnVsbHkgaWxsdW1pbmF0ZSB0aGUgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHByb2Nlc3MuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbnRleHQgYW5kIGludGVudCBiZWhpbmQgaXRzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUga2V5IHRvIGdyYXNwaW5nIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG5ldGZpbHRlciBmcmFtZXdvcmsuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgc291cmNlIGNvZGUgcmV2ZWFscyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmZfY3RfbGFiZWxzX2V4dF9hZGQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaD0yMz1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuLS1cbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oOjM3OnN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM9MTc1ND1pbml0X2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25uICp0bXBsLFxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVx0bmZfY3RfdHN0YW1wX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5NC1cbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM6MjMwNTpcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVx0bmZjdF9zZXFhZGpfZXh0X2FkZChjdCk7XG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcbi0tXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVx0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XHRcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MDE1CgkJCQkJCQlvdXRwdXQ6IDQzCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqRGl2aW5nIGludG8gY29ubnRyYWNrIGxhYmVscyoqCgpBbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBgaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaGAgaGVhZGVyLiBTZWVtcyBsaWtlIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgY29ubnRyYWNrIGxhYmVsIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIGZvciB1bmRlcnN0YW5kaW5nIGhvdyBjb25uZWN0aW9uIHRyYWNraW5nIHVzZXMgbGFiZWxzLCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIEkmIzM5O20gc2hhcnAgb24gd2hhdCYjMzk7cyBkZWZpbmVkLiBBbHdheXMgYmV0dGVyIHRvIHJldmlldyB0aGUgZm91bmRhdGlvbmFsIHBpZWNlcyBiZWZvcmUgdGFja2xpbmcgYW55dGhpbmcgbW9yZSBjb21wbGV4IHJlbGF0ZWQgdG8gY29ubmVjdGlvbiB0cmFja2luZyBvciBpdHMgYXNzb2NpYXRlZCBOZXRmaWx0ZXIgbW9kdWxlcy4gSSBrbm93IHRoZSBnZW5lcmFsIGlkZWEsIGJ1dCBzcGVjaWZpY3MgYXJlIGltcG9ydGFudCwgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGJpdGZpZWxkcyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zIHdpdGhpbiBhIGtlcm5lbCBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyMDpcdC8qIENhbiYjMzk7dCB1c2UgbmZfY3RfZXh0X2ZpbmQoKSwgZmxvdyBkaXNzZWN0b3IgY2Fubm90IHVzZSBzeW1ib2xzXG4gIDIxOlx0ICogZXhwb3J0ZWQgYnkgbmZfY29ubnRyYWNrIG1vZHVsZS5cbiAgMjI6XHQgKi9cbiAgMjM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KVxuICAyNDpcdHtcbiAgMjU6XHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcbiAgMjY6XHRcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVx1MDAzZWV4dDtcbiAgMjc6XHRcbiAgMjg6XHRcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxuICAyOTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzA6XHRcbiAgMzE6XHRcdHJldHVybiAodm9pZCAqKWN0LVx1MDAzZWV4dCAmIzQzOyBjdC1cdTAwM2VleHQtXHUwMDNlb2Zmc2V0W05GX0NUX0VYVF9MQUJFTFNdO1xuICAzMjpcdCNlbHNlXG4gIDMzOlx0XHRyZXR1cm4gTlVMTDtcbiAgMzQ6XHQjZW5kaWZcbiAgMzU6XHR9XG4gIDM2Olx0XG4gIDM3Olx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcbiAgMzg6XHR7XG4gIDM5Olx0I2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTXG4gIDQwOlx0XHRzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpO1xuICA0MTpcdFxuICA0MjpcdFx0aWYgKGF0b21pY19yZWFkKFx1MDAyNm5ldC1cdTAwM2VjdC5sYWJlbHNfdXNlZCkgPT0gMClcbiAgNDM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDQ0Olx0XG4gIDQ1Olx0XHRyZXR1cm4gbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX0xBQkVMUywgR0ZQX0FUT01JQyk7XG4gIDQ2Olx0I2Vsc2VcbiAgNDc6XHRcdHJldHVybiBOVUxMO1xuICA0ODpcdCNlbmRpZlxuICA0OTpcdH1cbiAgNTA6XHRcbiAgNTE6XHRpbnQgbmZfY29ubmxhYmVsc19yZXBsYWNlKHN0cnVjdCBuZl9jb25uICpjdCxcbiAgNTI6XHRcdFx0XHQgIGNvbnN0IHUzMiAqZGF0YSwgY29uc3QgdTMyICptYXNrLCB1bnNpZ25lZCBpbnQgd29yZHMpO1xuICA1MzpcdFxuICA1NDpcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xuICA1NTpcdGludCBuZl9jb25ubGFiZWxzX2dldChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBiaXQpO1xuICA1NjpcdHZvaWQgbmZfY29ubmxhYmVsc19wdXQoc3RydWN0IG5ldCAqbmV0KTtcbiAgNTc6XHQjZWxzZVxuICA1ODpcdHN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm5sYWJlbHNfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGJpdCkgeyByZXR1cm4gMDsgfVxuICA1OTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25ubGFiZWxzX3B1dChzdHJ1Y3QgbmV0ICpuZXQpIHt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY4NTQKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyBgbmZfY3RfZXh0X2FkZGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBuZl9jdF9leHRfYWRkYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBmcmFtZXdvcmsuIE15IGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGl0JiMzOTtzIHJlc3BvbnNpYmxlIGZvciAqYWRkaW5nKiBzb21lIGZvcm0gb2YgZXh0ZW5zaW9uIGRhdGEgb3IgbWV0YWRhdGEgdG8gYSBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5LCBidXQgdGhlIHNwZWNpZmljcyBhcmUgY3J1Y2lhbC4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGl0cyBhcmd1bWVudHM6IHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgYWNjZXB0IGFzIGlucHV0LCBhbmQgd2hhdCBkb2VzIGl0IG1vZGlmeSBvciBhbGxvY2F0ZSB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnk/IEkmIzM5O2xsIHByb2JhYmx5IGJlIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgaW50ZXJhY3RzIHdpdGggdGhlIGBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlYCBhbmQgcG90ZW50aWFsbHkgdGhlIGFzc29jaWF0ZWQgYHN0cnVjdCBuZl9jb25uYCBvciBgc3RydWN0IG5mX2Nvbm5faGVscGAgc3RydWN0dXJlcy4KCkkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIHRoaW5ncyBsaWtlIGFkZGluZyBsYXllciA3IHByb3RvY29sIGlkZW50aWZpY2F0aW9uLCBzZXNzaW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRlZnVsIGZpcmV3YWxscywgb3Igb3RoZXIgYXBwbGljYXRpb24tbGF5ZXIgbWV0YWRhdGEuIFBlcmhhcHMgaXQgZGVhbHMgd2l0aCBJUHNlYyBzZWN1cml0eSBhc3NvY2lhdGlvbnMgKFNBcykgb3Igb3RoZXIgY29udGV4dC1zcGVjaWZpYyBkZXRhaWxzLiBNeSBjb25jZXJuIGlzIHRoZSBsb2NraW5nIHNjaGVtZSB1c2VkIGFuZCB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIHRyeSB0byBtb2RpZnkgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHNpbXVsdGFuZW91c2x5LiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBhbmQgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gQWRkaXRpb25hbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHdpdGggb3RoZXIgY29ubmVjdGlvbiB0cmFja2luZyBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSBpdHMgY2FsbCBncmFwaCB3aXRoaW4gdGhlIE5ldGZpbHRlciBzdWJzeXN0ZW0uIElzIHRoaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHk/IERvZXMgaXQgYmxvY2s/IEFsbCBpbXBvcnRhbnQgcXVlc3Rpb25zIHRvIGZ1bGx5IGdyYXNwIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25mX2N0X2V4dF9hZGQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYz0zMTk9Ym9vbCBuZl9jdF9lY2FjaGVfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIHUxNiBjdG1hc2ssIHUxNiBleHBtYXNrLCBnZnBfdCBnZnApXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMtMzQ1LVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmM6MzQ2Olx0ZSA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9FQ0FDSEUsIGdmcCk7XG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYy0zNDctXHRpZiAoZSkge1xuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jPTU3PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IHRvdGFsX2V4dGVuc2lvbl9zaXplKHZvaWQpXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtODktXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYzo5MDp2b2lkICpuZl9jdF9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBuZl9jdF9leHRfaWQgaWQsIGdmcF90IGdmcClcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTkxLXtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYy0xMjgtfVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6MTI5OkVYUE9SVF9TWU1CT0wobmZfY3RfZXh0X2FkZCk7XG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmM9MTgzPW5mX2N0X2hlbHBlcl9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZ2ZwX3QgZ2ZwKVxuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jLTE4Ni1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jOjE4NzpcdGhlbHAgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfSEVMUEVSLCBnZnApO1xubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMtMTg4LVx0aWYgKGhlbHApIHtcbi0tXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmM9NDM0PWNvbm50cmFja19wcHRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsXG4tLVxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jLTQ1OC1cbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYzo0NTk6XHRcdGlmICghbmF0IFx1MDAyNlx1MDAyNiAhbmZfY3RfZXh0X2FkZChjdCwgTkZfQ1RfRVhUX05BVCwgR0ZQX0FUT01JQykpXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMtNDYwLVx0XHRcdHJldHVybiBORl9EUk9QO1xuLS1cbm5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYz03NDU9c3RydWN0IG5mX2Nvbm5fbmF0ICpuZl9jdF9uYXRfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QpXG4tLVxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1MS1cdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSlcbm5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYzo3NTI6XHRcdG5hdCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpO1xubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1My1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzk4OAoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aGlua2luZywgZXhwcmVzc2VkIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyBgbmZfY29ubnRyYWNrX2V4dGVuZC5jYCAoTGluZXMgOTAtMTI4KSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4gSSYjMzk7bSBmb2N1c2luZyBvbiBgbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmNgLCBzcGVjaWZpY2FsbHkgbGluZXMgOTAgdGhyb3VnaCAxMjguIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGhlcmUgd2l0aGluIHRoZSBjb25udHJhY2sgZXh0ZW5zaW9uIGZyYW1ld29yay4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHNlY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgb3IgbWFuYWdlbWVudCBvZiBjb25udHJhY2sgZXh0ZW5zaW9uIGRhdGEgc3RydWN0dXJlcy4gR2l2ZW4gdGhlIGNvbnRleHQsIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZXh0ZW5kaW5nIHRoZSBjb3JlIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBhZGRpdGlvbmFsIHN0YXRlIG9yIG1ldGFkYXRhLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBwYXJzZSB0aGUgY29kZSB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93LCBhbnkgbG9ja2luZyBtZWNoYW5pc21zIHVzZWQsIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyB0byBga21hbGxvY2AsIGBrZnJlZWAsIG9yIHNpbWlsYXIgbWVtb3J5IGZ1bmN0aW9ucywgYW5kIGxpa2VseSByZWZlcmVuY2VzIHRvIHRoZSBgbmZfY29ubmAgc3RydWN0dXJlIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciBtb2R1bGVzIG9yIE5BVCBzdWJzeXN0ZW1zLiBUaGUgZ29hbCBpcyB0byBncmFzcCBob3cgdGhlc2UgZXh0ZW5zaW9ucyBhcmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBjb25udHJhY2sgY29yZS4gTGV0JiMzOTtzIHN0YXJ0IHJlYWRpbmcgYW5kIHNlZSB3aGF0IGluc2lnaHRzIHRoaXMgc2VjdGlvbiByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA4NTpcdFx0XHQmIzQzOyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fYWN0X2N0X2V4dClcbiAgODY6XHQjZW5kaWZcbiAgODc6XHRcdDtcbiAgODg6XHR9XG4gIDg5Olx0XG4gIDkwOlx0dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXG4gIDkxOlx0e1xuICA5MjpcdFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmLCBvbGRsZW4sIGFsbG9jO1xuICA5MzpcdFx0c3RydWN0IG5mX2N0X2V4dCAqbmV3O1xuICA5NDpcdFxuICA5NTpcdFx0LyogQ29ubnRyYWNrIG11c3Qgbm90IGJlIGNvbmZpcm1lZCB0byBhdm9pZCByYWNlcyBvbiByZWFsbG9jYXRpb24uICovXG4gIDk2Olx0XHRXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpO1xuICA5NzpcdFxuICA5ODpcdFx0Lyogc3RydWN0IG5mX2N0X2V4dCB1c2VzIHU4IHRvIHN0b3JlIG9mZnNldHMvc2l6ZSAqL1xuICA5OTpcdFx0QlVJTERfQlVHX09OKHRvdGFsX2V4dGVuc2lvbl9zaXplKCkgXHUwMDNlIDI1NXUpO1xuIDEwMDpcdFxuIDEwMTpcdFx0aWYgKGN0LVx1MDAzZWV4dCkge1xuIDEwMjpcdFx0XHRjb25zdCBzdHJ1Y3QgbmZfY3RfZXh0ICpvbGQgPSBjdC1cdTAwM2VleHQ7XG4gMTAzOlx0XG4gMTA0Olx0XHRcdGlmIChfX25mX2N0X2V4dF9leGlzdChvbGQsIGlkKSlcbiAxMDU6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiAxMDY6XHRcdFx0b2xkbGVuID0gb2xkLVx1MDAzZWxlbjtcbiAxMDc6XHRcdH0gZWxzZSB7XG4gMTA4Olx0XHRcdG9sZGxlbiA9IHNpemVvZigqbmV3KTtcbiAxMDk6XHRcdH1cbiAxMTA6XHRcbiAxMTE6XHRcdG5ld29mZiA9IEFMSUdOKG9sZGxlbiwgX19hbGlnbm9mX18oc3RydWN0IG5mX2N0X2V4dCkpO1xuIDExMjpcdFx0bmV3bGVuID0gbmV3b2ZmICYjNDM7IG5mX2N0X2V4dF90eXBlX2xlbltpZF07XG4gMTEzOlx0XG4gMTE0Olx0XHRhbGxvYyA9IG1heChuZXdsZW4sIE5GX0NUX0VYVF9QUkVBTExPQyk7XG4gMTE1Olx0XHRuZXcgPSBrcmVhbGxvYyhjdC1cdTAwM2VleHQsIGFsbG9jLCBnZnApO1xuIDExNjpcdFx0aWYgKCFuZXcpXG4gMTE3Olx0XHRcdHJldHVybiBOVUxMO1xuIDExODpcdFxuIDExOTpcdFx0aWYgKCFjdC1cdTAwM2VleHQpXG4gMTIwOlx0XHRcdG1lbXNldChuZXctXHUwMDNlb2Zmc2V0LCAwLCBzaXplb2YobmV3LVx1MDAzZW9mZnNldCkpO1xuIDEyMTpcdFxuIDEyMjpcdFx0bmV3LVx1MDAzZW9mZnNldFtpZF0gPSBuZXdvZmY7XG4gMTIzOlx0XHRuZXctXHUwMDNlbGVuID0gbmV3bGVuO1xuIDEyNDpcdFx0bWVtc2V0KCh2b2lkICopbmV3ICYjNDM7IG5ld29mZiwgMCwgbmV3bGVuIC0gbmV3b2ZmKTtcbiAxMjU6XHRcbiAxMjY6XHRcdGN0LVx1MDAzZWV4dCA9IG5ldztcbiAxMjc6XHRcdHJldHVybiAodm9pZCAqKW5ldyAmIzQzOyBuZXdvZmY7XG4gMTI4Olx0fVxuIDEyOTpcdEVYUE9SVF9TWU1CT0wobmZfY3RfZXh0X2FkZCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg5NzUKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA5NjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDb25udHJhY2sgRXh0ZW5zaW9uIGFuZCBPcGVuIHZTd2l0Y2ggSW50ZWdyYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTGluZSA5NiBpbiBgbmZfY3RfZXh0X2FkZGAgaXMgdGhlIGtleTogYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgLiAgVGhhdCYjMzk7cyBiZWNhdXNlIGEgY29uZmlybWVkIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgbWVhbnMgb3RoZXIgQ1BVcyAqY291bGQqIGJlIGFjY2Vzc2luZyBgY3QtJmd0O2V4dGAgY29uY3VycmVudGx5LiAgVGhlbiwgdGhlIGBrcmVhbGxvYyhjdC0mZ3Q7ZXh0LCBhbGxvYywgZ2ZwKWAgaW4gdGhlIHNhbWUgZnVuY3Rpb24gY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uLCBsZWFkaW5nIHRvIHVzZS1hZnRlci1mcmVlLCBvciBhIGBXQVJOX09OYCBzcGxhdCBpZiBpdCAqaXMqIGNvbmZpcm1lZCBhbmQgcmVhbGxvY2F0ZWQgY29uY3VycmVudGx5LgoKTm93LCBsb29raW5nIGF0IGBuZl9uYXRfY29yZS5jYCwgdGhlIGxvZ2ljIGluIGBuZl9jdF9uYXRfZXh0X2FkZGAgaXMgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzOiBpdCBjaGVja3MgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCAqYmVmb3JlKiBjYWxsaW5nIGBuZl9jdF9leHRfYWRkYC4gVGhpcyBpcyBnb29kIHByYWN0aWNlLiBCdXQsIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgd2hpY2ggKml0c2VsZiogY2FsbHMgYG5mX2N0X2V4dF9hZGRgIHdoZW4gdGhlIGVudHJ5ICppcyogY29uZmlybWVkIHRyaWdnZXJzIHRoZSBgV0FSTl9PTmAgYW5kIGludHJvZHVjZXMgYSByYWNlL1VBRiBzY2VuYXJpbyEKCkxldCYjMzk7cyBsb29rIGF0IHRoZSBwYXRjaCB0byBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4uLiBhaCwgaGVyZSB3ZSBnby4gVGhlIGZpeCBpcyB0byBhZGQgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCB0byB0aGUgYGlmICghY2wpYCBjb25kaXRpb24gaW4gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLiBUaGlzICpzaG91bGQqIHByZXZlbnQgdGhlIHByb2JsZW1hdGljIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgZnJvbSBiZWluZyBjYWxsZWQgd2hlbiBgY3RgIGlzIGNvbmZpcm1lZCwgcmlnaHQ/CgpCdXQsIGxldCYjMzk7cyBmb2xsb3cgdGhlIGNvbnRyb2wgZmxvdzogSWYgYGNsYCAqaXMqIE5VTEwgKGFuZCBgbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgaXMgZmFsc2UpLCB0aGUgYG92c19jdF9pbml0X2xhYmVsc2AgZnVuY3Rpb24gY2FsbHMgYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCwgY2hlY2tzIGZvciBOVUxMLCBhbmQgcmV0dXJucyBgLUVOT1NQQ2AgaWYgbm8gYGNsYCEgVGhlIGNvbW1lbnQgaW4gYG92c19jdF9pbml0X2xhYmVsc2AgbWFrZXMgaXQgc291bmQgbGlrZSBsYWJlbHMgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgb24gYSBuZXcsIHVuY29uZmlybWVkIGVudHJ5LCB0aGF0IGhhc24mIzM5O3QgYmVlbiBjb21taXR0ZWQsIHNvIG5vIGNvbmN1cnJlbnQgYWNjZXNzIGlzIGludm9sdmVkLgoKSW4gYG92c19jdF9zZXRfbGFiZWxzYCwgd2UgYWdhaW4gY2FsbCBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLiAgSWYgaXQgcmV0dXJucyBOVUxMLCB3ZSBhZ2FpbiBnZXQgYC1FTk9TUENgLiBBaGEhIFRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIG5vdyB0aGF0IHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkIGFuZCB0aGUgZXh0ZW5zaW9uIHdhc24mIzM5O3QgYXR0YWNoZWQuIFRoZW4gYGNsYCBpcyBOVUxMLiBUaGVuIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCByZXR1cm5zIE5VTEwuIFRoZW4gYG92c19jdF9zZXRfbGFiZWxzYCByZXR1cm5zIGAtRU5PU1BDYC4KCi4uLldhaXQgYSBtaW51dGUhICBJZiBpdCYjMzk7cyByZXR1cm5pbmcgYC1FTk9TUENgIHdoZW4gdGhlIGV4dGVuc2lvbiBpc24mIzM5O3QgdGhlcmUsIGFuZCB0aGUgY29ubmVjdGlvbiAqaXMqIGNvbmZpcm1lZCwgZG9lc24mIzM5O3QgdGhhdCBtZWFuIGBrZXktJmd0O2N0LmxhYmVsc2AgaXMgKnVuaW5pdGlhbGl6ZWQqPyBUaGUgZmxvdyBvZiBsb2dpYyBhcHBlYXJzIHNvdW5kLCBidXQuLi4gd2hlcmUgKmRvZXMqIGBrZXlgIGNvbWUgZnJvbSBpbiBgb3ZzX2N0X3NldF9sYWJlbHNgPyBXZSBtdXN0IGNoZWNrIHRoZSBjYWxsZXJzIG9mIGBvdnNfY3Rfc2V0X2xhYmVsc2AgdG8gZW5zdXJlIHRoaXMgaXNuJiMzOTt0IGFuIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvdnNfY3Rfc2V0X2xhYmVscyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzgxPXN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo0MjI6c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMy1cdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxuLS1cbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4tLVxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTAyNDpcdFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMudmFsdWUsXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cdFx0XHRcdFx0XHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEyIDE0OjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTY1CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgQ29ubmVjdGlvbiBUcmFja2luZyBDb21taXQgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIHplcm8gaW4gb24gYG92c19jdF9jb21taXRgLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgY29kZSBhcm91bmQgbGluZSAxMDIwLCBsaWtlbHkgaW4gdGhlIG1haW4gT1ZTIGRhdGFwYXRoIGtlcm5lbCBtb2R1bGUuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIGlzIHdoZXJlIHRoZSBjcnVjaWFsIGNvbm5lY3Rpb24gdHJhY2tpbmcgZGVjaXNpb25zIGFyZSBmaW5hbGl6ZWQgYW5kIGVuZm9yY2VkIGFmdGVyIGEgZmxvdyBoYXMgdHJhdmVyc2VkIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hY2hpbmUuIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyB0aGUgY29ubmVjdGlvbiBnZXRzIG1hcmtlZCBhcyBlc3RhYmxpc2hlZCBvciByZWxhdGVkLCBob3cgTkFUIGlzIGFwcGxpZWQgKGlmIHByZXNlbnQpLCBhbmQgaG93IHRoaXMgYWxsIGludGVyYWN0cyB3aXRoIHRoZSBjb25udHJhY2sgdGFibGUgZW50cmllcy4gSeKAmWxsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMgb3Igc3BpbmxvY2tzIHVzZWQgZm9yIGNvbmN1cnJlbmN5IGNvbnRyb2wsIGFueSBjYWxscyB0byBoZWxwZXIgZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRvIG9yIHVwZGF0aW5nIHRoZSBjb25udHJhY2sgdGFibGUsIGFuZCB0aGUgaGFuZGxpbmcgb2YgYW55IGFzc29jaWF0ZWQgZmxhZ3Mgb3IgbWV0YWRhdGEuIEkmIzM5O20gYWxzbyBjdXJpb3VzIHRvIHNlZSBob3cgYW55IGFzc29jaWF0ZWQgc2tiIGRhdGEgaXMgdXBkYXRlZCBvciBtb2RpZmllZCBhdCB0aGlzIGNvbW1pdCBzdGFnZS4gSXQmIzM5O3MgbGlrZWx5IHdlIHdpbGwgZmluZCBzb21lIG9mIHRoZSBjcml0aWNhbCBjb2RlIGZvciBwcm9wZXJseSBoYW5kbGluZyBhc3ltbWV0cmljIGZsb3dzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDk2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgOTYwOlx0c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXG4gOTYxOlx0XHRcdFx0IGNvbnN0IHN0cnVjdCBvdnNfY29ubnRyYWNrX2luZm8gKmluZm8sXG4gOTYyOlx0XHRcdFx0IHN0cnVjdCBza19idWZmICpza2IpXG4gOTYzOlx0e1xuIDk2NDpcdFx0ZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87XG4gOTY1Olx0XHRzdHJ1Y3QgbmZfY29ubiAqY3Q7XG4gOTY2Olx0XHRpbnQgZXJyO1xuIDk2NzpcdFxuIDk2ODpcdFx0ZXJyID0gX19vdnNfY3RfbG9va3VwKG5ldCwga2V5LCBpbmZvLCBza2IpO1xuIDk2OTpcdFx0aWYgKGVycilcbiA5NzA6XHRcdFx0cmV0dXJuIGVycjtcbiA5NzE6XHRcbiA5NzI6XHRcdC8qIFRoZSBjb25uZWN0aW9uIGNvdWxkIGJlIGludmFsaWQsIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIG5vLW9wLiovXG4gOTczOlx0XHRjdCA9IG5mX2N0X2dldChza2IsIFx1MDAyNmN0aW5mbyk7XG4gOTc0Olx0XHRpZiAoIWN0KVxuIDk3NTpcdFx0XHRyZXR1cm4gMDtcbiA5NzY6XHRcbiA5Nzc6XHQjaWZcdElTX0VOQUJMRUQoQ09ORklHX05FVEZJTFRFUl9DT05OQ09VTlQpXG4gOTc4Olx0XHRpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseShcdTAwMjZvdnNfY3RfbGltaXRfZW5hYmxlZCkpIHtcbiA5Nzk6XHRcdFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4gOTgwOlx0XHRcdFx0ZXJyID0gb3ZzX2N0X2NoZWNrX2xpbWl0KG5ldCwgc2tiLCBpbmZvKTtcbiA5ODE6XHRcdFx0XHRpZiAoZXJyKSB7XG4gOTgyOlx0XHRcdFx0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcJiMzNDtvcGVudnN3aXRjaDogem9uZTogJXUgXCYjMzQ7XG4gOTgzOlx0XHRcdFx0XHRcdFwmIzM0O2V4Y2VlZHMgY29ubnRyYWNrIGxpbWl0XFxuXCYjMzQ7LFxuIDk4NDpcdFx0XHRcdFx0XHRpbmZvLVx1MDAzZXpvbmUuaWQpO1xuIDk4NTpcdFx0XHRcdFx0cmV0dXJuIGVycjtcbiA5ODY6XHRcdFx0XHR9XG4gOTg3Olx0XHRcdH1cbiA5ODg6XHRcdH1cbiA5ODk6XHQjZW5kaWZcbiA5OTA6XHRcbiA5OTE6XHRcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxuIDk5MjpcdFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcbiA5OTM6XHRcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XG4gOTk0Olx0XHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxuIDk5NTpcdFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXG4gOTk2Olx0XHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcbiA5OTc6XHRcdCAqIG9wdGlvbi4gKi9cbiA5OTg6XHRcdGlmIChpbmZvLVx1MDAzZWhhdmVfZXZlbnRtYXNrKSB7XG4gOTk5Olx0XHRcdHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICpjYWNoZSA9IG5mX2N0X2VjYWNoZV9maW5kKGN0KTtcbjEwMDA6XHRcbjEwMDE6XHRcdFx0aWYgKGNhY2hlKVxuMTAwMjpcdFx0XHRcdGNhY2hlLVx1MDAzZWN0bWFzayA9IGluZm8tXHUwMDNlZXZlbnRtYXNrO1xuMTAwMzpcdFx0fVxuMTAwNDpcdFxuMTAwNTpcdFx0LyogQXBwbHkgY2hhbmdlcyBiZWZvcmUgY29uZmlybWluZyB0aGUgY29ubmVjdGlvbiBzbyB0aGF0IHRoZSBpbml0aWFsXG4xMDA2Olx0XHQgKiBjb25udHJhY2sgTkVXIG5ldGxpbmsgZXZlbnQgY2FycmllcyB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBDVFxuMTAwNzpcdFx0ICogYWN0aW9uLlxuMTAwODpcdFx0ICovXG4xMDA5Olx0XHRpZiAoaW5mby1cdTAwM2VtYXJrLm1hc2spIHtcbjEwMTA6XHRcdFx0ZXJyID0gb3ZzX2N0X3NldF9tYXJrKGN0LCBrZXksIGluZm8tXHUwMDNlbWFyay52YWx1ZSxcbjEwMTE6XHRcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlbWFyay5tYXNrKTtcbjEwMTI6XHRcdFx0aWYgKGVycilcbjEwMTM6XHRcdFx0XHRyZXR1cm4gZXJyO1xuMTAxNDpcdFx0fVxuMTAxNTpcdFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XG4xMDE2Olx0XHRcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy52YWx1ZSxcbjEwMTc6XHRcdFx0XHRcdFx0IFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spO1xuMTAxODpcdFx0XHRpZiAoZXJyKVxuMTAxOTpcdFx0XHRcdHJldHVybiBlcnI7XG4xMDIwOlx0XG4xMDIxOlx0XHRcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcbjEwMjI6XHRcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXHUwMDI2XHUwMDI2XG4xMDIzOlx0XHRcdCAgIGxhYmVsc19ub256ZXJvKFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLm1hc2spKSB7XG4xMDI0Olx0XHRcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFx1MDAyNmluZm8tXHUwMDNlbGFiZWxzLnZhbHVlLFxuMTAyNTpcdFx0XHRcdFx0XHRcdTAwMjZpbmZvLVx1MDAzZWxhYmVscy5tYXNrKTtcbjEwMjY6XHRcdFx0aWYgKGVycilcbjEwMjc6XHRcdFx0XHRyZXR1cm4gZXJyO1xuMTAyODpcdFx0fVxuMTAyOTpcdFx0LyogVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBzZW5kaW5nIHF1ZXVlZCBldmVudHMgZXZlbiBpZiB0aGUgY29ubmVjdGlvblxuMTAzMDpcdFx0ICogaXMgYWxyZWFkeSBjb25maXJtZWQuXG4xMDMxOlx0XHQgKi9cbjEwMzI6XHRcdGVyciA9IG5mX2Nvbm50cmFja19jb25maXJtKHNrYik7XG4xMDMzOlx0XG4xMDM0Olx0XHRyZXR1cm4gdmVyZGljdF90b19lcnJubyhlcnIpO1xuMTAzNTpcdH1cbjEwMzY6XHRcbjEwMzc6XHQvKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlBST0dSRVNTIGlmICYjMzk7c2tiJiMzOTsgaXMgc3RvbGVuLCBvciBvdGhlciBub256ZXJvXG4xMDM4Olx0ICogdmFsdWUgaWYgJiMzOTtza2ImIzM5OyBpcyBmcmVlZC5cbjEwMzk6XHQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTIgMTQ6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI0OTIKCQkJCQkJCW91dHB1dDogMjEyCgkJCQkJCQl0aG91Z2h0czogMTE1NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBsb29raW5nIGF0IHRoaXMgQ29ubnRyYWNrIGxhYmVsIGhhbmRsaW5nIGNvZGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBhIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBhbmQgaXRzIGltcGFjdCBvbiBtZW1vcnkgc2FmZXR5LiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgc2VlbXMgdG8gYmUgYXJvdW5kIG1vZGlmeWluZyBvciBleHRlbmRpbmcgdGhlIGBjdC0mZ3Q7ZXh0YCBmaWVsZCBvZiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uIHRyYWNrIGVudHJ5IChgY3RgKS4gVGhlIG9yaWdpbmFsIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgd2FzIGJlaW5nIGNhbGxlZCBvbiBjb25maXJtZWQgY29ubmVjdGlvbnMsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBkYXRhIHJhY2UgYmVjYXVzZSBvZiByZWFsbG9jYXRpb24uCgpNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhlIGZpeCBhZGRyZXNzZXMgdGhpcyBieSBvbmx5IGFkZGluZyB0aGUgbGFiZWxzIGV4dGVuc2lvbiBpZiB0aGUgY29ubmVjdGlvbiBpc24mIzM5O3QgY29uZmlybWVkICphbmQqIHRoZSBsYWJlbHMgaGF2ZW4mIzM5O3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgbG9naWMgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaWYgdGhlIGNvbm5lY3Rpb24gaXNuJiMzOTt0IGNvbmZpcm1lZCwgaXQgY2FsbHMgYG92c19jdF9pbml0X2xhYmVsc2Agd2hpY2ggaXMgZmluZS4gSWYgdGhlIGNvbm5lY3Rpb24gKmlzKiBjb25maXJtZWQgYW5kIGxhYmVscyBhcmUgbmVlZGVkLCBpdCBjYWxscyBgb3ZzX2N0X3NldF9sYWJlbHNgLCBob3dldmVyIHdpdGggdGhpcyBwYXRjaCB0aGUgbGFiZWxzIGFyZSBvbmx5IGNyZWF0ZWQgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KCk5vdywgdGhlIGltcG9ydGFudCBxdWVzdGlvbjogZG9lcyB0aGlzIGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzPyAgTGV0IG1lIGdvIHRocm91Z2ggbXkgdGhvdWdodCBwcm9jZXNzLgoKMS4gICoqV2hlbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBgTlVMTGA6KiogSWYgdGhlIGNvbm50cmFjayBlbnRyeSBpcyBjb25maXJtZWQsIGFuZCB0aGUgbGFiZWxzIGFyZSBub3QgYWxyZWFkeSBhbGxvY2F0ZWQsIGBvdnNfY3Rfc2V0X2xhYmVsc2Agd2lsbCByZXR1cm4gYC1FTk9TUENgLiBUaGlzIG1lYW5zIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQuCgoyLiAgKipPdGhlciBjYWxsZXJzIG9mIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYDoqKiBUaGVyZSBhcmUgb25seSBgb3ZzX2N0X2luaXRfbGFiZWxzYCBhbmQgYG92c19jdF9zZXRfbGFiZWxzYC4gIGBvdnNfY3RfaW5pdF9sYWJlbHNgIGhhbmRsZXMgdGhlIG5vbi1jb25maXJtZWQgY2FzZSwgc28gYWdhaW4sIG5vIGlzc3VlLgoKMy4gICoqYG5mX2N0X2xhYmVsc19leHRfYWRkYCBhbmQgaXRzIHN1cnJvdW5kaW5nczoqKiBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGFkZHJlc3NlZCBieSB0aGUgY29kZSBtb2RpZmljYXRpb24gaXMgYSBjb25jdXJyZW5jeSBidWcgd2l0aCByZWFsbG9jYXRpbmcgY29uZmlybWVkIGNvbm5lY3Rpb25zLCBsZWFkaW5nIHRvIHJhY2UgY29uZGl0aW9ucyBvciBVc2UgQWZ0ZXIgRnJlZSBzY2VuYXJpb3MuIEl0IGlzIG5vdCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeS4KCjQuICAqKkFyZSB0aGVyZSBhbnkgb3RoZXIga2VybmVsLXRvLXVzZXIgY29waWVzLCBwYWRkaW5nIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCByZWFkcywgb3IgdW5pbml0aWFsaXplZCBicmFuY2hlcyBhZmZlY3RlZD8qKiBJIGRvbiYjMzk7dCBzZWUgYW55dGhpbmcuIFRoZSBtYWluIGNoYW5nZSBhZGRzIGEgZ3VhcmQgY29uZGl0aW9uLiBUaGUgY29kZSBwYXRoIHJlbGF0ZWQgdG8gYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGFjY2Vzc2VzIHRoZSBgc3RhdHVzYCBiaXRmaWVsZCBvZiBgY3RgLCB3aGljaCBpcyBmdWxseSBpbml0aWFsaXplZCB3aGVuIHRoZSBgY3RgIGlzIGNyZWF0ZWQuCgpTbywgYWZ0ZXIgdGhpcyByaWdvcm91cyBhbmFseXNpcywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzICpub3QqIGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gIFRoZSBleGlzdGluZyBLQVNBTiBhbmQgYFdBUk5fT05gIG1lY2hhbmlzbXMgc2hvdWxkIGhhbmRsZSB0aGUgY29uY3VycmVuY3kgaXNzdWUgYmVpbmcgZml4ZWQgaGVyZS4gIEtNU0FOIHdvdWxkIG5vdCBvZmZlciBhbnkgYWRkaXRpb25hbCBiZW5lZml0cy4gVGhlIGBOZWVkc0tNU0FOYCBmbGFnIGlzIGZhbHNlLiBUaGUgcmVhc29uaW5nIGlzIGNsZWFyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMiAxNDowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cblxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjM1Ljc0MDE0NTExMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDQ5OTE1Mzc5NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHByZXZlbnRzIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKClgIG9uIGFuIGFscmVhZHkgY29uZmlybWVkIGNvbm50cmFjayBjb25uZWN0aW9uIChgIW5mX2N0X2lzX2NvbmZpcm1lZChjdClgKSwgYXZvaWRpbmcgYW4gaW52YWxpZCByZWFsbG9jYXRpb24gb2YgYGN0LVxcdTAwM2VleHRgIHRoYXQgdHJpZ2dlcnMgYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSlgIGFuZCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zL3VzZS1hZnRlci1mcmVlIG9uIHNoYXJlZCBjb25udHJhY2sgZXh0ZW5zaW9ucy5cXG5cXG5UaGUgY2hhbmdlIG1lcmVseSB0aWdodGVucyBhIGNvbmRpdGlvbmFsIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGV4dGVuc2lvbiBhbGxvY2F0aW9uOyBpdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zLCBvciBpbmZvLWxlYWtzIHRvIHVzZXJzcGFjZS4gSWYgYGNsYCBpcyBOVUxMIG9uIGEgY29uZmlybWVkIGNvbm5lY3Rpb24sIGBvdnNfY3Rfc2V0X2xhYmVscygpYCBzYWZlbHkgcmV0dXJucyBgLUVOT1NQQ2Agd2l0aG91dCBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBkYXRhLiBUaGUgYnVnIGJlaW5nIGFkZHJlc3NlZCByZWxhdGVzIHRvIGNvbmN1cnJlbmN5LCBleHRlbnNpb24gbGlmZWN5Y2xlLCBhbmQgcG90ZW50aWFsIHVzZS1hZnRlci1mcmVlLCB3aGljaCBmYWxsIHVuZGVyIHN0YW5kYXJkIGtlcm5lbCB3YXJuaW5ncyBhbmQgS0FTQU4sIG5vdCBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6MzUuNzQwMTUxMTAyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mzk0OTQ1NjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5ZGI2M2RmNmFkYWFlYTM0MWQzNTgxNGI1ODVhMmJkNmJkZjEyZTc2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xcbmluZGV4IDI3MTE1OTY3ZTVkOTMuLjBmNDMzNjg4ZTE3YjkgMTAwNjQ0XFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXFxuKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXFxuQEAgLTM2Niw3ICszNjYsNyBAQCBzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4gXFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcXG4gXFxuIFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcbi1cXHRpZiAoIWNsKSB7XFxuK1xcdGlmICghY2wgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcXG4gXFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbiBcXHRcXHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcXG4gXFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODozNi4xODAzODYwODVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjc0MDk1MTg4MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk9QRU5WU1dJVENIXCIsXG4gICAgXCJORl9DT05OVFJBQ0tcIixcbiAgICBcIk5GX0NPTk5UUkFDS19MQUJFTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzXCIsXG4gICAgXCJvdnNfY3Rfc2V0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2luaXRfbGFiZWxzXCIsXG4gICAgXCJvdnNfY3RfY29tbWl0XCIsXG4gICAgXCJvdnNfY3RfZXhlY3V0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG92c19jdF9nZXRfY29ubl9sYWJlbHMoKSBpbiBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgdG8gcHJldmVudCBjYWxsaW5nIG5mX2N0X2xhYmVsc19leHRfYWRkKCkgd2hlbiB0aGUgY29ubnRyYWNrIGVudHJ5IGlzIGFscmVhZHkgY29uZmlybWVkLiBUaGlzIHRvdWNoZXMgcmVhY2hhYmxlIGNvcmUgbmV0d29ya2luZyBjb2RlIHJlYWNoYWJsZSB2aWEgT3BlbiB2U3dpdGNoIGdlbmVyaWMgbmV0bGluayBjb21tYW5kcyB0aGF0IG1hbmlwdWxhdGUgY29ubnRyYWNrIGFjdGlvbnMgYW5kIGxhYmVscy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZyBhbmQgYWJzZW5jZSBvZiByZWdyZXNzaW9ucyBvciB1bmludGVuZGVkIHNpZGUgZWZmZWN0cyB3aGVuIGhhbmRsaW5nIGNvbm50cmFjayBsYWJlbHMgb24gY29uZmlybWVkIHZzIHVuY29uZmlybWVkIGNvbm5lY3Rpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDlkYjYzZGY2YWRhYWVhMzQxZDM1ODE0YjU4NWEyYmQ2YmRmMTJlNzZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IFNlcCAxMiAxMzo1ODozNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xuaW5kZXggMjcxMTU5NjdlNWQ5My4uMGY0MzM2ODhlMTdiOSAxMDA2NDRcbi0tLSBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1xuKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5AQCAtMzY2LDcgKzM2Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxuIFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcbiBcbiBcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuLVx0aWYgKCFjbCkge1xuK1x0aWYgKCFjbCBcdTAwMjZcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcbiBcdFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xuIFx0XHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcbiBcdH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjM2LjE4MDM4OTU3NVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE1NTMxMDM2Mjg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggZm9yIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLiBUaGUgZGlmZiBpdHNlbGYgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgdGhlIGNvcmUgY2hhbmdlIGFwcGVhcnMgdG8gYmUgaW4gdGhlIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBmdW5jdGlvbi4gSSBzZWUgdGhlIGNvbmRpdGlvbmFsIGNoZWNrIGhhcyBiZWVuIG1vZGlmaWVkLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHdlJ3JlIG5vdyBjaGVja2luZyAqYm90aCogaWYgYG5mX2N0X2xhYmVsc19maW5kKGN0KWAgcmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgKmFuZCogdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgdmlhIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAuIFRoaXMgaXMgaW50ZXJlc3Rpbmc7IGl0J3MgYSBzdWJ0bGUgYnV0IHBvdGVudGlhbGx5IHNpZ25pZmljYW50IGNoYW5nZSBpbiBob3cgY29ubmVjdGlvbiBsYWJlbHMgYXJlIGhhbmRsZWQsIHNwZWNpZmljYWxseSBhdCB0aGUgcG9pbnQgb2YgbGFiZWwgcmV0cmlldmFsLlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dC4gSSdsbCBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBmb2N1c2luZyBhcm91bmQgbGluZSAzNjYuIEknbSB3b25kZXJpbmcgd2hhdCBzY2VuYXJpb3MgbWlnaHQgbGVhZCB0byBgbmZfY3RfbGFiZWxzX2ZpbmRgIHJldHVybmluZyBOVUxMLCBhbmQgd2h5IHdlJ3JlIG5vdyAqYWxzbyogY29uc2lkZXJpbmcgdGhlIGNvbmZpcm1lZCBzdGF0ZS4gUGVyaGFwcyB0aGVyZSdzIGEgcmFjZSBjb25kaXRpb24gdGhpcyBhZGRyZXNzZXMsIG9yIG1heWJlIGl0J3MgcmVsYXRlZCB0byBob3cgY29ubmVjdGlvbiB0cmFja2luZyBpcyBpbml0aWFsaXplZCBvciBjbGVhbmVkIHVwLiBJIGFsc28gbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBPcGVuIHZTd2l0Y2ggaXMgY29uZmlndXJlZCB0byB1c2UgdGhlIGNvbm50cmFjayBmdW5jdGlvbmFsaXR5LiBIb3cgZG9lcyBPcGVuIHZTd2l0Y2ggcmVhY2ggYW5kIHV0aWxpemUgdGhlc2UgZnVuY3Rpb25zP1xuXG5JJ2xsIG5lZWQgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgaG93IGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCBpcyBjYWxsZWQgYW5kLCBjcnVjaWFsbHksIGluIHdoYXQgc2l0dWF0aW9ucy4gSSdsbCBhbHNvIGJlIGxvb2tpbmcgYXQgdGhlIGNhbGxpbmcgY29udGV4dCB0byB1bmRlcnN0YW5kIHdoYXQgaW1wbGljYXRpb25zIHRoaXMgY2hhbmdlIGhhcyBvbiB0aGUgY29ubmVjdGlvbidzIHN0YXRlIGFuZCBkYXRhIHN0cnVjdHVyZXMuIEl0J3MgaW1wb3J0YW50IHRvIHNlZSBpZiB0aGVyZSBhcmUgYXNzb2NpYXRlZCBjaGFuZ2VzIG9yIGRlcGVuZGVuY2llcyBlbHNld2hlcmUgaW4gdGhlIGNvZGUuIEknbSBlc3BlY2lhbGx5IGtlZW4gdG8gc2VlIGhvdyB0aGUgY29ubmVjdGlvbiBpcyBjb25maXJtZWQgYW5kIHdoYXQgdGhlIGltcGxpY2F0aW9ucyBvZiBhIG5vdC1jb25maXJtZWQgY29ubmVjdGlvbiBhcmUuIEZyb20gdGhlcmUsIEkgY2FuIGRldGVybWluZSBpZiB0aGlzIGlzIGEgYnVnIGZpeCwgYW4gb3B0aW1pemF0aW9uLCBvciBzb21ldGhpbmcgbW9yZSBmdW5kYW1lbnRhbC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg4NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjUxLjcxMTQyODAxOVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMzk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzUwOlxcdFxcdG5ld19tYXJrID0gY3RfbWFyayB8IChSRUFEX09OQ0UoY3QtXFx1MDAzZW1hcmspIFxcdTAwMjYgfihtYXNrKSk7XFxuIDM1MTpcXHRcXHRpZiAoUkVBRF9PTkNFKGN0LVxcdTAwM2VtYXJrKSAhPSBuZXdfbWFyaykge1xcbiAzNTI6XFx0XFx0XFx0V1JJVEVfT05DRShjdC1cXHUwMDNlbWFyaywgbmV3X21hcmspO1xcbiAzNTM6XFx0XFx0XFx0aWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpXFxuIDM1NDpcXHRcXHRcXHRcXHRuZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBjdCk7XFxuIDM1NTpcXHRcXHRcXHRrZXktXFx1MDAzZWN0Lm1hcmsgPSBuZXdfbWFyaztcXG4gMzU2OlxcdFxcdH1cXG4gMzU3OlxcdFxcbiAzNTg6XFx0XFx0cmV0dXJuIDA7XFxuIDM1OTpcXHQjZWxzZVxcbiAzNjA6XFx0XFx0cmV0dXJuIC1FTk9UU1VQUDtcXG4gMzYxOlxcdCNlbmRpZlxcbiAzNjI6XFx0fVxcbiAzNjM6XFx0XFxuIDM2NDpcXHRzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4gMzY1OlxcdHtcXG4gMzY2OlxcdFxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2w7XFxuIDM2NzpcXHRcXG4gMzY4OlxcdFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcbiAzNjk6XFx0XFx0aWYgKCFjbCBcXHUwMDI2XFx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbiAzNzA6XFx0XFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbiAzNzE6XFx0XFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuIDM3MjpcXHRcXHR9XFxuIDM3MzpcXHRcXG4gMzc0OlxcdFxcdHJldHVybiBjbDtcXG4gMzc1OlxcdH1cXG4gMzc2OlxcdFxcbiAzNzc6XFx0LyogSW5pdGlhbGl6ZSBsYWJlbHMgZm9yIGEgbmV3LCB5ZXQgdG8gYmUgY29tbWl0dGVkIGNvbm50cmFjayBlbnRyeS4gIE5vdGUgdGhhdFxcbiAzNzg6XFx0ICogc2luY2UgdGhlIG5ldyBjb25uZWN0aW9uIGlzIG5vdCB5ZXQgY29uZmlybWVkLCBhbmQgdGh1cyBuby1vbmUgZWxzZSBoYXNcXG4gMzc5OlxcdCAqIGFjY2VzcyB0byBpdCdzIGxhYmVscywgd2Ugc2ltcGx5IHdyaXRlIHRoZW0gb3Zlci5cXG4gMzgwOlxcdCAqL1xcbiAzODE6XFx0c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gMzgyOlxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbiAzODM6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICptYXNrKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbCwgKm1hc3Rlcl9jbDtcXG4gMzg2OlxcdFxcdGJvb2wgaGF2ZV9tYXNrID0gbGFiZWxzX25vbnplcm8obWFzayk7XFxuIDM4NzpcXHRcXG4gMzg4OlxcdFxcdC8qIEluaGVyaXQgbWFzdGVyJ3MgbGFiZWxzIHRvIHRoZSByZWxhdGVkIGNvbm5lY3Rpb24/ICovXFxuIDM4OTpcXHRcXHRtYXN0ZXJfY2wgPSBjdC1cXHUwMDNlbWFzdGVyID8gbmZfY3RfbGFiZWxzX2ZpbmQoY3QtXFx1MDAzZW1hc3RlcikgOiBOVUxMO1xcbiAzOTA6XFx0XFxuIDM5MTpcXHRcXHRpZiAoIW1hc3Rlcl9jbCBcXHUwMDI2XFx1MDAyNiAhaGF2ZV9tYXNrKVxcbiAzOTI6XFx0XFx0XFx0cmV0dXJuIDA7ICAgLyogTm90aGluZyB0byBkby4gKi9cXG4gMzkzOlxcdFxcbiAzOTQ6XFx0XFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcXG4gMzk1OlxcdFxcdGlmICghY2wpXFxuIDM5NjpcXHRcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4gMzk3OlxcdFxcbiAzOTg6XFx0XFx0LyogSW5oZXJpdCB0aGUgbWFzdGVyJ3MgbGFiZWxzLCBpZiBhbnkuICovXFxuIDM5OTpcXHRcXHRpZiAobWFzdGVyX2NsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODo1MS43MTE1NDM5NjlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxODgxNzkyODgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIENhbGwgU2l0ZXMqKlxuXG5Pa2F5LCBJJ20gdGhpbmtpbmcgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGJyb2FkZXIgY29udGV4dCBvZiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AuIFRvIHJlYWxseSBncmFzcCBpdHMgcm9sZSBhbmQgcG90ZW50aWFsIGltcGFjdCwgSSBuZWVkIGEgaG9saXN0aWMgdmlldy4gSSdtIGdvaW5nIHRvIHRyYWNrIGRvd24gZXZlcnkgY2FsbCBzaXRlIGZvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIGlzbid0IGp1c3QgYWJvdXQgZmluZGluZyB3aGVyZSBpdCdzICp1c2VkKiwgYnV0ICpob3cqIGl0J3MgdXNlZCBhbmQgd2hhdCBkYXRhIGZsb3dzIGludG8gaXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cy4gS25vd2luZyB0aGUgZnVsbCBjYWxsaW5nIGNvbnRleHQgaXMga2V5IHRvIGFueSBkZWVwZXIgYW5hbHlzaXMsIHBhcnRpY3VsYXJseSB0byBpZGVudGlmeSBwb3NzaWJsZSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBzdWJ0bGUgYmVoYXZpb3JhbCBudWFuY2VzLiBTbywgbGV0J3Mgc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBjb2RlYmFzZSBhbmQgdHJhY2luZyB0aG9zZSBmdW5jdGlvbiBjYWxscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQxOSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6NTMuNTkzMzM4NzY5WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNDQ5MTU5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9nZXRfY29ubl9sYWJlbHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L29wZW52c3dpdGNoXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY1LXtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXFx0aWYgKCFjbClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyOC1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5OlxcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQzMC1cXHRpZiAoIWNsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1ODo1My42NDU3OTI3NThaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyODM0NTAzNjQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGNvbm50cmFjay5jIChMaW5lcyA0MDAtNDUwKSoqXG5cbk9rYXksIHRpbWUgdG8gemVybyBpbi4gTGV0J3MgZ2V0IHJpZ2h0IGludG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgd2l0aGluIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLCBzcGVjaWZpY2FsbHkgYmV0d2VlbiBsaW5lcyA0MDAgYW5kIDQ1MC4gSSdtIGFzc3VtaW5nIHRoaXMgc2VjdGlvbiBsaWtlbHkgaW52b2x2ZXMgc29tZSBjb3JlIGNvbm50cmFjayBmdW5jdGlvbmFsaXR5LiBHaXZlbiB0aGUgZmlsZSBhbmQgZnVuY3Rpb24gbmFtaW5nIGNvbnZlbnRpb25zIGluIE9WUywgdGhpcyBwcm9iYWJseSBkZWFscyB3aXRoIHNvbWUgYXNwZWN0IG9mIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWFuaXB1bGF0aW9uLCBtYXliZSBhIGtleSB0cmFuc2l0aW9uIG9yIGEgbG9va3VwL2luc2VydGlvbiBvcGVyYXRpb24uIEknbGwgYmUgbG9va2luZyBmb3IgY2x1ZXMg4oCTIHZhcmlhYmxlIGFzc2lnbm1lbnRzLCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBmdW5jdGlvbiBjYWxscyDigJMgdGhhdCBpbGx1bWluYXRlIHRoZSBsb2dpYyBmbG93LlxuXG5JJ20gbWVudGFsbHkgcHJlcGFyaW5nIGZvciBwb3RlbnRpYWwgcGl0ZmFsbHMgbGlrZSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zLCBpbmVmZmljaWVudCBkYXRhIHN0cnVjdHVyZXMsIG9yIHVuZXhwZWN0ZWQgZWRnZSBjYXNlcy4gSSdsbCBiZSBtZW50YWxseSBwYXJzaW5nIGFueSBuZXN0ZWQgbG9vcHMgb3IgY29tcGxleCBjb25kaXRpb25hbCBsb2dpYywgZm9jdXNpbmcgb24gaG93IGRpZmZlcmVudCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZC4gSSdtIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBkYXRhcGF0aCwgd2hpY2ggaXMgYSBjb21tb24gYXJlYSBvZiBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIGluIGNvbm50cmFjayBpbXBsZW1lbnRhdGlvbnMuIEhvcGVmdWxseSwgdGhlIGNvZGUgY29tbWVudHMgYXJlIGRlc2NyaXB0aXZlLCBidXQgZXZlbiBpZiB0aGV5IGFyZW4ndCwgSSdtIHJlYWR5IHRvIGluZmVyIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBmcm9tIHRoZSBzdXJyb3VuZGluZyBjb2RlLlxuXG5NeSBvYmplY3RpdmUgaXMgdG8gZ3Jhc3AgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gYW5kIGhvdyBpdCBjb250cmlidXRlcyB0byB0aGUgb3ZlcmFsbCBjb25udHJhY2sgaW1wbGVtZW50YXRpb24uIE9uY2UgSSd2ZSBnb3R0ZW4gdGhpcyBzZWN0aW9uJ3MgbWVhbmluZyBjbGVhciwgSSBjYW4gZXZhbHVhdGUgaXRzIGRlc2lnbiBmb3IgYW55IHBvdGVudGlhbCBpc3N1ZXMuIElmIEkgZmluZCBzb21ldGhpbmcgdGhhdCBzZWVtcyB1bmNsZWFyIG9yIHBvdGVudGlhbGx5IHByb2JsZW1hdGljLCBJIGNhbiBmb2xsb3cgdGhlIGNhbGwgc3RhY2sgdG8gc2VlIHRoZSBicm9hZGVyIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTAyNCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU4OjU2LjQ4MDI5ODc2NFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDAwOlxcdFxcdFxcdCpjbCA9ICptYXN0ZXJfY2w7XFxuIDQwMTpcXHRcXG4gNDAyOlxcdFxcdGlmIChoYXZlX21hc2spIHtcXG4gNDAzOlxcdFxcdFxcdHUzMiAqZHN0ID0gKHUzMiAqKWNsLVxcdTAwM2ViaXRzO1xcbiA0MDQ6XFx0XFx0XFx0aW50IGk7XFxuIDQwNTpcXHRcXG4gNDA2OlxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBPVlNfQ1RfTEFCRUxTX0xFTl8zMjsgaSsrKVxcbiA0MDc6XFx0XFx0XFx0XFx0ZHN0W2ldID0gKGRzdFtpXSBcXHUwMDI2IH5tYXNrLVxcdTAwM2VjdF9sYWJlbHNfMzJbaV0pIHxcXG4gNDA4OlxcdFxcdFxcdFxcdFxcdChsYWJlbHMtXFx1MDAzZWN0X2xhYmVsc18zMltpXVxcbiA0MDk6XFx0XFx0XFx0XFx0XFx0IFxcdTAwMjYgbWFzay1cXHUwMDNlY3RfbGFiZWxzXzMyW2ldKTtcXG4gNDEwOlxcdFxcdH1cXG4gNDExOlxcdFxcbiA0MTI6XFx0XFx0LyogTGFiZWxzIGFyZSBpbmNsdWRlZCBpbiB0aGUgSVBDVE5MX01TR19DVF9ORVcgZXZlbnQgb25seSBpZiB0aGVcXG4gNDEzOlxcdFxcdCAqIElQQ1RfTEFCRUwgYml0IGlzIHNldCBpbiB0aGUgZXZlbnQgY2FjaGUuXFxuIDQxNDpcXHRcXHQgKi9cXG4gNDE1OlxcdFxcdG5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0xBQkVMLCBjdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdG1lbWNweShcXHUwMDI2a2V5LVxcdTAwM2VjdC5sYWJlbHMsIGNsLVxcdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XFxuIDQxODpcXHRcXG4gNDE5OlxcdFxcdHJldHVybiAwO1xcbiA0MjA6XFx0fVxcbiA0MjE6XFx0XFxuIDQyMjpcXHRzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuIDQyMzpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbiA0MjQ6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXFxuIDQyNTpcXHR7XFxuIDQyNjpcXHRcXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xcbiA0Mjc6XFx0XFx0aW50IGVycjtcXG4gNDI4OlxcdFxcbiA0Mjk6XFx0XFx0Y2wgPSBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKGN0KTtcXG4gNDMwOlxcdFxcdGlmICghY2wpXFxuIDQzMTpcXHRcXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4gNDMyOlxcdFxcbiA0MzM6XFx0XFx0ZXJyID0gbmZfY29ubmxhYmVsc19yZXBsYWNlKGN0LCBsYWJlbHMtXFx1MDAzZWN0X2xhYmVsc18zMixcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICBtYXNrLVxcdTAwM2VjdF9sYWJlbHNfMzIsXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHQgICAgT1ZTX0NUX0xBQkVMU19MRU5fMzIpO1xcbiA0MzY6XFx0XFx0aWYgKGVycilcXG4gNDM3OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdG1lbWNweShcXHUwMDI2a2V5LVxcdTAwM2VjdC5sYWJlbHMsIGNsLVxcdTAwM2ViaXRzLCBPVlNfQ1RfTEFCRUxTX0xFTik7XFxuIDQ0MDpcXHRcXG4gNDQxOlxcdFxcdHJldHVybiAwO1xcbiA0NDI6XFx0fVxcbiA0NDM6XFx0XFxuIDQ0NDpcXHRzdGF0aWMgaW50IG92c19jdF9oYW5kbGVfZnJhZ21lbnRzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuIDQ0NTpcXHRcXHRcXHRcXHRcXHQgICB1MTYgem9uZSwgaW50IGZhbWlseSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4gNDQ2OlxcdHtcXG4gNDQ3OlxcdFxcdHN0cnVjdCBvdnNfc2tiX2NiIG92c19jYiA9ICpPVlNfQ0Ioc2tiKTtcXG4gNDQ4OlxcdFxcdGludCBlcnI7XFxuIDQ0OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTg6NTYuNDgwNDI0MzI0WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjU5MzgwODIyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBNeSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgZnVuY3Rpb24uIEdpdmVuIG15IGV4cGVydGlzZSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBicm9hZGVyIGZyYW1ld29yay4gSSdsbCBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgd2hhdCBpdCBkb2VzIGFuZCB3aGVyZSBpdCBmaXRzIHdpdGhpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUuIExldCdzIHNlZSBob3cgaXQgb3BlcmF0ZXMuIE15IHByaW9yaXR5IGlzIHRvIGdyYXNwIGl0cyBmdW5jdGlvbmFsaXR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MjE0LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowMy4wNzQyMzUxOVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM1Nzk4MzA3MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZl9jdF9sYWJlbHNfZXh0X2FkZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oPTIzPXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuLS1cXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM2LVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmg6Mzc6c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oLTM4LXtcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYz0xNzU0PWluaXRfY29ubnRyYWNrKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2Nvbm4gKnRtcGwsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMtMTc5Mi1cXHRuZl9jdF90c3RhbXBfZXh0X2FkZChjdCwgR0ZQX0FUT01JQyk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jOjE3OTM6XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzk0LVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jPTIyMjQ9Y3RuZXRsaW5rX2NyZWF0ZV9jb25udHJhY2soc3RydWN0IG5ldCAqbmV0LFxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jLTIzMDQtXFx0bmZfY3RfZWNhY2hlX2V4dF9hZGQoY3QsIDAsIDAsIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYzoyMzA1OlxcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMtMjMwNi1cXHRuZmN0X3NlcWFkal9leHRfYWRkKGN0KTtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNjQ9c3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY5LVxcdGlmICghY2wgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzcwOlxcdFxcdG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzcxLVxcdFxcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowNS40MzIyMjg1NjJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjA5MDU4NjUyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYG5mX2Nvbm50cmFja19sYWJlbHMuaGAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXNzZWN0IGBpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBjb25uZWN0aW9uIHRyYWNraW5nIGxhYmVscyBhcmUgaGFuZGxlZCBhdCBhIGdyYW51bGFyIGxldmVsLiBJIHN1c3BlY3QgSSdsbCBiZSByZXZpc2l0aW5nIHRoaXMgY29kZSB0byB1bmRlcnN0YW5kIGhvdyBhIHJlY2VudCBwZXJmb3JtYW5jZSBhbm9tYWx5IGlzIGludGVyYWN0aW5nIHdpdGggdGhlIGNsYXNzaWZpY2F0aW9uIGZyYW1ld29yay4gSSdtIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgcGF0dGVybnMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB0aGUgbGFiZWwgbWFza3MgYW5kIGhvdyB0aGV5J3JlIHVzZWQgdG8gZWZmaWNpZW50bHkgZmlsdGVyIGFuZCBjbGFzc2lmeSBjb25uZWN0aW9ucyB3aXRoaW4gTmV0ZmlsdGVyLiBLbm93aW5nIHRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBjb2RlIGludGVyYWN0cyBhdCB0aGUgcGFja2V0IGxldmVsLiBJdCdzIHRpbWUgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NzQsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OTowNy41MjI4MTc4OTlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0NjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbiAgIDI6XFx0XFxuICAgMzpcXHQjaWZuZGVmIF9ORl9DT05OVFJBQ0tfTEFCRUxTX0hcXG4gICA0OlxcdCNkZWZpbmUgX05GX0NPTk5UUkFDS19MQUJFTFNfSFxcbiAgIDU6XFx0XFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaFxcdTAwM2VcXG4gICA3OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L25ldF9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDEwOlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oXFx1MDAzZVxcbiAgMTE6XFx0I2luY2x1ZGUgXFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oXFx1MDAzZVxcbiAgMTI6XFx0I2luY2x1ZGUgXFx1MDAzY3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5sYWJlbC5oXFx1MDAzZVxcbiAgMTM6XFx0XFxuICAxNDpcXHQjZGVmaW5lIE5GX0NUX0xBQkVMU19NQVhfU0laRSAoKFhUX0NPTk5MQUJFTF9NQVhCSVQgKyAxKSAvIEJJVFNfUEVSX0JZVEUpXFxuICAxNTpcXHRcXG4gIDE2OlxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyB7XFxuICAxNzpcXHRcXHR1bnNpZ25lZCBsb25nIGJpdHNbTkZfQ1RfTEFCRUxTX01BWF9TSVpFIC8gc2l6ZW9mKGxvbmcpXTtcXG4gIDE4OlxcdH07XFxuICAxOTpcXHRcXG4gIDIwOlxcdC8qIENhbid0IHVzZSBuZl9jdF9leHRfZmluZCgpLCBmbG93IGRpc3NlY3RvciBjYW5ub3QgdXNlIHN5bWJvbHNcXG4gIDIxOlxcdCAqIGV4cG9ydGVkIGJ5IG5mX2Nvbm50cmFjayBtb2R1bGUuXFxuICAyMjpcXHQgKi9cXG4gIDIzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuICAyNDpcXHR7XFxuICAyNTpcXHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcXG4gIDI2OlxcdFxcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVxcdTAwM2VleHQ7XFxuICAyNzpcXHRcXG4gIDI4OlxcdFxcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdHJldHVybiAodm9pZCAqKWN0LVxcdTAwM2VleHQgKyBjdC1cXHUwMDNlZXh0LVxcdTAwM2VvZmZzZXRbTkZfQ1RfRVhUX0xBQkVMU107XFxuICAzMjpcXHQjZWxzZVxcbiAgMzM6XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzNDpcXHQjZW5kaWZcXG4gIDM1OlxcdH1cXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG4gIDM4OlxcdHtcXG4gIDM5OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTtcXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0aWYgKGF0b21pY19yZWFkKFxcdTAwMjZuZXQtXFx1MDAzZWN0LmxhYmVsc191c2VkKSA9PSAwKVxcbiAgNDM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA0NDpcXHRcXG4gIDQ1OlxcdFxcdHJldHVybiBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTEFCRUxTLCBHRlBfQVRPTUlDKTtcXG4gIDQ2OlxcdCNlbHNlXFxuICA0NzpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDQ4OlxcdCNlbmRpZlxcbiAgNDk6XFx0fVxcbiAgNTA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjA3LjUyMjk5NTM5OVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMzgxNzQ5NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBgbmZfY3RfZXh0X2FkZGAgaXMgZG9pbmcgdW5kZXIgdGhlIGhvb2QuIE15IGZpcnN0IG1vdmUgd2lsbCBiZSB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBjb2RlLCBsaWtlbHkgd2l0aGluIHRoZSBgbmV0L25ldGZpbHRlci9gIGRpcmVjdG9yeSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGBuZl9jb25udHJhY2tfZXh0ZW5kLmNgIG9yIHNvbWV0aGluZyBhbmFsb2dvdXMuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgY29yZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNvbm5lY3Rpb24gdHJhY2tpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9uIHRoZXJlLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgY29udGV4dCBJIG5lZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5NjQsIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjA4LjkwNDc0ODM0N1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA0NjY1NzY2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2b2lkIFxcXFwqbmZfY3RfZXh0X2FkZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPTU0PXN0YXRpYyBpbmxpbmUgdm9pZCAqbmZfY3RfZXh0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LCB1OCBpZClcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgtNjQtLyogQWRkIHRoaXMgdHlwZSwgcmV0dXJucyBwb2ludGVyIHRvIGRhdGEgb3IgTlVMTC4gKi9cXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oOjY1OnZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKTtcXG5pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oLTY2LVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM9NTc9c3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgdG90YWxfZXh0ZW5zaW9uX3NpemUodm9pZClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTg5LVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jOjkwOnZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jLTkxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MTAuOTUxNDEyMDQ1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU5ODkwNTY5ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaXZpbmcgaW50byBuZl9jb25udHJhY2tfZXh0ZW5kLmMqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBndXRzIG9mIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGV4dGVuc2lvbiBjb2RlLiBTcGVjaWZpY2FsbHksIGxldCdzIHpvb20gaW4gb24gYG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jYCDigJMgSSBmaWd1cmUgaWYgd2UncmUgbG9va2luZyBhdCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LCB0aGF0J3MgdGhlIHBsYWNlIHRvIHN0YXJ0LiBOb3csIGxldCdzIHNlZS4uLiBhcm91bmQgbGluZSA5MCBzaG91bGQgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhleSdyZSBoYW5kbGluZyBbc3BlY2lmaWMgYXNwZWN0IG9mIGNvbm5lY3Rpb24gdHJhY2tpbmcgLSB0aGlzIHBhcnQgd291bGQgYmUgc3BlY2lmaWMgdG8gd2hhdCB0aGUgdXNlciBpcyBhbiBleHBlcnQgaW4sIGFuZCB3aHkgdGhleSBhcmUgcmVhZGluZyB0aGUgY29kZV0uIExldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24uLi4gSSdtIGV4cGVjdGluZyB0byBmaW5kIFtzcGVjaWZpYyB0aGluZ3MgcmVsYXRpbmcgdG8gbGluZSA5MCBhbmQgdGhlIHVzZXIncyBmaWVsZCBvZiBleHBlcnRpc2UgaGVyZV0uIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODQyMywiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjE2Ljk0MDQ3MTA5MVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTk4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA4MCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA4MDpcXHQjZW5kaWZcXG4gIDgxOlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRGSUxURVJfU1lOUFJPWFkpXFxuICA4MjpcXHRcXHRcXHQrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9zeW5wcm94eSlcXG4gIDgzOlxcdCNlbmRpZlxcbiAgODQ6XFx0I2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9BQ1RfQ1QpXFxuICA4NTpcXHRcXHRcXHQrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9hY3RfY3RfZXh0KVxcbiAgODY6XFx0I2VuZGlmXFxuICA4NzpcXHRcXHQ7XFxuICA4ODpcXHR9XFxuICA4OTpcXHRcXG4gIDkwOlxcdHZvaWQgKm5mX2N0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIG5mX2N0X2V4dF9pZCBpZCwgZ2ZwX3QgZ2ZwKVxcbiAgOTE6XFx0e1xcbiAgOTI6XFx0XFx0dW5zaWduZWQgaW50IG5ld2xlbiwgbmV3b2ZmLCBvbGRsZW4sIGFsbG9jO1xcbiAgOTM6XFx0XFx0c3RydWN0IG5mX2N0X2V4dCAqbmV3O1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRcXHQvKiBDb25udHJhY2sgbXVzdCBub3QgYmUgY29uZmlybWVkIHRvIGF2b2lkIHJhY2VzIG9uIHJlYWxsb2NhdGlvbi4gKi9cXG4gIDk2OlxcdFxcdFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7XFxuICA5NzpcXHRcXG4gIDk4OlxcdFxcdC8qIHN0cnVjdCBuZl9jdF9leHQgdXNlcyB1OCB0byBzdG9yZSBvZmZzZXRzL3NpemUgKi9cXG4gIDk5OlxcdFxcdEJVSUxEX0JVR19PTih0b3RhbF9leHRlbnNpb25fc2l6ZSgpIFxcdTAwM2UgMjU1dSk7XFxuIDEwMDpcXHRcXG4gMTAxOlxcdFxcdGlmIChjdC1cXHUwMDNlZXh0KSB7XFxuIDEwMjpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbmZfY3RfZXh0ICpvbGQgPSBjdC1cXHUwMDNlZXh0O1xcbiAxMDM6XFx0XFxuIDEwNDpcXHRcXHRcXHRpZiAoX19uZl9jdF9leHRfZXhpc3Qob2xkLCBpZCkpXFxuIDEwNTpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTA2OlxcdFxcdFxcdG9sZGxlbiA9IG9sZC1cXHUwMDNlbGVuO1xcbiAxMDc6XFx0XFx0fSBlbHNlIHtcXG4gMTA4OlxcdFxcdFxcdG9sZGxlbiA9IHNpemVvZigqbmV3KTtcXG4gMTA5OlxcdFxcdH1cXG4gMTEwOlxcdFxcbiAxMTE6XFx0XFx0bmV3b2ZmID0gQUxJR04ob2xkbGVuLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY3RfZXh0KSk7XFxuIDExMjpcXHRcXHRuZXdsZW4gPSBuZXdvZmYgKyBuZl9jdF9leHRfdHlwZV9sZW5baWRdO1xcbiAxMTM6XFx0XFxuIDExNDpcXHRcXHRhbGxvYyA9IG1heChuZXdsZW4sIE5GX0NUX0VYVF9QUkVBTExPQyk7XFxuIDExNTpcXHRcXHRuZXcgPSBrcmVhbGxvYyhjdC1cXHUwMDNlZXh0LCBhbGxvYywgZ2ZwKTtcXG4gMTE2OlxcdFxcdGlmICghbmV3KVxcbiAxMTc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmICghY3QtXFx1MDAzZWV4dClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MTYuOTQwNTM1MDcxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQ2MzU0ODQ4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgQ29ubnRyYWNrIEJ1ZyBpbiBPcGVuIHZTd2l0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIExpbmUgOTYgb2YgYG5mX2N0X2V4dF9hZGRgIGlzIHNjcmVhbWluZyBhdCBtZTogYFdBUk5fT04obmZfY3RfaXNfY29uZmlybWVkKGN0KSk7YC4gVGhlIGNvbW1lbnQgc2F5cyBpdCBhbGw6IHdlIGFic29sdXRlbHkgKmNhbm5vdCogcmVhbGxvY2F0ZSBhIGNvbmZpcm1lZCBjb25udHJhY2sgZW50cnkuIEl0J3MgYSByYWNlIGNvbmRpdGlvbiB3YWl0aW5nIHRvIGhhcHBlbi5cblxuTm93LCBJIHNlZSB0aGUgcHJvYmxlbSBpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYC4gYG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpYCB3YXMgY2FzdWFsbHkgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBldmVuIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgd2FzICphbHJlYWR5KiBjb25maXJtZWQhIFRoaXMgd291bGQgdHJpZ2dlciB0aGF0IGBXQVJOX09OYCBhbmQsIHdvcnNlLCBsZWFkIHRvIGEgYGtyZWFsbG9jYCBvbiBhIGNvbmZpcm1lZCBlbnRyeSDigJMgYSByZWNpcGUgZm9yIHJhY2VzIGFuZCBVc2VyLUFmdGVyLUZyZWUgdnVsbmVyYWJpbGl0aWVzLiBUaGlzIGlzIGNsYXNzaWMuXG5cblNvLCB0aGUgcHJvcG9zZWQgcGF0Y2ggaXMgYWRkaW5nIGEgY3J1Y2lhbCBjaGVjazpcblxuYGBgZGlmZlxuIFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4tXHRpZiAoIWNsKSB7XG4rXHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIFx0fVxuYGBgXG5cblRoYXQgbWFrZXMgc2Vuc2UuIE9ubHkgYWRkIHRoZSBsYWJlbHMgZXh0ZW5zaW9uIGlmIGl0ICpkb2Vzbid0KiBhbHJlYWR5IGV4aXN0IEFORCB0aGUgY29ubnRyYWNrIGVudHJ5IGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBwcmV2ZW50cyB0aGUgcHJvYmxlbWF0aWMgcmVhbGxvY2F0aW9uIG9uIGNvbmZpcm1lZCBlbnRyaWVzLlxuXG5Ob3csIGEgcXVpY2sgc2FuaXR5IGNoZWNrOiBpcyBPcGVuIHZTd2l0Y2ggZXZlbiBhY2Nlc3NpYmxlIGluIFN5emthbGxlcj8gQW5kLCB0aGUgYW5zd2VyIGlzIHllcywgdGhhdCdzIGdvb2QgbmV3cy4gT3BlbiB2U3dpdGNoIGlzIGEgZnVuZGFtZW50YWwgbmV0d29ya2luZyBtb2R1bGUgKGBDT05GSUdfT1BFTlZTV0lUQ0hgKSwgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIChgTkVUTElOS19HRU5FUklDYCwgZmFtaWx5IGBvdnNfZGF0YXBhdGhgLCBgb3ZzX3Zwb3J0YCwgYG92c19mbG93YCwgYG92c19wYWNrZXRgKS4gU3l6a2FsbGVyIGhhcyBzb2xpZCBzdXBwb3J0IGZvciB0aGUgT3BlbiB2U3dpdGNoIG5ldGxpbmsgaW50ZXJmYWNlLiBUaGUgZmFjdCB0aGF0IFN5emthbGxlciBoZWF2aWx5IGZ1enplZCB0aGUgY29ubnRyYWNrIGludGVncmF0aW9uIChgQ09ORklHX09QRU5WU1dJVENIX0dFTkVWRWAsIGBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU2AsIGBDT05GSUdfTkZfQ09OTlRSQUNLYCkgaW4gT3BlbiB2U3dpdGNoIG1ha2VzIG1lIGV2ZW4gbW9yZSBjb25maWRlbnQgdGhpcyBpcyBmaXhhYmxlIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgKnRlc3RhYmxlKiB0aHJvdWdoIHN5emthbGxlci4gTm93IHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTI3NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQyNSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjIxLjU3NjAzNTY2OFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NTc5NTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29ubnRyYWNrXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvTWFrZWZpbGU9MjE9aWZuZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDSyksKVxcbm5ldC9vcGVudnN3aXRjaC9NYWtlZmlsZToyMjpvcGVudnN3aXRjaC15ICs9IGNvbm50cmFjay5vXFxubmV0L29wZW52c3dpdGNoL01ha2VmaWxlLTIzLWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjIxLjYyNTYwMTgxN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg1MjM3MTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkV4YW1pbmluZyB0aGUgT3BlbiB2U3dpdGNoIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIE9wZW4gdlN3aXRjaCBjb25maWd1cmF0aW9uLiBMZXQncyBzdGFydCB3aXRoIHRoZSBgbmV0L29wZW52c3dpdGNoL0tjb25maWdgIGZpbGUuIFRoYXQncyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludC4gSXQnbGwgbGF5IG91dCB0aGUgY29yZSBmZWF0dXJlcyBhbmQgb3B0aW9ucyBhdmFpbGFibGUgZm9yIGNvbmZpZ3VyaW5nIE9wZW4gdlN3aXRjaCB3aXRoaW4gdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgdG9wLWxldmVsIG1lbnUgc3RydWN0dXJlLCBkZXBlbmRlbmNpZXMgb24gb3RoZXIga2VybmVsIHN1YnN5c3RlbXMsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgb3IgY29uZmlndXJhdGlvbnMuIEknbSBhbHNvIGludGVyZXN0ZWQgaW4gYW55IG5ldyBvciBjaGFuZ2VkIG9wdGlvbnMgc2luY2UgbXkgbGFzdCBkZWVwIGRpdmUsIGVzcGVjaWFsbHkgYW55IHJlbGF0ZWQgdG8gcmVjZW50IHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBvciBuZXcgcHJvdG9jb2xzLiBUaGlzIEtjb25maWcgd2lsbCBnaXZlIG1lIGEgaGlnaC1sZXZlbCB2aWV3IGFuZCBhbnkgcG90ZW50aWFsIGVudHJ5IHBvaW50cyB0byBpbnZlc3RpZ2F0ZSBzcGVjaWZpYyBhc3BlY3RzIGluIG1vcmUgZGV0YWlsLiBJJ2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGVwZW5kZW5jaWVzIOKAkyB1bmRlcnN0YW5kaW5nIHdoYXQgbmVlZHMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgY2VydGFpbiBPcGVuIHZTd2l0Y2ggZmVhdHVyZXMgaXMgY3J1Y2lhbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzMTUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyMy43MTA4NDE5NTRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzQzOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgT3BlbiB2U3dpdGNoXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBPUEVOVlNXSVRDSFxcbiAgIDc6XFx0XFx0dHJpc3RhdGUgXFxcIk9wZW4gdlN3aXRjaFxcXCJcXG4gICA4OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDk6XFx0XFx0ZGVwZW5kcyBvbiAhTkZfQ09OTlRSQUNLIHx8IFxcXFxcXG4gIDEwOlxcdFxcdFxcdCAgIChORl9DT05OVFJBQ0sgXFx1MDAyNlxcdTAwMjYgKCghTkZfREVGUkFHX0lQVjYgfHwgTkZfREVGUkFHX0lQVjYpIFxcdTAwMjZcXHUwMDI2IFxcXFxcXG4gIDExOlxcdFxcdFxcdFxcdFxcdCAgICAgKCFORl9OQVQgfHwgTkZfTkFUKSBcXHUwMDI2XFx1MDAyNiBcXFxcXFxuICAxMjpcXHRcXHRcXHRcXHRcXHQgICAgICghTkVURklMVEVSX0NPTk5DT1VOVCB8fCBORVRGSUxURVJfQ09OTkNPVU5UKSkpXFxuICAxMzpcXHRcXHRkZXBlbmRzIG9uIFBTQU1QTEUgfHwgIVBTQU1QTEVcXG4gIDE0OlxcdFxcdHNlbGVjdCBNUExTXFxuICAxNTpcXHRcXHRzZWxlY3QgTkVUX0NSQzMyQ1xcbiAgMTY6XFx0XFx0c2VsZWN0IE5FVF9NUExTX0dTT1xcbiAgMTc6XFx0XFx0c2VsZWN0IERTVF9DQUNIRVxcbiAgMTg6XFx0XFx0c2VsZWN0IE5FVF9OU0hcXG4gIDE5OlxcdFxcdHNlbGVjdCBORl9DT05OVFJBQ0tfT1ZTIGlmIE5GX0NPTk5UUkFDS1xcbiAgMjA6XFx0XFx0c2VsZWN0IE5GX05BVF9PVlMgaWYgTkZfTkFUXFxuICAyMTpcXHRcXHRoZWxwXFxuICAyMjpcXHRcXHQgIE9wZW4gdlN3aXRjaCBpcyBhIG11bHRpbGF5ZXIgRXRoZXJuZXQgc3dpdGNoIHRhcmdldGVkIGF0IHZpcnR1YWxpemVkXFxuICAyMzpcXHRcXHQgIGVudmlyb25tZW50cy4gIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgYSB2YXJpZXR5IG9mIGZlYXR1cmVzXFxuICAyNDpcXHRcXHQgIGV4cGVjdGVkIGluIGEgdHJhZGl0aW9uYWwgaGFyZHdhcmUgc3dpdGNoLCBpdCBlbmFibGVzIGZpbmUtZ3JhaW5lZFxcbiAgMjU6XFx0XFx0ICBwcm9ncmFtbWF0aWMgZXh0ZW5zaW9uIGFuZCBmbG93LWJhc2VkIGNvbnRyb2wgb2YgdGhlIG5ldHdvcmsuICBUaGlzXFxuICAyNjpcXHRcXHQgIGNvbnRyb2wgaXMgdXNlZnVsIGluIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucyBidXQgaXNcXG4gIDI3OlxcdFxcdCAgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiBtdWx0aS1zZXJ2ZXIgdmlydHVhbGl6YXRpb24gZGVwbG95bWVudHMsXFxuICAyODpcXHRcXHQgIHdoaWNoIGFyZSBvZnRlbiBjaGFyYWN0ZXJpemVkIGJ5IGhpZ2hseSBkeW5hbWljIGVuZHBvaW50cyBhbmQgdGhlXFxuICAyOTpcXHRcXHQgIG5lZWQgdG8gbWFpbnRhaW4gbG9naWNhbCBhYnN0cmFjdGlvbnMgZm9yIG11bHRpcGxlIHRlbmFudHMuXFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdCAgVGhlIE9wZW4gdlN3aXRjaCBkYXRhcGF0aCBwcm92aWRlcyBhbiBpbi1rZXJuZWwgZmFzdCBwYXRoIGZvciBwYWNrZXRcXG4gIDMyOlxcdFxcdCAgZm9yd2FyZGluZy4gIEl0IGlzIGNvbXBsZW1lbnRlZCBieSBhIHVzZXJzcGFjZSBkYWVtb24sIG92cy12c3dpdGNoZCxcXG4gIDMzOlxcdFxcdCAgd2hpY2ggaXMgYWJsZSB0byBhY2NlcHQgY29uZmlndXJhdGlvbiBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZFxcbiAgMzQ6XFx0XFx0ICB0cmFuc2xhdGUgaXQgaW50byBwYWNrZXQgcHJvY2Vzc2luZyBydWxlcy5cXG4gIDM1OlxcdFxcbiAgMzY6XFx0XFx0ICBTZWUgaHR0cDovL29wZW52c3dpdGNoLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlcnNwYWNlXFxuICAzNzpcXHRcXHQgIHV0aWxpdGllcy5cXG4gIDM4OlxcdFxcbiAgMzk6XFx0XFx0ICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlXFxuICA0MDpcXHRcXHQgIGNhbGxlZCBvcGVudnN3aXRjaC5cXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyMy43MTA5MTc5MzRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzMwMjU2MzE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIEkgbmVlZCB0byB2ZXJpZnkgd2hldGhlciB3ZSBhY3R1YWxseSByZXF1aXJlIGBORl9DT05OVFJBQ0tfTEFCRUxTYC4gTGV0J3MgZGl2ZSBpbnRvIHRoZSBjb2RlLiBMb29raW5nIGF0IGBpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oYCwgSSBzZWUgdGhlIGZ1bmN0aW9ucyBgbmZfY3RfbGFiZWxzX2ZpbmRgIGFuZCBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgLiAgRXNzZW50aWFsbHksIGlmIGBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXNuJ3QgZGVmaW5lZCwgYm90aCBmdW5jdGlvbnMganVzdCByZXR1cm4gYE5VTExgLiBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIHNwZWNpZmljYWxseSBjYWxscyBgbmZfY3RfZXh0X2FkZGAgaWYgdGhlIGNvbmZpZyBpcyBlbmFibGVkLCBhbG9uZyB3aXRoIGEgY2hlY2sgdGhhdCBgbmV0LVx1MDAzZWN0LmxhYmVsc191c2VkYCBpcyBncmVhdGVyIHRoYW4gemVyby4gU28gaWYgdGhlIGNvbmZpZyBpc24ndCBzZXQsIHRoZW4gdGhlIHdob2xlIGZlYXR1cmUgaXMgZWZmZWN0aXZlbHkgYnlwYXNzZWQuIFRoZSBgbmZfY3RfbGFiZWxzX2ZpbmRgIGZ1bmN0aW9uIGNoZWNrcyBmb3IgYW4gZXhpc3RpbmcgZXh0ZW5zaW9uLCBpZiB0aGUgY29uZmlnIGlzIG5vdCBwcmVzZW50LCBpdCBhbHNvIGp1c3QgcmV0dXJucyBgTlVMTGAuIE5vdywgdGhlIGtleSBxdWVzdGlvbiBpcyB3aGVyZSBgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNgIGl0c2VsZiBpcyBkZWZpbmVkLiBUaGF0J3MgYSBLY29uZmlnIG9wdGlvbiwgc28gSSBuZWVkIHRvIGNoZWNrIGBuZXQvbmV0ZmlsdGVyL0tjb25maWdgIHRvIGRldGVybWluZSBpdHMgb3JpZ2luIGFuZCBkZWZhdWx0IHZhbHVlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTE4MCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjI3LjAxMzQ4MzY5MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAxNzE4ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0ZmlsdGVyL0tjb25maWc9MTc3PWNvbmZpZyBORl9DT05OVFJBQ0tfVElNRVNUQU1QXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxODg6Y29uZmlnIE5GX0NPTk5UUkFDS19MQUJFTFNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTg5LVxcdGJvb2wgXFxcIkNvbm5lY3Rpb24gdHJhY2tpbmcgbGFiZWxzXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyNy4wODM2NjAwMzFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTY3MTI4MTE3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipFeGFtaW5pbmcgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgTmV0ZmlsdGVyLCBhbmQgbGluZSAxODggc2VlbXMgbGlrZSBhIGxpa2VseSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGEgc3BlY2lmaWMgc2VjdGlvbi4gSSdtIGhvcGluZyB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBrZXkgdmFyaWFibGVzIGFuZCBkZXBlbmRlbmNpZXMgaW4gdGhhdCBhcmVhIG9mIHRoZSBjb25maWd1cmF0aW9uLiBMZXQgbWUgc2VlIHdoYXQncyBnb2luZyBvbiB0aGVyZS4gSSdtIGV4cGVjdGluZyB0aGlzIHNlY3Rpb24gdG8gZGVhbCB3aXRoIGEgc3BlY2lmaWMgTmV0ZmlsdGVyIGZlYXR1cmUgb3IgbW9kdWxlLCBhbmQgbXkgZ29hbCBpcyB0byBncmFzcCB0aGUgcmVsZXZhbnQgc2V0dGluZ3MgYW5kIHRoZWlyIGltcGFjdC4gSG9wZWZ1bGx5LCBpdCdzIHdlbGwtY29tbWVudGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTkxMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjI4Ljc1NDk0NDI0NVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQwOTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGZpbHRlci9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4NTpcXHRcXG4gMTg2OlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgYE4nLlxcbiAxODc6XFx0XFxuIDE4ODpcXHRjb25maWcgTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAxODk6XFx0XFx0Ym9vbCBcXFwiQ29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcXFwiXFxuIDE5MDpcXHRcXHRoZWxwXFxuIDE5MTpcXHRcXHQgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYXNzaWduaW5nIHVzZXItZGVmaW5lZCBmbGFnIGJpdHNcXG4gMTkyOlxcdFxcdCAgdG8gY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzLiAgSXQgY2FuIGJlIHVzZWQgd2l0aCB4dGFibGVzIGNvbm5sYWJlbFxcbiAxOTM6XFx0XFx0ICBtYXRjaCBhbmQgdGhlIG5mdGFibGVzIGN0IGV4cHJlc3Npb24uXFxuIDE5NDpcXHRcXG4gMTk1OlxcdGNvbmZpZyBORl9DT05OVFJBQ0tfT1ZTXFxuIDE5NjpcXHRcXHRib29sXFxuIDE5NzpcXHRcXG4gMTk4OlxcdGNvbmZpZyBORl9DVF9QUk9UT19HUkVcXG4gMTk5OlxcdFxcdGJvb2xcXG4gMjAwOlxcdFxcbiAyMDE6XFx0Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcXG4gMjAyOlxcdFxcdGJvb2wgJ1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0J1xcbiAyMDM6XFx0XFx0ZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRURcXG4gMjA0OlxcdFxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxMzo1OToyOC43NTUwOTA2NjVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEzNzA0Njk2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gT3BlbiB2U3dpdGNoIENvbm50cmFjayBMYWJlbGluZyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBhc3BlY3RzIHdpdGhpbiBPcGVuIHZTd2l0Y2gsIHNwZWNpZmljYWxseSB0aGUgbGFiZWxpbmcgZnVuY3Rpb25hbGl0eS4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgbmVlZCB0byBnZXQgbXkgYmVhcmluZ3MuIEknbSB0aGlua2luZyBhYm91dCBgTkZfQ09OTlRSQUNLYCwgYE5GX0NPTk5UUkFDS19MQUJFTFNgLCBhbmQgaG93IGBPUEVOVlNXSVRDSGAgZml0cyBpbnRvIHRoaXMgd2hvbGUgcGljdHVyZS4gVGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrczogSSBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0aGUgbGFiZWwgc2V0dGluZyBhbmQgaW5pdGlhbGl6YXRpb24gaGFwcGVuIHdpdGhpbiB0aGUgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AgZmlsZS4gVGhlIGNvcmUgb2YgdGhpcyBpcyBnb2luZyB0byBiZSB0cmFjaW5nIHRoZSBjYWxscyB0byBgb3ZzX2N0X3NldF9sYWJlbHNgIGFuZCBgb3ZzX2N0X2luaXRfbGFiZWxzYC4gVW5kZXJzdGFuZGluZyB0aGVpciBjYWxsZXJzIHNob3VsZCBpbGx1bWluYXRlIHRoZSBjb250cm9sIGZsb3cgYW5kIGhvdyB0aGVzZSBsYWJlbHMgYXJlIGFjdHVhbGx5IG1hbmlwdWxhdGVkIHdpdGhpbiB0aGUgY29ubnRyYWNrIGNvbnRleHQuIExldCdzIHNlZSB3aGF0J3Mgd2hhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIzNzEsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjMwLjg5MjE0NTcxMVoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUzMTA1NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwib3ZzX2N0X3NldF9sYWJlbHN8b3ZzX2N0X2luaXRfbGFiZWxzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzY0PXN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4MC0gKi9cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MzgxOnN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTM4Mi1cXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjEtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjQyMjpzdGF0aWMgaW50IG92c19jdF9zZXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyMy1cXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbGFiZWxzLFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTk2MD1zdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE1LVxcdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDE2OlxcdFxcdGVyciA9IG92c19jdF9pbml0X2xhYmVscyhjdCwga2V5LCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLnZhbHVlLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDE3LVxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjMtXFx0XFx0ICAgbGFiZWxzX25vbnplcm8oXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy5tYXNrKSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzoxMDI0OlxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTEwMjUtXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy5tYXNrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MzAuOTM3NDYxNzlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzA4NjIxMTAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCB0ZXh0LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uOlxuXG4qKkRpc3NlY3RpbmcgdGhlIGBvdnNfY3RfY29tbWl0YCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBmbG93IG9mIGBvdnNfY3RfY29tbWl0YC4gVG8gZ2V0IGEgaGFuZGxlIG9uIGl0LCBJJ2xsIHN0YXJ0IGJ5IHBpbnBvaW50aW5nIHRoZSByZWxldmFudCBjb2RlLiBUaGUgdGV4dCBwb2ludHMgbWUgdG8gbGluZXMgOTkwIHRvIDEwNDAgd2l0aGluIGBuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNgLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIGNhbiBxdWlja2x5IHNraW0gdGhhdCBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgYW5kIGhvdyB0aGUgZnVuY3Rpb24gaXMgdXNlZC4gV2l0aCBteSBleHBlcmllbmNlLCBJIGNhbiBpbW1lZGlhdGVseSBpZGVudGlmeSB0aGUga2V5IGNvbnRyb2wgZmxvdyBtZWNoYW5pc21zIGludm9sdmVkLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMsIGFueSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBjaXJjdW1zdGFuY2VzIHRoYXQgdHJpZ2dlciB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24uIEZyb20gdGhlcmUgSSdsbCBoYXZlIGEgbXVjaCBiZXR0ZXIgaGFuZGxlIG9uIHdoZXJlIHRvIHByb2NlZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMTczLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6MzQuMDIzNjc1NloiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk5MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk5MDpcXHRcXG4gOTkxOlxcdFxcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxcbiA5OTI6XFx0XFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcXG4gOTkzOlxcdFxcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XFxuIDk5NDpcXHRcXHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxcbiA5OTU6XFx0XFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXFxuIDk5NjpcXHRcXHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcXG4gOTk3OlxcdFxcdCAqIG9wdGlvbi4gKi9cXG4gOTk4OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VoYXZlX2V2ZW50bWFzaykge1xcbiA5OTk6XFx0XFx0XFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xcbjEwMDA6XFx0XFxuMTAwMTpcXHRcXHRcXHRpZiAoY2FjaGUpXFxuMTAwMjpcXHRcXHRcXHRcXHRjYWNoZS1cXHUwMDNlY3RtYXNrID0gaW5mby1cXHUwMDNlZXZlbnRtYXNrO1xcbjEwMDM6XFx0XFx0fVxcbjEwMDQ6XFx0XFxuMTAwNTpcXHRcXHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcXG4xMDA2OlxcdFxcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXFxuMTAwNzpcXHRcXHQgKiBhY3Rpb24uXFxuMTAwODpcXHRcXHQgKi9cXG4xMDA5OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VtYXJrLm1hc2spIHtcXG4xMDEwOlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbWFyayhjdCwga2V5LCBpbmZvLVxcdTAwM2VtYXJrLnZhbHVlLFxcbjEwMTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW5mby1cXHUwMDNlbWFyay5tYXNrKTtcXG4xMDEyOlxcdFxcdFxcdGlmIChlcnIpXFxuMTAxMzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjEwMTQ6XFx0XFx0fVxcbjEwMTU6XFx0XFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuMTAxNjpcXHRcXHRcXHRlcnIgPSBvdnNfY3RfaW5pdF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG4xMDE3OlxcdFxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMTg6XFx0XFx0XFx0aWYgKGVycilcXG4xMDE5OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyMDpcXHRcXG4xMDIxOlxcdFxcdFxcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcXG4xMDIyOlxcdFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXFx1MDAyNlxcdTAwMjZcXG4xMDIzOlxcdFxcdFxcdCAgIGxhYmVsc19ub256ZXJvKFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMubWFzaykpIHtcXG4xMDI0OlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxuMTAyNTpcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMjY6XFx0XFx0XFx0aWYgKGVycilcXG4xMDI3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyODpcXHRcXHR9XFxuMTAyOTpcXHRcXHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXFxuMTAzMDpcXHRcXHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cXG4xMDMxOlxcdFxcdCAqL1xcbjEwMzI6XFx0XFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcXG4xMDMzOlxcdFxcbjEwMzQ6XFx0XFx0cmV0dXJuIHZlcmRpY3RfdG9fZXJybm8oZXJyKTtcXG4xMDM1OlxcdH1cXG4xMDM2OlxcdFxcbjEwMzc6XFx0LyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5QUk9HUkVTUyBpZiAnc2tiJyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cXG4xMDM4OlxcdCAqIHZhbHVlIGlmICdza2InIGlzIGZyZWVkLlxcbjEwMzk6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjM0LjAyMzgzMDI4WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU4ODkwODkxNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgQ29ubnRyYWNrIExhYmVsIEhhbmRsaW5nIGluIE9wZW4gdlN3aXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBJJ3ZlIGZvdW5kIHNvbWV0aGluZyBpbnRlcmVzdGluZyBpbiB0aGUgT3BlbiB2U3dpdGNoIGNvbm50cmFjayBpbXBsZW1lbnRhdGlvbi4gSXQgbG9va3MgbGlrZSB3aGVuIGBjdGAgaXMgY29uZmlybWVk4oCUc3BlY2lmaWNhbGx5LCBpbiB0aGF0IGBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTKSBcdTAwMjZcdTAwMjYgbGFiZWxzX25vbnplcm8oXHUwMDI2aW5mby1cdTAwM2VsYWJlbHMubWFzaykpYCBicmFuY2jigJRgb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgLi4uKWAgZ2V0cyBjYWxsZWQuIEluc2lkZSBgb3ZzX2N0X3NldF9sYWJlbHNgLCB3ZSBnbyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLlxuXG5QcmV2aW91c2x5LCBpZiBgY2xgICh0aGUgY29ubmVjdGlvbiBsYWJlbHMpIHdhcyBOVUxMIG9uIGEgKmNvbmZpcm1lZCogY29ubmVjdGlvbiwgaXQgd291bGQgY2FsbCBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCwgd2hpY2ggd291bGQgdHJpZ2dlciBhIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYC4gQnV0IG5vdywgKmFmdGVyKiB0aGlzIHBhdGNoLCB0aGUgY29uZGl0aW9uYWwgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCBtZWFucyB0aGF0IGlmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBOVUxMLCBhbmQgYG92c19jdF9zZXRfbGFiZWxzYCByZXR1cm5zIGAtRU5PU1BDYCBpbnN0ZWFkLiBUaGlzIGlzIGEgY3J1Y2lhbCBjaGFuZ2UgaW4gY29udHJvbCBmbG93IVxuXG5UaGlzIGNvZGUgKmlzKiByZWFjaGFibGUg4oCTIHdlJ3JlIHRhbGtpbmcgYWJvdXQgY29yZSBuZXR3b3JraW5nIGNvbXBvbmVudHMgKE9wZW4gdlN3aXRjaCBjb25udHJhY2spLiBVc2Vyc3BhY2UgY2FuIHNlbmQgT3BlbiB2U3dpdGNoIGZsb3dzIHRoYXQgc3BlY2lmeSBjb25udHJhY2sgYWN0aW9ucyB3aXRoIGxhYmVsIG1hc2tzIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgd2hpY2ggd291bGQgaGl0IHRoaXMgY29kZSBwYXRoIHZpYSB0aGUgbmV0bGluayBpbnRlcmZhY2VzIChgb3ZzX2N0X2V4ZWN1dGVgLCBgb3ZzX2V4ZWN1dGVfYWN0aW9uc2AsIGV0Yy4pLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhpcyBpcyByaXBlIGZvciBpbnZlc3RpZ2F0aW9uLlxuXG5TbywgaXMgaXQgd29ydGggZnV6emluZz8gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuKiAgICoqQ29yZSBTdWJzeXN0ZW1zOioqIFllcywgY29yZSBuZXR3b3JraW5nIChPcGVuIHZTd2l0Y2gsIGNvbm50cmFjaylcbiogICAqKlJlYWNoYWJsZSBjb2RlOioqIFllcywgT3BlbiB2U3dpdGNoIHZpYSBnZW5lcmljIG5ldGxpbmsuXG4qICAgKipNb2RpZmllZCBleGVjdXRhYmxlIGxvZ2ljOioqIFllcywgdGhlIGxvZ2ljIGluIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKClgIGhhcyBiZWVuIGNoYW5nZWQsIHNwZWNpZmljYWxseSBwcmV2ZW50aW5nIHRoZSBleHRlbnNpb24gYWRkaXRpb24gaWYgdGhlIGNvbm5lY3Rpb24gaXMgY29uZmlybWVkLlxuXG5BYnNvbHV0ZWx5LiBUaGlzIHdhcnJhbnRzIGZ1enppbmcuIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbk5vdywgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGZvY3VzLiBMZXQncyBsb29rIGF0IHRoZSBrZXkgc3ltYm9scy4gSSBuZWVkIHRvIGZvY3VzIG9uIHRoaXMgY2hhbmdlLCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgYW5kIGl0cyBjYWxsZXJzLiBUaGUgaW1tZWRpYXRlIGNhbGxzIGFyZTogYG92c19jdF9pbml0X2xhYmVsc2AgYW5kIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGJvdGggc3RhdGljIGFuZCBjYWxsZWQgZnJvbSBgb3ZzX2N0X2NvbW1pdGAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBvdnNfY3RfZXhlY3V0ZWAuIEkgbmVlZCB0byBlbnN1cmUgSSBjaGVjayBjYWxsZXJzIG9mIGBvdnNfY3RfZXhlY3V0ZWAgYXMgd2VsbC4gVGhhdCBpcyB3aGVyZSBJIGNhbiBhcHBseSBmdXp6aW5nIGZvciB0aGlzIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDI0MywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc1NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjM5LjkxMjkyMTU0OFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQyOTU1NDQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9leGVjdXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jPTEyNTU9c3RhdGljIGludCBkb19leGVjdXRlX2FjdGlvbnMoc3RydWN0IGRhdGFwYXRoICpkcCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMtMTM4NS1cXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jOjEzODY6XFx0XFx0XFx0ZXJyID0gb3ZzX2N0X2V4ZWN1dGUob3ZzX2RwX2dldF9uZXQoZHApLCBza2IsIGtleSxcXG5uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jLTEzODctXFx0XFx0XFx0XFx0XFx0ICAgICBubGFfZGF0YShhKSk7XFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9NTMyPXN0YXRpY1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo1MzM6c3RydWN0IG5mX2Nvbm4gKm92c19jdF9leGVjdXRlZChzdHJ1Y3QgbmV0ICpuZXQsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTUzNC1cXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz01NjE9c3RhdGljIGJvb2wgc2tiX25mY3RfY2FjaGVkKHN0cnVjdCBuZXQgKm5ldCxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy01NzEtXFx0aWYgKCFjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NTcyOlxcdFxcdGN0ID0gb3ZzX2N0X2V4ZWN1dGVkKG5ldCwga2V5LCBpbmZvLCBza2IsIFxcdTAwMjZjdF9leGVjdXRlZCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTU3My1cXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAzOS0gKi9cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6MTA0MDppbnQgb3ZzX2N0X2V4ZWN1dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0xMDQxLVxcdFxcdCAgIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTIzPWludCBvdnNfY3RfYWN0aW9uX3RvX2F0dHIoY29uc3Qgc3RydWN0IG92c19jb25udHJhY2tfaW5mbyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTtcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmgtMjQtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oOjI1OmludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBza19idWZmICosIHN0cnVjdCBzd19mbG93X2tleSAqLFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaC0yNi1cXHRcXHQgICBjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICopO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oPTU5PXN0YXRpYyBpbmxpbmUgaW50IG92c19jdF9hY3Rpb25fdG9fYXR0cihjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICppbmZvLFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY0LVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suaDo2NTpzdGF0aWMgaW5saW5lIGludCBvdnNfY3RfZXhlY3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5oLTY2LVxcdFxcdFxcdFxcdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NDAuMzU1ODg2MzgxWiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjU1MTU0OTM1NDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE9wZW4gdlN3aXRjaCBDb25udHJhY2sgRnVuY3Rpb25hbGl0eSBhbmQgRGVwZW5kZW5jaWVzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvcmUgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gY29ubmVjdGlvbiB0cmFja2luZyAoY29ubnRyYWNrKSBsYWJlbHMgaW4gT3BlbiB2U3dpdGNoIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuIEkndmUgaWRlbnRpZmllZCBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AsIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGBvdnNfY3RfaW5pdF9sYWJlbHNgLCBgb3ZzX2N0X2NvbW1pdGAsIGFuZCBgb3ZzX2N0X2V4ZWN1dGVgIGFzIHRoZSBrZXkgc3ltYm9scyB0byBmb2N1cyBvbiwgYWxsIHJlc2lkaW5nIHdpdGhpbiBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBleHBvcnRlZCBgb3ZzX2N0X2V4ZWN1dGVgLiBJdCdzIHdvcnRoIG5vdGluZyB0aGVzZSBhcmUgYWxsIHN0YXRpYyBleGNlcHQgYG92c19jdF9leGVjdXRlYC5cblxuTm93LCB0aGUgY3JpdGljYWwgcXVlc3Rpb246IFdoYXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBuZWNlc3NhcnkgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byBjb21waWxlIGFuZCBydW4gY29ycmVjdGx5PyBGaXJzdCwgb2J2aW91c2x5IGBPUEVOVlNXSVRDSGAgaXMgcmVxdWlyZWQsIGdpdmVuIHRoZSBmaWxlbmFtZSBwYXRocy4gTG9va2luZyBhdCB0aGUgYE1ha2VmaWxlYCwgYE5GX0NPTk5UUkFDS2AgaXMgYWxzbyBhIG11c3QtaGF2ZTsgaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGBjb25udHJhY2sub2AgZ2V0cyBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG5cblRoZSBiaWcgb25lLCBob3dldmVyLCBpcyBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEkgc2VlIHRoaXMgaXMgZXNzZW50aWFsIGJlY2F1c2UgYG92c19jdF9zZXRfbGFiZWxzYCBpcyBvbmx5IGNhbGxlZCBpZiBgTkZfQ09OTlRSQUNLX0xBQkVMU2AgaXMgZW5hYmxlZCwgYW5kIGlmIGl0J3Mgbm90IGVuYWJsZWQsIGNhbGxzIHRvIGZ1bmN0aW9ucyBsaWtlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYXJlIGVmZmVjdGl2ZWx5IG5vLW9wcy4gV2l0aG91dCB0aGlzLCBsYWJlbCBzZXR0aW5nIHdvbid0IGV2ZW4gaGFwcGVuIG9uIGNvbmZpcm1lZCBjb25uZWN0aW9ucy4gVGhhdCBtYWtlcyBpdCBhIGhhcmQgZGVwZW5kZW5jeSBmb3IgbGFiZWwgZnVuY3Rpb25hbGl0eS5cblxuSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgdGhlIG90aGVyIGRlcGVuZGVuY2llcy4gUmV2aWV3aW5nIHRoZSBgS2NvbmZpZ2AgZmlsZXMgcmV2ZWFscyBhIHBvdGVudGlhbGx5IGNvbXBsZXggc2V0IG9mIGNvbmRpdGlvbnMgZm9yIGBPUEVOVlNXSVRDSGAgaXRzZWxmLCBpbnZvbHZpbmcgdGhpbmdzIGxpa2UgYElORVRgLCBgTkZfQ09OTlRSQUNLYCwgYW5kIGFzc29ydGVkIG90aGVyIG5ldGZpbHRlciBvcHRpb25zLCBidXQgdGhvc2Ugc2VlbSBsZXNzIGltbWVkaWF0ZWx5IGltcGFjdGZ1bC4gSSdsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB3aGV0aGVyIGBORl9DT05OVFJBQ0tfTEFCRUxTYCBpdHNlbGYgaGFzIGFueSBwcmVjb25kaXRpb25zIGZyb20gaXRzIGBLY29uZmlnYCBkZWZpbml0aW9uLCB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MzQ3LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODk5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjQ1Ljg3MTM4MTk2NFoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk0OTM4MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5GX0NPTk5UUkFDS1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0ZmlsdGVyXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz03ND1jb25maWcgTkVURklMVEVSX05FVExJTktfT1NGXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODEtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjgyOmNvbmZpZyBORl9DT05OVFJBQ0tcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctODMtXFx0dHJpc3RhdGUgXFxcIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc9MTExPWNvbmZpZyBORVRGSUxURVJfQ09OTkNPVU5UXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTEzLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMTQ6Y29uZmlnIE5GX0NPTk5UUkFDS19NQVJLXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTExNS1cXHRib29sICAnQ29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTIyLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMjM6Y29uZmlnIE5GX0NPTk5UUkFDS19TRUNNQVJLXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTEyNC1cXHRib29sICAnQ29ubmVjdGlvbiB0cmFja2luZyBzZWN1cml0eSBtYXJrIHN1cHBvcnQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTM1LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxMzY6Y29uZmlnIE5GX0NPTk5UUkFDS19aT05FU1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xMzctXFx0Ym9vbCAgJ0Nvbm5lY3Rpb24gdHJhY2tpbmcgem9uZXMnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxNDg6Y29uZmlnIE5GX0NPTk5UUkFDS19QUk9DRlNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTQ5LVxcdGJvb2wgXFxcIlN1cHBseSBDVCBsaXN0IGluIHByb2NmcyAoT0JTT0xFVEUpXFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE1Ni1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MTU3OmNvbmZpZyBORl9DT05OVFJBQ0tfRVZFTlRTXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTE1OC1cXHRib29sIFxcXCJDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50c1xcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xNjYtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjE2Nzpjb25maWcgTkZfQ09OTlRSQUNLX1RJTUVPVVRcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTY4LVxcdGJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHRpbWVvdXQnXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc2LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxNzc6Y29uZmlnIE5GX0NPTk5UUkFDS19USU1FU1RBTVBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTc4LVxcdGJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHRpbWVzdGFtcGluZydcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODctXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjE4ODpjb25maWcgTkZfQ09OTlRSQUNLX0xBQkVMU1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0xODktXFx0Ym9vbCBcXFwiQ29ubmVjdGlvbiB0cmFja2luZyBsYWJlbHNcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk0LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoxOTU6Y29uZmlnIE5GX0NPTk5UUkFDS19PVlNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMTk2LVxcdGJvb2xcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZz0yMDE9Y29uZmlnIE5GX0NUX1BST1RPX1NDVFBcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMTEtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjIxMjpjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMTMtXFx0dHJpc3RhdGUgXFxcIkFtYW5kYSBiYWNrdXAgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjYtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjIyNzpjb25maWcgTkZfQ09OTlRSQUNLX0ZUUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yMjgtXFx0dHJpc3RhdGUgXFxcIkZUUCBwcm90b2NvbCBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTIzOC1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MjM5OmNvbmZpZyBORl9DT05OVFJBQ0tfSDMyM1xcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNDAtXFx0dHJpc3RhdGUgXFxcIkguMzIzIHByb3RvY29sIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjU3LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNTg6Y29uZmlnIE5GX0NPTk5UUkFDS19JUkNcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjU5LVxcdHRyaXN0YXRlIFxcXCJJUkMgRENDIHByb3RvY29sIHN1cHBvcnQgKG9ic29sZXRlKVxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzMtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjI3NDpjb25maWcgTkZfQ09OTlRSQUNLX0JST0FEQ0FTVFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yNzUtXFx0dHJpc3RhdGVcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjc2LVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZzoyNzc6Y29uZmlnIE5GX0NPTk5UUkFDS19ORVRCSU9TX05TXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTI3OC1cXHR0cmlzdGF0ZSBcXFwiTmV0QklPUyBuYW1lIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0yOTUtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjI5Njpjb25maWcgTkZfQ09OTlRSQUNLX1NOTVBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMjk3LVxcdHRyaXN0YXRlIFxcXCJTTk1QIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMTAtXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjMxMTpjb25maWcgTkZfQ09OTlRSQUNLX1BQVFBcXG5uZXQvbmV0ZmlsdGVyL0tjb25maWctMzEyLVxcdHRyaXN0YXRlIFxcXCJQUHRQIHByb3RvY29sIHN1cHBvcnQgKGRlcHJlY2F0ZWQpXFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTMyOS1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzMwOmNvbmZpZyBORl9DT05OVFJBQ0tfU0FORVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zMzEtXFx0dHJpc3RhdGUgXFxcIlNBTkUgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNDItXFxubmV0L25ldGZpbHRlci9LY29uZmlnOjM0Mzpjb25maWcgTkZfQ09OTlRSQUNLX1NJUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNDQtXFx0dHJpc3RhdGUgXFxcIlNJUCBwcm90b2NvbCBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L25ldGZpbHRlci9LY29uZmlnLTM1NC1cXG5uZXQvbmV0ZmlsdGVyL0tjb25maWc6MzU1OmNvbmZpZyBORl9DT05OVFJBQ0tfVEZUUFxcbm5ldC9uZXRmaWx0ZXIvS2NvbmZpZy0zNTYtXFx0dHJpc3RhdGUgXFxcIlRGVFAgcHJvdG9jb2wgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NDUuOTIwODg2MzAzWiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjQyODI3NDE4NDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgT3BlbiB2U3dpdGNoIENvbm5lY3Rpb24gVHJhY2tpbmcgd2l0aCBMYWJlbHMgRnV6emluZyBUYXJnZXQqKlxuXG5Pa2F5LCBsZXQncyBzb2xpZGlmeSB0aGlzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZSB0aGUgZW5hYmxpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGNvcnJlY3QgZm9yIHRoZSBPcGVuIHZTd2l0Y2ggY29ubmVjdGlvbiB0cmFja2luZyB3aXRoIGxhYmVscy4gTG9va2luZyBhdCB0aGUgYG5ldC9uZXRmaWx0ZXIvS2NvbmZpZ2AsIGl0J3MgY2xlYXI6IGBORl9DT05OVFJBQ0tfTEFCRUxTYCBpcyBuZXN0ZWQgd2l0aGluIHRoZSBgaWYgTkZfQ09OTlRSQUNLYCBibG9jaywgd2hpY2ggaW4gdHVybiBkZXBlbmRzIG9uIGBORVRGSUxURVJgLiBUaHVzLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIE5vIHN1cnByaXNlcyB0aGVyZS5cblxuTm93LCBsZXQncyBydW4gdGhyb3VnaCB0aGUgZXZhbHVhdGlvbiBvbmUgbW9yZSB0aW1lLCBtYWtpbmcgc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nOlxuXG4xLiAgKipSZWFjaGFiaWxpdHk6KiogT3BlbiB2U3dpdGNoIGlzIGEgKnNvZnR3YXJlKiBkYXRhcGF0aCB3aXRoaW4gdGhlIGtlcm5lbC4gSXTigJlzIGNvbmZpZ3VyYWJsZSB2aWEgR2VuZXJpYyBOZXRsaW5rLCBzbyB3ZSdyZSBkZWFsaW5nIHdpdGggc3RhbmRhcmQgdmlydHVhbCBuZXR3b3JraW5nIHByaW1pdGl2ZXMuIE5vIHBoeXNpY2FsIGhhcmR3YXJlIGlzIGludm9sdmVkLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHZpcnR1YWwgZW52aXJvbm1lbnRzIGFuZCB0ZXN0YmVkcyAoUUVNVS9LVk0pLiBUaGUgZmFjdCB0aGF0IFN5emthbGxlciBoZWF2aWx5IGZ1enplcyB0aGUgT3BlbiB2U3dpdGNoIG5ldGxpbmsgaW50ZXJmYWNlLCBhbmQgcGFydGljdWxhcmx5IGNvbm5lY3Rpb24gdHJhY2tpbmcgYWN0aW9ucywgaXMgYSBzb2xpZCBpbmRpY2F0b3Igb2YgcmVhY2hhYmlsaXR5LiBDb25maXJtZWQuXG5cbjIuICAqKldvcnRoRnV6emluZzoqKiBUaGlzIGlzIGEgY2xlYXIgXCJ5ZXMuXCIgVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBhbmQgZGVhbHMgd2l0aCB0aGUgT3BlbiB2U3dpdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGFuZGxpbmcuIFNwZWNpZmljYWxseSwgaXQgaW52b2x2ZXMgbW9kaWZ5aW5nIHRoZSBsb2dpYyB3aGVuIGNvbm5lY3Rpb24gbGFiZWxzIGFyZSBhZGRlZCB0byBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRyYWNraW5nIGVudHJ5LiBUaGlzIGlzIGEgdmVyeSBpbnRlcmVzdGluZyBzcG90LiBXb3J0aCB0aGUgZWZmb3J0IVxuXG4zLiAgKipGb2N1c1N5bWJvbHM6KiogSSd2ZSBpZGVudGlmaWVkIHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgd2l0aGluIHRoaXMgYXJlYTogYG92c19jdF9nZXRfY29ubl9sYWJlbHNgLCBgb3ZzX2N0X3NldF9sYWJlbHNgLCBgb3ZzX2N0X2luaXRfbGFiZWxzYCwgYG92c19jdF9jb21taXRgLCBhbmQgYG92c19jdF9leGVjdXRlYC4gVGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEknbSBpbnRlcmVzdGVkIGluIGFzIHBvdGVudGlhbCB0YXJnZXRzIGZvciBmdXp6aW5nLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG40LiAgKipFbmFibGVDb25maWdzOioqIEFnYWluLCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYE9QRU5WU1dJVENIYCwgYE5GX0NPTk5UUkFDS2AsIGFuZCBgTkZfQ09OTlRSQUNLX0xBQkVMU2AuIEFic29sdXRlbHkgY29ycmVjdC5cblxuQWxyaWdodCwgZXZlcnl0aGluZyBsaW5lcyB1cCBwZXJmZWN0bHkuIE15IGFuYWx5c2lzIGlzIHNvbGlkLiBJJ20gZ29pbmcgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkwMDEsIk91dHB1dFRva2VucyI6MjA5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjUwLjIwMzYzMTM3NloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxOTM2MjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJPUEVOVlNXSVRDSFwiLFxuICAgIFwiTkZfQ09OTlRSQUNLXCIsXG4gICAgXCJORl9DT05OVFJBQ0tfTEFCRUxTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwib3ZzX2N0X2dldF9jb25uX2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X3NldF9sYWJlbHNcIixcbiAgICBcIm92c19jdF9pbml0X2xhYmVsc1wiLFxuICAgIFwib3ZzX2N0X2NvbW1pdFwiLFxuICAgIFwib3ZzX2N0X2V4ZWN1dGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKCkgaW4gbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIHRvIHByZXZlbnQgY2FsbGluZyBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpIHdoZW4gdGhlIGNvbm50cmFjayBlbnRyeSBpcyBhbHJlYWR5IGNvbmZpcm1lZC4gVGhpcyB0b3VjaGVzIHJlYWNoYWJsZSBjb3JlIG5ldHdvcmtpbmcgY29kZSByZWFjaGFibGUgdmlhIE9wZW4gdlN3aXRjaCBnZW5lcmljIG5ldGxpbmsgY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIGNvbm50cmFjayBhY3Rpb25zIGFuZCBsYWJlbHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcgYW5kIGFic2VuY2Ugb2YgcmVncmVzc2lvbnMgb3IgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMgd2hlbiBoYW5kbGluZyBjb25udHJhY2sgbGFiZWxzIG9uIGNvbmZpcm1lZCB2cyB1bmNvbmZpcm1lZCBjb25uZWN0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NTAuMjc1NTc4NTI1WiIsIlNlcSI6MzUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1OTk2MzcwMjI5MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDEzOjU5OjUwLjI3NjAwNjU0NVoiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjU5OTYzMjY4MDkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cXHUwMDNlZXh0YCB0aGF0IHRyaWdnZXJzIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYCBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy91c2UtYWZ0ZXItZnJlZSBvbiBzaGFyZWQgY29ubnRyYWNrIGV4dGVuc2lvbnMuXFxuXFxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWRiNjNkZjZhZGFhZWEzNDFkMzU4MTRiNTg1YTJiZDZiZGYxMmU3NlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDEyIDEzOjU4OjM0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG5pbmRleCAyNzExNTk2N2U1ZDkzLi4wZjQzMzY4OGUxN2I5IDEwMDY0NFxuLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXG4rKysgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcbkBAIC0zNjYsNyArMzY2LDcgQEAgc3RhdGljIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqb3ZzX2N0X2dldF9jb25uX2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QpXG4gXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsO1xuIFxuIFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XG4tXHRpZiAoIWNsKSB7XG4rXHRpZiAoIWNsIFx1MDAyNlx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xuIFx0XHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XG4gXHRcdGNsID0gbmZfY3RfbGFiZWxzX2ZpbmQoY3QpO1xuIFx0fVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTM6NTk6NTAuMjc2MDA3Mzk1WiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEzNDIxNDQxMTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQ29ubnRyYWNrIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuIFRoZSBjb3JlIG9mIGl0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IG1vZGlmaWVzIHRoZSBsb2dpYyBmb3IgcmV0cmlldmluZyBjb25uZWN0aW9uIGxhYmVscyAoYG5mX2Nvbm5fbGFiZWxzYCkgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyeSAoYG5mX2Nvbm5gKS5cblxuQ3VycmVudGx5LCB0aGUgY29kZSB0cmllcyB0byBmaW5kIGxhYmVscyB3aXRoIGBuZl9jdF9sYWJlbHNfZmluZChjdClgLiBJZiBpdCBkb2Vzbid0IGZpbmQgYW55LCBpdCBhZGRzIHRoZW0gd2l0aCBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpYCBhbmQgdGhlbiB0cmllcyB0byBmaW5kIHRoZW0gYWdhaW4uIE1ha2VzIHNlbnNlLCB0aGF0J3MgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uIHBhdHRlcm4uXG5cblRoZSBjcml0aWNhbCBjaGFuZ2UgaXMgdGhpcyBjb25kaXRpb25hbDogYGlmICghY2wgXHUwMDI2XHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKWAuIEJlZm9yZSwgdGhlIGNvZGUgd291bGQgYWRkIHRoZSBsYWJlbHMgaWYgYGNsYCB3YXMgTlVMTC4gTm93LCBpdCBhZGRzIGxhYmVscyAqb25seSogaWYgYGNsYCBpcyBOVUxMICphbmQqIHRoZSBjb25uZWN0aW9uIGlzICpub3QqIGNvbmZpcm1lZC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIGl0IHN1Z2dlc3RzIHRoZSBvcmlnaW5hbCBjb2RlIGNvdWxkIGJlIG5lZWRsZXNzbHkgYWRkaW5nIGxhYmVscyBmb3IgdW5jb25maXJtZWQgY29ubmVjdGlvbnMuXG5cbkkgaW1tZWRpYXRlbHkgd29uZGVyIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgaGVyZS4gQXJlIHRoZXJlIHBlcmZvcm1hbmNlIGltcGFjdHM/IElzIHRoaXMgYSBidWcgZml4LCBhbmQgYXJlIHdlIGluYWR2ZXJ0ZW50bHkgbWFraW5nIGEgY2hhbmdlIHRvIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHByb2Nlc3M/XG5cbkkgbmVlZCB0byBkaWcgaW50byB0aGUgYG5mX2N0X2lzX2NvbmZpcm1lZChjdClgIGZ1bmN0aW9uIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGFjdC4gVGhhdCBmdW5jdGlvbiBsaWtlbHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIHBhc3NlZCBhIGNlcnRhaW4gc3RhdGUgb3IgaXMgc3RpbGwgaW4gYSBwcmVsaW1pbmFyeSBzdGFnZS4gSWYgdGhpcyBwYXRjaCBpcyBjb3JyZWN0LCB0aGVuIGFkZGluZyBsYWJlbHMgdG8gdW5jb25maXJtZWQgY29ubmVjdGlvbnMgaXMgdW5uZWNlc3NhcnksIHBvdGVudGlhbGx5IHdhc3RlZnVsLCBvciBldmVuIGJ1Z2d5LlxuXG5NeSBuZXh0IHN0ZXAgaXMgZGVmaW5pdGVseSB0byByZXZpZXcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIHVuZGVyc3RhbmQgdGhlIHVzZSBjYXNlcyB3aGVyZSBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgaXMgY2FsbGVkLiBJdCdzIGFsc28gaW1wb3J0YW50IHRvIGFuYWx5emUgd2hhdCBwcm9ibGVtcyB0aGlzIGNoYW5nZSBpcyBzb2x2aW5nLCBhbmQgZW5zdXJlIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmVncmVzc2lvbnMsIGxpa2UsIGZvciBpbnN0YW5jZSwgYSBjaGFuZ2UgaW4gYmVoYXZpb3VyIHdpdGggaG93IHVuY29uZmlybWVkIGNvbm5lY3Rpb25zIGFyZSBoYW5kbGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDk4LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjU4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MDMuNjk3NDUyMjQzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NjIyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzU1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzU1OlxcdFxcdFxcdGtleS1cXHUwMDNlY3QubWFyayA9IG5ld19tYXJrO1xcbiAzNTY6XFx0XFx0fVxcbiAzNTc6XFx0XFxuIDM1ODpcXHRcXHRyZXR1cm4gMDtcXG4gMzU5OlxcdCNlbHNlXFxuIDM2MDpcXHRcXHRyZXR1cm4gLUVOT1RTVVBQO1xcbiAzNjE6XFx0I2VuZGlmXFxuIDM2MjpcXHR9XFxuIDM2MzpcXHRcXG4gMzY0OlxcdHN0YXRpYyBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm92c19jdF9nZXRfY29ubl9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbiAzNjU6XFx0e1xcbiAzNjY6XFx0XFx0c3RydWN0IG5mX2Nvbm5fbGFiZWxzICpjbDtcXG4gMzY3OlxcdFxcbiAzNjg6XFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuIDM2OTpcXHRcXHRpZiAoIWNsIFxcdTAwMjZcXHUwMDI2ICFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuIDM3MDpcXHRcXHRcXHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XFxuIDM3MTpcXHRcXHRcXHRjbCA9IG5mX2N0X2xhYmVsc19maW5kKGN0KTtcXG4gMzcyOlxcdFxcdH1cXG4gMzczOlxcdFxcbiAzNzQ6XFx0XFx0cmV0dXJuIGNsO1xcbiAzNzU6XFx0fVxcbiAzNzY6XFx0XFxuIDM3NzpcXHQvKiBJbml0aWFsaXplIGxhYmVscyBmb3IgYSBuZXcsIHlldCB0byBiZSBjb21taXR0ZWQgY29ubnRyYWNrIGVudHJ5LiAgTm90ZSB0aGF0XFxuIDM3ODpcXHQgKiBzaW5jZSB0aGUgbmV3IGNvbm5lY3Rpb24gaXMgbm90IHlldCBjb25maXJtZWQsIGFuZCB0aHVzIG5vLW9uZSBlbHNlIGhhc1xcbiAzNzk6XFx0ICogYWNjZXNzIHRvIGl0J3MgbGFiZWxzLCB3ZSBzaW1wbHkgd3JpdGUgdGhlbSBvdmVyLlxcbiAzODA6XFx0ICovXFxuIDM4MTpcXHRzdGF0aWMgaW50IG92c19jdF9pbml0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbiAzODI6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXFxuIDM4MzpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKm1hc2spXFxuIDM4NDpcXHR7XFxuIDM4NTpcXHRcXHRzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKmNsLCAqbWFzdGVyX2NsO1xcbiAzODY6XFx0XFx0Ym9vbCBoYXZlX21hc2sgPSBsYWJlbHNfbm9uemVybyhtYXNrKTtcXG4gMzg3OlxcdFxcbiAzODg6XFx0XFx0LyogSW5oZXJpdCBtYXN0ZXIncyBsYWJlbHMgdG8gdGhlIHJlbGF0ZWQgY29ubmVjdGlvbj8gKi9cXG4gMzg5OlxcdFxcdG1hc3Rlcl9jbCA9IGN0LVxcdTAwM2VtYXN0ZXIgPyBuZl9jdF9sYWJlbHNfZmluZChjdC1cXHUwMDNlbWFzdGVyKSA6IE5VTEw7XFxuIDM5MDpcXHRcXG4gMzkxOlxcdFxcdGlmICghbWFzdGVyX2NsIFxcdTAwMjZcXHUwMDI2ICFoYXZlX21hc2spXFxuIDM5MjpcXHRcXHRcXHRyZXR1cm4gMDsgICAvKiBOb3RoaW5nIHRvIGRvLiAqL1xcbiAzOTM6XFx0XFxuIDM5NDpcXHRcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbiAzOTU6XFx0XFx0aWYgKCFjbClcXG4gMzk2OlxcdFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHQvKiBJbmhlcml0IHRoZSBtYXN0ZXIncyBsYWJlbHMsIGlmIGFueS4gKi9cXG4gMzk5OlxcdFxcdGlmIChtYXN0ZXJfY2wpXFxuIDQwMDpcXHRcXHRcXHQqY2wgPSAqbWFzdGVyX2NsO1xcbiA0MDE6XFx0XFxuIDQwMjpcXHRcXHRpZiAoaGF2ZV9tYXNrKSB7XFxuIDQwMzpcXHRcXHRcXHR1MzIgKmRzdCA9ICh1MzIgKiljbC1cXHUwMDNlYml0cztcXG4gNDA0OlxcdFxcdFxcdGludCBpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDowMy42OTc2MDA0NjNaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjEyMzE5OTU1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBgbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jYCBmaWxlLiBUaGlzIHRlbGxzIG1lIEknbSBsaWtlbHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbiwgZmlndXJlIG91dCB3aGljaCBwYXJ0cyBvZiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzIGFyZSB1c2luZyB0aGUgY29ubmVjdGlvbiBsYWJlbHMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIGZpbmQgdGhlIGxvY2F0aW9ucyB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyB3aWxsIGdpdmUgbWUgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBpdHMgc2lnbmlmaWNhbmNlIGFuZCB0aGUgZGF0YSBmbG93IGluIHRoYXQgcGFydCBvZiB0aGUgY29kZS4gSSdsbCBuZWVkIHRvIHVzZSBlaXRoZXIgc3RhdGljIGFuYWx5c2lzIHRvb2xzIG9yIHNpbXBseSBuYXZpZ2F0ZSB0aGUgc291cmNlIGNvZGUgbG9va2luZyBmb3IgYWxsIHRoZSBjYWxscyB0byBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AuIE9uY2UgSSBoYXZlIGEgbGlzdCBvZiBhbGwgY2FsbHMsIEkgY2FuIHRoZW4gdW5kZXJzdGFuZCB3aHkgYW5kIHdoZW4gdGhlIGxhYmVscyBhcmUgYmVpbmcgcXVlcmllZC4gVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCBpbiBkaWdnaW5nIGRlZXBlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUzOCwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MDUuODIwODAyNzRaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODk1ODk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9nZXRfY29ubl9sYWJlbHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zNDQ9c3RhdGljIGludCBvdnNfY3Rfc2V0X21hcmsoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM2NDpzdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMzY1LXtcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz0zODE9c3RhdGljIGludCBvdnNfY3RfaW5pdF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTMtXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjM5NDpcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zOTUtXFx0aWYgKCFjbClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz00MjI9c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQyOC1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM6NDI5OlxcdGNsID0gb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdCk7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jLTQzMC1cXHRpZiAoIWNsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDowNS44NjY3MTEyNDlaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjIwODQzMzY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKkRpdmluZyBpbnRvIENvbm5lY3Rpb24gVHJhY2tpbmcgTGFiZWxzIGluIE9WUyBhbmQgTmV0ZmlsdGVyKipcblxuUmlnaHQsIHNvIEknbSBsb29raW5nIGF0IGBvdnNfY3Rfc2V0X2xhYmVsc2AgYW5kIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYW5kIGltbWVkaWF0ZWx5IG15IGV4cGVydCBtaW5kIGp1bXBzIHRvIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIE9wZW4gdlN3aXRjaCBhbmQgdGhlIE5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHN5c3RlbS4gVGhlc2UgZnVuY3Rpb24gbmFtZXMgdGhlbXNlbHZlcyBoaW50IGF0IGxhYmVsIG1hbmlwdWxhdGlvbiBhbmQgZXh0ZW5zaW9uLCB3aGljaCBpcyBzdGFuZGFyZCBpbiBhbnkgcm9idXN0IGNvbm5lY3Rpb24gdHJhY2tpbmcgaW1wbGVtZW50YXRpb24uIFRoZSBjb3JlIHF1ZXN0aW9uLCBhcyBhbHdheXMsIGlzICp3aHkqIHRoYXQgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCBjaGVjaz8gV2hhdOKAmXMgdGhlIGNvbnRleHQgaXQncyBwcm90ZWN0aW5nLCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgd2UgbWFraW5nIGFib3V0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlPyBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRoYXQgdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIGNvbm5lY3Rpb24ncyBsaWZlY3ljbGUgc3RhdGUuICpDb25maXJtZWQqIHN1Z2dlc3RzIGEgdHJhbnNpdGlvbiBwb2ludCwgYSB2YWxpZGF0aW9uIG9mIHRoZSB0cmFja2luZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBiZWZvcmUgaXQncyBkZWVtZWQgc3RhYmxlIG9yIHNhZmUgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLiBJIHdhbnQgdG8ga25vdyB3aGVuIHdlIGFyZSBhZGRpbmcgdGhlIGxhYmVscywgaWYgdGhleSBhcmUgYWRkZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIGNvbmZpcm1lZCwgYW5kIHdoeSB0aGF0IGlzIGRlc2lyZWQgb3Igbm90LiBBcmUgd2UgcG90ZW50aWFsbHkgYXZvaWRpbmcgcmFjZSBjb25kaXRpb25zIG9yIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3RzIHdpdGggaW1tYXR1cmUgY29ubmVjdGlvbiBlbnRyaWVzPyBMZXQncyB0cmFjZSBiYWNrIGZyb20gaGVyZSwgc2VlIGhvdyBpdCdzIGhhbmRsZWQgaW4gdGhlIE9WUyBjb2RlLCBhbmQgd2hhdCB0aGUgZXF1aXZhbGVudCBOZXRmaWx0ZXIgY29udGV4dCBzdWdnZXN0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDIxMCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjEyLjA3NTE0ODc1MVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQ4MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQyMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQyMDpcXHR9XFxuIDQyMTpcXHRcXG4gNDIyOlxcdHN0YXRpYyBpbnQgb3ZzX2N0X3NldF9sYWJlbHMoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gNDIzOlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG92c19rZXlfY3RfbGFiZWxzICpsYWJlbHMsXFxuIDQyNDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2N0X2xhYmVscyAqbWFzaylcXG4gNDI1OlxcdHtcXG4gNDI2OlxcdFxcdHN0cnVjdCBuZl9jb25uX2xhYmVscyAqY2w7XFxuIDQyNzpcXHRcXHRpbnQgZXJyO1xcbiA0Mjg6XFx0XFxuIDQyOTpcXHRcXHRjbCA9IG92c19jdF9nZXRfY29ubl9sYWJlbHMoY3QpO1xcbiA0MzA6XFx0XFx0aWYgKCFjbClcXG4gNDMxOlxcdFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbiA0MzI6XFx0XFxuIDQzMzpcXHRcXHRlcnIgPSBuZl9jb25ubGFiZWxzX3JlcGxhY2UoY3QsIGxhYmVscy1cXHUwMDNlY3RfbGFiZWxzXzMyLFxcbiA0MzQ6XFx0XFx0XFx0XFx0XFx0ICAgIG1hc2stXFx1MDAzZWN0X2xhYmVsc18zMixcXG4gNDM1OlxcdFxcdFxcdFxcdFxcdCAgICBPVlNfQ1RfTEFCRUxTX0xFTl8zMik7XFxuIDQzNjpcXHRcXHRpZiAoZXJyKVxcbiA0Mzc6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gNDM4OlxcdFxcbiA0Mzk6XFx0XFx0bWVtY3B5KFxcdTAwMjZrZXktXFx1MDAzZWN0LmxhYmVscywgY2wtXFx1MDAzZWJpdHMsIE9WU19DVF9MQUJFTFNfTEVOKTtcXG4gNDQwOlxcdFxcbiA0NDE6XFx0XFx0cmV0dXJuIDA7XFxuIDQ0MjpcXHR9XFxuIDQ0MzpcXHRcXG4gNDQ0OlxcdHN0YXRpYyBpbnQgb3ZzX2N0X2hhbmRsZV9mcmFnbWVudHMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gNDQ1OlxcdFxcdFxcdFxcdFxcdCAgIHUxNiB6b25lLCBpbnQgZmFtaWx5LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbiA0NDY6XFx0e1xcbiA0NDc6XFx0XFx0c3RydWN0IG92c19za2JfY2Igb3ZzX2NiID0gKk9WU19DQihza2IpO1xcbiA0NDg6XFx0XFx0aW50IGVycjtcXG4gNDQ5OlxcdFxcbiA0NTA6XFx0XFx0ZXJyID0gbmZfY3RfaGFuZGxlX2ZyYWdtZW50cyhuZXQsIHNrYiwgem9uZSwgZmFtaWx5LCBcXHUwMDI2a2V5LVxcdTAwM2VpcC5wcm90bywgXFx1MDAyNm92c19jYi5tcnUpO1xcbiA0NTE6XFx0XFx0aWYgKGVycilcXG4gNDUyOlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQ1MzpcXHRcXG4gNDU0OlxcdFxcdC8qIFRoZSBrZXkgZXh0cmFjdGVkIGZyb20gdGhlIGZyYWdtZW50IHRoYXQgY29tcGxldGVkIHRoaXMgZGF0YWdyYW1cXG4gNDU1OlxcdFxcdCAqIGxpa2VseSBkaWRuJ3QgaGF2ZSBhbiBMNCBoZWFkZXIsIHNvIHJlZ2VuZXJhdGUgaXQuXFxuIDQ1NjpcXHRcXHQgKi9cXG4gNDU3OlxcdFxcdG92c19mbG93X2tleV91cGRhdGVfbDNsNChza2IsIGtleSk7XFxuIDQ1ODpcXHRcXHRrZXktXFx1MDAzZWlwLmZyYWcgPSBPVlNfRlJBR19UWVBFX05PTkU7XFxuIDQ1OTpcXHRcXHQqT1ZTX0NCKHNrYikgPSBvdnNfY2I7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjEyLjA3NTI3NTMzMVoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxODkzNjc4NzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipQZWVyaW5nIGludG8gdGhlIG5ldGZpbHRlciB3ZWVkcyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGZ1bmN0aW9uIGlzIGRvaW5nLiBUaW1lIHRvIGhpdCB0aGUgZ2l0IGxvZyBhbmQgc2VlIGlmIEkgY2FuIGZpbmQgc29tZSBjb21taXQgaGlzdG9yeS4gU2VhcmNoaW5nIGZvciBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIHNwZWNpZmljYWxseSBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIHNob3VsZCBwcm9iYWJseSBicm9hZGVuIHRoZSBzZWFyY2ggYSBsaXR0bGUgdG8gaW5jbHVkZSByZWxhdGVkIHRlcm1zIG9yIHZhcmlhdGlvbnMgb24gdGhlIGZ1bmN0aW9uIG5hbWUuIEEgZGVlcGVyIGRpdmUgaW50byB0aGUgY29tbWl0IG1lc3NhZ2VzIGFuZCBhbnkgcmVsYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgaG9wZWZ1bGx5IGlsbHVtaW5hdGUgdGhlIHJvbGUgdGhpcyBmdW5jdGlvbiBwbGF5cyBpbiB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBwcm9jZXNzLiBVbmRlcnN0YW5kaW5nIHRoZSBjb250ZXh0IGFuZCBpbnRlbnQgYmVoaW5kIGl0cyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGtleSB0byBncmFzcGluZyBpdHMgcHVycG9zZSB3aXRoaW4gdGhlIGxhcmdlciBuZXRmaWx0ZXIgZnJhbWV3b3JrLiBMZXQncyBzZWUgd2hhdCB0aGUgc291cmNlIGNvZGUgcmV2ZWFscyFcblxuXG4iLCJJbnB1dFRva2VucyI6NTIxMiwiT3V0cHV0VG9rZW5zIjoyMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MTMuOTY4OTU3MjUyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDk3NzM5MjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5mX2N0X2xhYmVsc19leHRfYWRkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmg9MjM9c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdClcXG4tLVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzYtXFxuaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sYWJlbHMuaDozNzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2xhYmVscyAqbmZfY3RfbGFiZWxzX2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbmluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmgtMzgte1xcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jPTE3NTQ9aW5pdF9jb25udHJhY2soc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfY29ubiAqdG1wbCxcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYy0xNzkyLVxcdG5mX2N0X3RzdGFtcF9leHRfYWRkKGN0LCBHRlBfQVRPTUlDKTtcXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmM6MTc5MzpcXHRuZl9jdF9sYWJlbHNfZXh0X2FkZChjdCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jLTE3OTQtXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmM9MjIyND1jdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMtMjMwNC1cXHRuZl9jdF9lY2FjaGVfZXh0X2FkZChjdCwgMCwgMCwgR0ZQX0FUT01JQyk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jOjIzMDU6XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYy0yMzA2LVxcdG5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpO1xcbi0tXFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jPTM2ND1zdGF0aWMgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdClcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNjktXFx0aWYgKCFjbCBcXHUwMDI2XFx1MDAyNiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzozNzA6XFx0XFx0bmZfY3RfbGFiZWxzX2V4dF9hZGQoY3QpO1xcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy0zNzEtXFx0XFx0Y2wgPSBuZl9jdF9sYWJlbHNfZmluZChjdCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjE1LjQ2NjcwNDExOFoiLCJTZXEiOjQ1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDkwMTUxNzI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBjb25udHJhY2sgbGFiZWxzKipcblxuQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgYGluY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmhgIGhlYWRlci4gU2VlbXMgbGlrZSBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNvbm50cmFjayBsYWJlbCBkZWZpbml0aW9ucy4gVGhpcyBmaWxlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgdW5kZXJzdGFuZGluZyBob3cgY29ubmVjdGlvbiB0cmFja2luZyB1c2VzIGxhYmVscywgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gc2hhcnAgb24gd2hhdCdzIGRlZmluZWQuIEFsd2F5cyBiZXR0ZXIgdG8gcmV2aWV3IHRoZSBmb3VuZGF0aW9uYWwgcGllY2VzIGJlZm9yZSB0YWNrbGluZyBhbnl0aGluZyBtb3JlIGNvbXBsZXggcmVsYXRlZCB0byBjb25uZWN0aW9uIHRyYWNraW5nIG9yIGl0cyBhc3NvY2lhdGVkIE5ldGZpbHRlciBtb2R1bGVzLiBJIGtub3cgdGhlIGdlbmVyYWwgaWRlYSwgYnV0IHNwZWNpZmljcyBhcmUgaW1wb3J0YW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggYml0ZmllbGRzIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMgd2l0aGluIGEga2VybmVsIGNvbnRleHQuIExldCdzIHNlZSB3aGF0J3Mgd2hhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjAxNSwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjE3LjU1Njg1ODM4NVoiLCJTZXEiOjQ2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MDAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2xhYmVscy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDIwOlxcdC8qIENhbid0IHVzZSBuZl9jdF9leHRfZmluZCgpLCBmbG93IGRpc3NlY3RvciBjYW5ub3QgdXNlIHN5bWJvbHNcXG4gIDIxOlxcdCAqIGV4cG9ydGVkIGJ5IG5mX2Nvbm50cmFjayBtb2R1bGUuXFxuICAyMjpcXHQgKi9cXG4gIDIzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5fbGFiZWxzICpuZl9jdF9sYWJlbHNfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpXFxuICAyNDpcXHR7XFxuICAyNTpcXHQjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFNcXG4gIDI2OlxcdFxcdHN0cnVjdCBuZl9jdF9leHQgKmV4dCA9IGN0LVxcdTAwM2VleHQ7XFxuICAyNzpcXHRcXG4gIDI4OlxcdFxcdGlmICghZXh0IHx8ICFfX25mX2N0X2V4dF9leGlzdChleHQsIE5GX0NUX0VYVF9MQUJFTFMpKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzMDpcXHRcXG4gIDMxOlxcdFxcdHJldHVybiAodm9pZCAqKWN0LVxcdTAwM2VleHQgKyBjdC1cXHUwMDNlZXh0LVxcdTAwM2VvZmZzZXRbTkZfQ1RfRVhUX0xBQkVMU107XFxuICAzMjpcXHQjZWxzZVxcbiAgMzM6XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzNDpcXHQjZW5kaWZcXG4gIDM1OlxcdH1cXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubl9sYWJlbHMgKm5mX2N0X2xhYmVsc19leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdClcXG4gIDM4OlxcdHtcXG4gIDM5OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNDA6XFx0XFx0c3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTtcXG4gIDQxOlxcdFxcbiAgNDI6XFx0XFx0aWYgKGF0b21pY19yZWFkKFxcdTAwMjZuZXQtXFx1MDAzZWN0LmxhYmVsc191c2VkKSA9PSAwKVxcbiAgNDM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA0NDpcXHRcXG4gIDQ1OlxcdFxcdHJldHVybiBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTEFCRUxTLCBHRlBfQVRPTUlDKTtcXG4gIDQ2OlxcdCNlbHNlXFxuICA0NzpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDQ4OlxcdCNlbmRpZlxcbiAgNDk6XFx0fVxcbiAgNTA6XFx0XFxuICA1MTpcXHRpbnQgbmZfY29ubmxhYmVsc19yZXBsYWNlKHN0cnVjdCBuZl9jb25uICpjdCxcXG4gIDUyOlxcdFxcdFxcdFxcdCAgY29uc3QgdTMyICpkYXRhLCBjb25zdCB1MzIgKm1hc2ssIHVuc2lnbmVkIGludCB3b3Jkcyk7XFxuICA1MzpcXHRcXG4gIDU0OlxcdCNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMU1xcbiAgNTU6XFx0aW50IG5mX2Nvbm5sYWJlbHNfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGJpdCk7XFxuICA1NjpcXHR2b2lkIG5mX2Nvbm5sYWJlbHNfcHV0KHN0cnVjdCBuZXQgKm5ldCk7XFxuICA1NzpcXHQjZWxzZVxcbiAgNTg6XFx0c3RhdGljIGlubGluZSBpbnQgbmZfY29ubmxhYmVsc19nZXQoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgYml0KSB7IHJldHVybiAwOyB9XFxuICA1OTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubmxhYmVsc19wdXQoc3RydWN0IG5ldCAqbmV0KSB7fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoxNy41NTY5MzAyNTVaIiwiU2VxIjo0NywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY0ODY2NjIzOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYG5mX2N0X2V4dF9hZGRgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYG5mX2N0X2V4dF9hZGRgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSB3aXRoaW4gdGhlIE5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIGZyYW1ld29yay4gTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgaXQncyByZXNwb25zaWJsZSBmb3IgKmFkZGluZyogc29tZSBmb3JtIG9mIGV4dGVuc2lvbiBkYXRhIG9yIG1ldGFkYXRhIHRvIGEgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyeSwgYnV0IHRoZSBzcGVjaWZpY3MgYXJlIGNydWNpYWwuIEknbGwgbmVlZCB0byBsb29rIGF0IGl0cyBhcmd1bWVudHM6IHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgYWNjZXB0IGFzIGlucHV0LCBhbmQgd2hhdCBkb2VzIGl0IG1vZGlmeSBvciBhbGxvY2F0ZSB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cnk/IEknbGwgcHJvYmFibHkgYmUgaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBpbnRlcmFjdHMgd2l0aCB0aGUgYHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVgIGFuZCBwb3RlbnRpYWxseSB0aGUgYXNzb2NpYXRlZCBgc3RydWN0IG5mX2Nvbm5gIG9yIGBzdHJ1Y3QgbmZfY29ubl9oZWxwYCBzdHJ1Y3R1cmVzLlxuXG5JJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIHRoaW5ncyBsaWtlIGFkZGluZyBsYXllciA3IHByb3RvY29sIGlkZW50aWZpY2F0aW9uLCBzZXNzaW9uIGF0dHJpYnV0ZXMgZm9yIHN0YXRlZnVsIGZpcmV3YWxscywgb3Igb3RoZXIgYXBwbGljYXRpb24tbGF5ZXIgbWV0YWRhdGEuIFBlcmhhcHMgaXQgZGVhbHMgd2l0aCBJUHNlYyBzZWN1cml0eSBhc3NvY2lhdGlvbnMgKFNBcykgb3Igb3RoZXIgY29udGV4dC1zcGVjaWZpYyBkZXRhaWxzLiBNeSBjb25jZXJuIGlzIHRoZSBsb2NraW5nIHNjaGVtZSB1c2VkIGFuZCB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIHRyeSB0byBtb2RpZnkgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHNpbXVsdGFuZW91c2x5LiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBhbmQgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBBZGRpdGlvbmFsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBvdGhlciBjb25uZWN0aW9uIHRyYWNraW5nIGZ1bmN0aW9ucywgc3BlY2lmaWNhbGx5IGl0cyBjYWxsIGdyYXBoIHdpdGhpbiB0aGUgTmV0ZmlsdGVyIHN1YnN5c3RlbS4gSXMgdGhpcyBjYWxsZWQgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseT8gRG9lcyBpdCBibG9jaz8gQWxsIGltcG9ydGFudCBxdWVzdGlvbnMgdG8gZnVsbHkgZ3Jhc3AgaXRzIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Njg1NCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MjAuMjA1NTk5MjIzWiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODgzMDY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZl9jdF9leHRfYWRkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRmaWx0ZXIvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jPTMxOT1ib29sIG5mX2N0X2VjYWNoZV9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgdTE2IGN0bWFzaywgdTE2IGV4cG1hc2ssIGdmcF90IGdmcClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jLTM0NS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYzozNDY6XFx0ZSA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9FQ0FDSEUsIGdmcCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMtMzQ3LVxcdGlmIChlKSB7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYz01Nz1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCB0b3RhbF9leHRlbnNpb25fc2l6ZSh2b2lkKVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtODktXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmM6OTA6dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtOTEte1xcbi0tXFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMtMTI4LX1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYzoxMjk6RVhQT1JUX1NZTUJPTChuZl9jdF9leHRfYWRkKTtcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jPTE4Mz1uZl9jdF9oZWxwZXJfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGdmcF90IGdmcClcXG4tLVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jLTE4Ni1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYzoxODc6XFx0aGVscCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9IRUxQRVIsIGdmcCk7XFxubmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMtMTg4LVxcdGlmIChoZWxwKSB7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmM9NDM0PWNvbm50cmFja19wcHRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsXFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMtNDU4LVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYzo0NTk6XFx0XFx0aWYgKCFuYXQgXFx1MDAyNlxcdTAwMjYgIW5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9OQVQsIEdGUF9BVE9NSUMpKVxcbm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYy00NjAtXFx0XFx0XFx0cmV0dXJuIE5GX0RST1A7XFxuLS1cXG5uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmM9NzQ1PXN0cnVjdCBuZl9jb25uX25hdCAqbmZfY3RfbmF0X2V4dF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0KVxcbi0tXFxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jLTc1MS1cXHRpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpXFxubmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jOjc1MjpcXHRcXHRuYXQgPSBuZl9jdF9leHRfYWRkKGN0LCBORl9DVF9FWFRfTkFULCBHRlBfQVRPTUlDKTtcXG5uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMtNzUzLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoyMC4yNTQ0MzQ5MzNaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE3NzkyNzg0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aGlua2luZywgZXhwcmVzc2VkIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIGBuZl9jb25udHJhY2tfZXh0ZW5kLmNgIChMaW5lcyA5MC0xMjgpKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4gSSdtIGZvY3VzaW5nIG9uIGBuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuY2AsIHNwZWNpZmljYWxseSBsaW5lcyA5MCB0aHJvdWdoIDEyOC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBoZXJlIHdpdGhpbiB0aGUgY29ubnRyYWNrIGV4dGVuc2lvbiBmcmFtZXdvcmsuIEknbSBndWVzc2luZyB0aGlzIHNlY3Rpb24gbGlrZWx5IGRlYWxzIHdpdGggdGhlIGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgb3IgbWFuYWdlbWVudCBvZiBjb25udHJhY2sgZXh0ZW5zaW9uIGRhdGEgc3RydWN0dXJlcy4gR2l2ZW4gdGhlIGNvbnRleHQsIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZXh0ZW5kaW5nIHRoZSBjb3JlIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBhZGRpdGlvbmFsIHN0YXRlIG9yIG1ldGFkYXRhLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IHBhcnNlIHRoZSBjb2RlIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGZsb3csIGFueSBsb2NraW5nIG1lY2hhbmlzbXMgdXNlZCwgbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSSdtIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgdG8gYGttYWxsb2NgLCBga2ZyZWVgLCBvciBzaW1pbGFyIG1lbW9yeSBmdW5jdGlvbnMsIGFuZCBsaWtlbHkgcmVmZXJlbmNlcyB0byB0aGUgYG5mX2Nvbm5gIHN0cnVjdHVyZSBhbmQgcG90ZW50aWFsIGludGVyYWN0aW9uIHdpdGggY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIgbW9kdWxlcyBvciBOQVQgc3Vic3lzdGVtcy4gVGhlIGdvYWwgaXMgdG8gZ3Jhc3AgaG93IHRoZXNlIGV4dGVuc2lvbnMgYXJlIGludGVncmF0ZWQgaW50byB0aGUgY29ubnRyYWNrIGNvcmUuIExldCdzIHN0YXJ0IHJlYWRpbmcgYW5kIHNlZSB3aGF0IGluc2lnaHRzIHRoaXMgc2VjdGlvbiByZXZlYWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTg4LCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6MjIuNDMyMzY0Njc4WiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDg1LFxuICBcIkxpbmVDb3VudFwiOiA0NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDg1OlxcdFxcdFxcdCsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX2FjdF9jdF9leHQpXFxuICA4NjpcXHQjZW5kaWZcXG4gIDg3OlxcdFxcdDtcXG4gIDg4OlxcdH1cXG4gIDg5OlxcdFxcbiAgOTA6XFx0dm9pZCAqbmZfY3RfZXh0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gbmZfY3RfZXh0X2lkIGlkLCBnZnBfdCBnZnApXFxuICA5MTpcXHR7XFxuICA5MjpcXHRcXHR1bnNpZ25lZCBpbnQgbmV3bGVuLCBuZXdvZmYsIG9sZGxlbiwgYWxsb2M7XFxuICA5MzpcXHRcXHRzdHJ1Y3QgbmZfY3RfZXh0ICpuZXc7XFxuICA5NDpcXHRcXG4gIDk1OlxcdFxcdC8qIENvbm50cmFjayBtdXN0IG5vdCBiZSBjb25maXJtZWQgdG8gYXZvaWQgcmFjZXMgb24gcmVhbGxvY2F0aW9uLiAqL1xcbiAgOTY6XFx0XFx0V0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKTtcXG4gIDk3OlxcdFxcbiAgOTg6XFx0XFx0Lyogc3RydWN0IG5mX2N0X2V4dCB1c2VzIHU4IHRvIHN0b3JlIG9mZnNldHMvc2l6ZSAqL1xcbiAgOTk6XFx0XFx0QlVJTERfQlVHX09OKHRvdGFsX2V4dGVuc2lvbl9zaXplKCkgXFx1MDAzZSAyNTV1KTtcXG4gMTAwOlxcdFxcbiAxMDE6XFx0XFx0aWYgKGN0LVxcdTAwM2VleHQpIHtcXG4gMTAyOlxcdFxcdFxcdGNvbnN0IHN0cnVjdCBuZl9jdF9leHQgKm9sZCA9IGN0LVxcdTAwM2VleHQ7XFxuIDEwMzpcXHRcXG4gMTA0OlxcdFxcdFxcdGlmIChfX25mX2N0X2V4dF9leGlzdChvbGQsIGlkKSlcXG4gMTA1OlxcdFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxMDY6XFx0XFx0XFx0b2xkbGVuID0gb2xkLVxcdTAwM2VsZW47XFxuIDEwNzpcXHRcXHR9IGVsc2Uge1xcbiAxMDg6XFx0XFx0XFx0b2xkbGVuID0gc2l6ZW9mKCpuZXcpO1xcbiAxMDk6XFx0XFx0fVxcbiAxMTA6XFx0XFxuIDExMTpcXHRcXHRuZXdvZmYgPSBBTElHTihvbGRsZW4sIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jdF9leHQpKTtcXG4gMTEyOlxcdFxcdG5ld2xlbiA9IG5ld29mZiArIG5mX2N0X2V4dF90eXBlX2xlbltpZF07XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdGFsbG9jID0gbWF4KG5ld2xlbiwgTkZfQ1RfRVhUX1BSRUFMTE9DKTtcXG4gMTE1OlxcdFxcdG5ldyA9IGtyZWFsbG9jKGN0LVxcdTAwM2VleHQsIGFsbG9jLCBnZnApO1xcbiAxMTY6XFx0XFx0aWYgKCFuZXcpXFxuIDExNzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTE4OlxcdFxcbiAxMTk6XFx0XFx0aWYgKCFjdC1cXHUwMDNlZXh0KVxcbiAxMjA6XFx0XFx0XFx0bWVtc2V0KG5ldy1cXHUwMDNlb2Zmc2V0LCAwLCBzaXplb2YobmV3LVxcdTAwM2VvZmZzZXQpKTtcXG4gMTIxOlxcdFxcbiAxMjI6XFx0XFx0bmV3LVxcdTAwM2VvZmZzZXRbaWRdID0gbmV3b2ZmO1xcbiAxMjM6XFx0XFx0bmV3LVxcdTAwM2VsZW4gPSBuZXdsZW47XFxuIDEyNDpcXHRcXHRtZW1zZXQoKHZvaWQgKiluZXcgKyBuZXdvZmYsIDAsIG5ld2xlbiAtIG5ld29mZik7XFxuIDEyNTpcXHRcXG4gMTI2OlxcdFxcdGN0LVxcdTAwM2VleHQgPSBuZXc7XFxuIDEyNzpcXHRcXHRyZXR1cm4gKHZvaWQgKiluZXcgKyBuZXdvZmY7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRFWFBPUlRfU1lNQk9MKG5mX2N0X2V4dF9hZGQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDoyMi40MzI0MzM0ODhaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTI5NjQzNjg5OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDb25udHJhY2sgRXh0ZW5zaW9uIGFuZCBPcGVuIHZTd2l0Y2ggSW50ZWdyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIExpbmUgOTYgaW4gYG5mX2N0X2V4dF9hZGRgIGlzIHRoZSBrZXk6IGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYC4gIFRoYXQncyBiZWNhdXNlIGEgY29uZmlybWVkIGNvbm50cmFjayBlbnRyeSAoYGN0YCkgbWVhbnMgb3RoZXIgQ1BVcyAqY291bGQqIGJlIGFjY2Vzc2luZyBgY3QtXHUwMDNlZXh0YCBjb25jdXJyZW50bHkuICBUaGVuLCB0aGUgYGtyZWFsbG9jKGN0LVx1MDAzZWV4dCwgYWxsb2MsIGdmcClgIGluIHRoZSBzYW1lIGZ1bmN0aW9uIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiwgbGVhZGluZyB0byB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBgV0FSTl9PTmAgc3BsYXQgaWYgaXQgKmlzKiBjb25maXJtZWQgYW5kIHJlYWxsb2NhdGVkIGNvbmN1cnJlbnRseS5cblxuTm93LCBsb29raW5nIGF0IGBuZl9uYXRfY29yZS5jYCwgdGhlIGxvZ2ljIGluIGBuZl9jdF9uYXRfZXh0X2FkZGAgaXMgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzOiBpdCBjaGVja3MgYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCAqYmVmb3JlKiBjYWxsaW5nIGBuZl9jdF9leHRfYWRkYC4gVGhpcyBpcyBnb29kIHByYWN0aWNlLiBCdXQsIGNhbGxpbmcgYG5mX2N0X2xhYmVsc19leHRfYWRkKGN0KWAgd2hpY2ggKml0c2VsZiogY2FsbHMgYG5mX2N0X2V4dF9hZGRgIHdoZW4gdGhlIGVudHJ5ICppcyogY29uZmlybWVkIHRyaWdnZXJzIHRoZSBgV0FSTl9PTmAgYW5kIGludHJvZHVjZXMgYSByYWNlL1VBRiBzY2VuYXJpbyFcblxuTGV0J3MgbG9vayBhdCB0aGUgcGF0Y2ggdG8gYG5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY2AuLi4gYWgsIGhlcmUgd2UgZ28uIFRoZSBmaXggaXMgdG8gYWRkIGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgdG8gdGhlIGBpZiAoIWNsKWAgY29uZGl0aW9uIGluIGBvdnNfY3RfZ2V0X2Nvbm5fbGFiZWxzYC4gVGhpcyAqc2hvdWxkKiBwcmV2ZW50IHRoZSBwcm9ibGVtYXRpYyBgbmZfY3RfbGFiZWxzX2V4dF9hZGRgIGZyb20gYmVpbmcgY2FsbGVkIHdoZW4gYGN0YCBpcyBjb25maXJtZWQsIHJpZ2h0P1xuXG5CdXQsIGxldCdzIGZvbGxvdyB0aGUgY29udHJvbCBmbG93OiBJZiBgY2xgICppcyogTlVMTCAoYW5kIGBuZl9jdF9pc19jb25maXJtZWQoY3QpYCBpcyBmYWxzZSksIHRoZSBgb3ZzX2N0X2luaXRfbGFiZWxzYCBmdW5jdGlvbiBjYWxscyBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLCBjaGVja3MgZm9yIE5VTEwsIGFuZCByZXR1cm5zIGAtRU5PU1BDYCBpZiBubyBgY2xgISBUaGUgY29tbWVudCBpbiBgb3ZzX2N0X2luaXRfbGFiZWxzYCBtYWtlcyBpdCBzb3VuZCBsaWtlIGxhYmVscyBhcmUgb25seSBpbml0aWFsaXplZCBvbiBhIG5ldywgdW5jb25maXJtZWQgZW50cnksIHRoYXQgaGFzbid0IGJlZW4gY29tbWl0dGVkLCBzbyBubyBjb25jdXJyZW50IGFjY2VzcyBpcyBpbnZvbHZlZC5cblxuSW4gYG92c19jdF9zZXRfbGFiZWxzYCwgd2UgYWdhaW4gY2FsbCBgb3ZzX2N0X2dldF9jb25uX2xhYmVscyhjdClgLiAgSWYgaXQgcmV0dXJucyBOVUxMLCB3ZSBhZ2FpbiBnZXQgYC1FTk9TUENgLiBBaGEhIFRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIG5vdyB0aGF0IHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkIGFuZCB0aGUgZXh0ZW5zaW9uIHdhc24ndCBhdHRhY2hlZC4gVGhlbiBgY2xgIGlzIE5VTEwuIFRoZW4gYG92c19jdF9nZXRfY29ubl9sYWJlbHNgIHJldHVybnMgTlVMTC4gVGhlbiBgb3ZzX2N0X3NldF9sYWJlbHNgIHJldHVybnMgYC1FTk9TUENgLlxuXG4uLi5XYWl0IGEgbWludXRlISAgSWYgaXQncyByZXR1cm5pbmcgYC1FTk9TUENgIHdoZW4gdGhlIGV4dGVuc2lvbiBpc24ndCB0aGVyZSwgYW5kIHRoZSBjb25uZWN0aW9uICppcyogY29uZmlybWVkLCBkb2Vzbid0IHRoYXQgbWVhbiBga2V5LVx1MDAzZWN0LmxhYmVsc2AgaXMgKnVuaW5pdGlhbGl6ZWQqPyBUaGUgZmxvdyBvZiBsb2dpYyBhcHBlYXJzIHNvdW5kLCBidXQuLi4gd2hlcmUgKmRvZXMqIGBrZXlgIGNvbWUgZnJvbSBpbiBgb3ZzX2N0X3NldF9sYWJlbHNgPyBXZSBtdXN0IGNoZWNrIHRoZSBjYWxsZXJzIG9mIGBvdnNfY3Rfc2V0X2xhYmVsc2AgdG8gZW5zdXJlIHRoaXMgaXNuJ3QgYW4gaXNzdWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg5NzUsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NjYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDozNS4zOTY4MDQ0NTRaIiwiU2VxIjo1MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mjk3MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm92c19jdF9zZXRfbGFiZWxzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmM9MzgxPXN0YXRpYyBpbnQgb3ZzX2N0X2luaXRfbGFiZWxzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtNDIxLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYzo0MjI6c3RhdGljIGludCBvdnNfY3Rfc2V0X2xhYmVscyhzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LFxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYy00MjMtXFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2tleV9jdF9sYWJlbHMgKmxhYmVscyxcXG4tLVxcbm5ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYz05NjA9c3RhdGljIGludCBvdnNfY3RfY29tbWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksXFxuLS1cXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyMy1cXHRcXHQgICBsYWJlbHNfbm9uemVybyhcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spKSB7XFxubmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jOjEwMjQ6XFx0XFx0ZXJyID0gb3ZzX2N0X3NldF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG5uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMtMTAyNS1cXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMlQxNDowMDozNS40NDIxMDU0ODNaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzgyMDk5NjY2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgQ29ubmVjdGlvbiBUcmFja2luZyBDb21taXQgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBvdnNfY3RfY29tbWl0YC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgY29kZSBhcm91bmQgbGluZSAxMDIwLCBsaWtlbHkgaW4gdGhlIG1haW4gT1ZTIGRhdGFwYXRoIGtlcm5lbCBtb2R1bGUuIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIGlzIHdoZXJlIHRoZSBjcnVjaWFsIGNvbm5lY3Rpb24gdHJhY2tpbmcgZGVjaXNpb25zIGFyZSBmaW5hbGl6ZWQgYW5kIGVuZm9yY2VkIGFmdGVyIGEgZmxvdyBoYXMgdHJhdmVyc2VkIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hY2hpbmUuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb25uZWN0aW9uIGdldHMgbWFya2VkIGFzIGVzdGFibGlzaGVkIG9yIHJlbGF0ZWQsIGhvdyBOQVQgaXMgYXBwbGllZCAoaWYgcHJlc2VudCksIGFuZCBob3cgdGhpcyBhbGwgaW50ZXJhY3RzIHdpdGggdGhlIGNvbm50cmFjayB0YWJsZSBlbnRyaWVzLiBJ4oCZbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgbXV0ZXhlcyBvciBzcGlubG9ja3MgdXNlZCBmb3IgY29uY3VycmVuY3kgY29udHJvbCwgYW55IGNhbGxzIHRvIGhlbHBlciBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgdG8gb3IgdXBkYXRpbmcgdGhlIGNvbm50cmFjayB0YWJsZSwgYW5kIHRoZSBoYW5kbGluZyBvZiBhbnkgYXNzb2NpYXRlZCBmbGFncyBvciBtZXRhZGF0YS4gSSdtIGFsc28gY3VyaW91cyB0byBzZWUgaG93IGFueSBhc3NvY2lhdGVkIHNrYiBkYXRhIGlzIHVwZGF0ZWQgb3IgbW9kaWZpZWQgYXQgdGhpcyBjb21taXQgc3RhZ2UuIEl0J3MgbGlrZWx5IHdlIHdpbGwgZmluZCBzb21lIG9mIHRoZSBjcml0aWNhbCBjb2RlIGZvciBwcm9wZXJseSBoYW5kbGluZyBhc3ltbWV0cmljIGZsb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk2NSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjM5LjI2MzEwNDg1M1oiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjgyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk2MCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDk2MDpcXHRzdGF0aWMgaW50IG92c19jdF9jb21taXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSxcXG4gOTYxOlxcdFxcdFxcdFxcdCBjb25zdCBzdHJ1Y3Qgb3ZzX2Nvbm50cmFja19pbmZvICppbmZvLFxcbiA5NjI6XFx0XFx0XFx0XFx0IHN0cnVjdCBza19idWZmICpza2IpXFxuIDk2MzpcXHR7XFxuIDk2NDpcXHRcXHRlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbztcXG4gOTY1OlxcdFxcdHN0cnVjdCBuZl9jb25uICpjdDtcXG4gOTY2OlxcdFxcdGludCBlcnI7XFxuIDk2NzpcXHRcXG4gOTY4OlxcdFxcdGVyciA9IF9fb3ZzX2N0X2xvb2t1cChuZXQsIGtleSwgaW5mbywgc2tiKTtcXG4gOTY5OlxcdFxcdGlmIChlcnIpXFxuIDk3MDpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA5NzE6XFx0XFxuIDk3MjpcXHRcXHQvKiBUaGUgY29ubmVjdGlvbiBjb3VsZCBiZSBpbnZhbGlkLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBuby1vcC4qL1xcbiA5NzM6XFx0XFx0Y3QgPSBuZl9jdF9nZXQoc2tiLCBcXHUwMDI2Y3RpbmZvKTtcXG4gOTc0OlxcdFxcdGlmICghY3QpXFxuIDk3NTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gOTc2OlxcdFxcbiA5Nzc6XFx0I2lmXFx0SVNfRU5BQkxFRChDT05GSUdfTkVURklMVEVSX0NPTk5DT1VOVClcXG4gOTc4OlxcdFxcdGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFxcdTAwMjZvdnNfY3RfbGltaXRfZW5hYmxlZCkpIHtcXG4gOTc5OlxcdFxcdFxcdGlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkge1xcbiA5ODA6XFx0XFx0XFx0XFx0ZXJyID0gb3ZzX2N0X2NoZWNrX2xpbWl0KG5ldCwgc2tiLCBpbmZvKTtcXG4gOTgxOlxcdFxcdFxcdFxcdGlmIChlcnIpIHtcXG4gOTgyOlxcdFxcdFxcdFxcdFxcdG5ldF93YXJuX3JhdGVsaW1pdGVkKFxcXCJvcGVudnN3aXRjaDogem9uZTogJXUgXFxcIlxcbiA5ODM6XFx0XFx0XFx0XFx0XFx0XFx0XFxcImV4Y2VlZHMgY29ubnRyYWNrIGxpbWl0XFxcXG5cXFwiLFxcbiA5ODQ6XFx0XFx0XFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlem9uZS5pZCk7XFxuIDk4NTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiA5ODY6XFx0XFx0XFx0XFx0fVxcbiA5ODc6XFx0XFx0XFx0fVxcbiA5ODg6XFx0XFx0fVxcbiA5ODk6XFx0I2VuZGlmXFxuIDk5MDpcXHRcXG4gOTkxOlxcdFxcdC8qIFNldCB0aGUgY29ubnRyYWNrIGV2ZW50IG1hc2sgaWYgZ2l2ZW4uICBORVcgYW5kIERFTEVURSBldmVudHMgaGF2ZVxcbiA5OTI6XFx0XFx0ICogdGhlaXIgb3duIGdyb3VwcywgYnV0IHRoZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUgZ3JvdXAgbGlzdGVuZXJcXG4gOTkzOlxcdFxcdCAqIHR5cGljYWxseSB3b3VsZCByZWNlaXZlIG1hbnkga2luZHMgb2YgdXBkYXRlcy4gIFNldHRpbmcgdGhlIGV2ZW50XFxuIDk5NDpcXHRcXHQgKiBtYXNrIGFsbG93cyB0aG9zZSBldmVudHMgdG8gYmUgZmlsdGVyZWQuICBUaGUgc2V0IGV2ZW50IG1hc2sgd2lsbFxcbiA5OTU6XFx0XFx0ICogcmVtYWluIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uIHVubGVzcyBjaGFuZ2VkXFxuIDk5NjpcXHRcXHQgKiBieSBhIGZ1cnRoZXIgQ1QgYWN0aW9uIHdpdGggYm90aCB0aGUgY29tbWl0IGZsYWcgYW5kIHRoZSBldmVudG1hc2tcXG4gOTk3OlxcdFxcdCAqIG9wdGlvbi4gKi9cXG4gOTk4OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VoYXZlX2V2ZW50bWFzaykge1xcbiA5OTk6XFx0XFx0XFx0c3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpO1xcbjEwMDA6XFx0XFxuMTAwMTpcXHRcXHRcXHRpZiAoY2FjaGUpXFxuMTAwMjpcXHRcXHRcXHRcXHRjYWNoZS1cXHUwMDNlY3RtYXNrID0gaW5mby1cXHUwMDNlZXZlbnRtYXNrO1xcbjEwMDM6XFx0XFx0fVxcbjEwMDQ6XFx0XFxuMTAwNTpcXHRcXHQvKiBBcHBseSBjaGFuZ2VzIGJlZm9yZSBjb25maXJtaW5nIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcXG4xMDA2OlxcdFxcdCAqIGNvbm50cmFjayBORVcgbmV0bGluayBldmVudCBjYXJyaWVzIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIENUXFxuMTAwNzpcXHRcXHQgKiBhY3Rpb24uXFxuMTAwODpcXHRcXHQgKi9cXG4xMDA5OlxcdFxcdGlmIChpbmZvLVxcdTAwM2VtYXJrLm1hc2spIHtcXG4xMDEwOlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbWFyayhjdCwga2V5LCBpbmZvLVxcdTAwM2VtYXJrLnZhbHVlLFxcbjEwMTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgaW5mby1cXHUwMDNlbWFyay5tYXNrKTtcXG4xMDEyOlxcdFxcdFxcdGlmIChlcnIpXFxuMTAxMzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjEwMTQ6XFx0XFx0fVxcbjEwMTU6XFx0XFx0aWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7XFxuMTAxNjpcXHRcXHRcXHRlcnIgPSBvdnNfY3RfaW5pdF9sYWJlbHMoY3QsIGtleSwgXFx1MDAyNmluZm8tXFx1MDAzZWxhYmVscy52YWx1ZSxcXG4xMDE3OlxcdFxcdFxcdFxcdFxcdFxcdCBcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMTg6XFx0XFx0XFx0aWYgKGVycilcXG4xMDE5OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyMDpcXHRcXG4xMDIxOlxcdFxcdFxcdG5mX2Nvbm5fYWN0X2N0X2V4dF9hZGQoc2tiLCBjdCwgY3RpbmZvKTtcXG4xMDIyOlxcdFxcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUykgXFx1MDAyNlxcdTAwMjZcXG4xMDIzOlxcdFxcdFxcdCAgIGxhYmVsc19ub256ZXJvKFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMubWFzaykpIHtcXG4xMDI0OlxcdFxcdFxcdGVyciA9IG92c19jdF9zZXRfbGFiZWxzKGN0LCBrZXksIFxcdTAwMjZpbmZvLVxcdTAwM2VsYWJlbHMudmFsdWUsXFxuMTAyNTpcXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2aW5mby1cXHUwMDNlbGFiZWxzLm1hc2spO1xcbjEwMjY6XFx0XFx0XFx0aWYgKGVycilcXG4xMDI3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuMTAyODpcXHRcXHR9XFxuMTAyOTpcXHRcXHQvKiBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHNlbmRpbmcgcXVldWVkIGV2ZW50cyBldmVuIGlmIHRoZSBjb25uZWN0aW9uXFxuMTAzMDpcXHRcXHQgKiBpcyBhbHJlYWR5IGNvbmZpcm1lZC5cXG4xMDMxOlxcdFxcdCAqL1xcbjEwMzI6XFx0XFx0ZXJyID0gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTtcXG4xMDMzOlxcdFxcbjEwMzQ6XFx0XFx0cmV0dXJuIHZlcmRpY3RfdG9fZXJybm8oZXJyKTtcXG4xMDM1OlxcdH1cXG4xMDM2OlxcdFxcbjEwMzc6XFx0LyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5QUk9HUkVTUyBpZiAnc2tiJyBpcyBzdG9sZW4sIG9yIG90aGVyIG5vbnplcm9cXG4xMDM4OlxcdCAqIHZhbHVlIGlmICdza2InIGlzIGZyZWVkLlxcbjEwMzk6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEyVDE0OjAwOjM5LjI2MzIzNDk1M1oiLCJTZXEiOjU1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMDk3NjAwNDAzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBDb25udHJhY2sgTGFiZWwgSGFuZGxpbmcgYW5kIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBJc3N1ZXMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBhdCB0aGlzIENvbm50cmFjayBsYWJlbCBoYW5kbGluZyBjb2RlLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gYW5kIGl0cyBpbXBhY3Qgb24gbWVtb3J5IHNhZmV0eS4gVGhlIGNvcmUgb2YgdGhlIGlzc3VlIHNlZW1zIHRvIGJlIGFyb3VuZCBtb2RpZnlpbmcgb3IgZXh0ZW5kaW5nIHRoZSBgY3QtXHUwMDNlZXh0YCBmaWVsZCBvZiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uIHRyYWNrIGVudHJ5IChgY3RgKS4gVGhlIG9yaWdpbmFsIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgd2FzIGJlaW5nIGNhbGxlZCBvbiBjb25maXJtZWQgY29ubmVjdGlvbnMsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBkYXRhIHJhY2UgYmVjYXVzZSBvZiByZWFsbG9jYXRpb24uXG5cbk15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgZml4IGFkZHJlc3NlcyB0aGlzIGJ5IG9ubHkgYWRkaW5nIHRoZSBsYWJlbHMgZXh0ZW5zaW9uIGlmIHRoZSBjb25uZWN0aW9uIGlzbid0IGNvbmZpcm1lZCAqYW5kKiB0aGUgbGFiZWxzIGhhdmVuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBUaGUgbG9naWMgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogaWYgdGhlIGNvbm5lY3Rpb24gaXNuJ3QgY29uZmlybWVkLCBpdCBjYWxscyBgb3ZzX2N0X2luaXRfbGFiZWxzYCB3aGljaCBpcyBmaW5lLiBJZiB0aGUgY29ubmVjdGlvbiAqaXMqIGNvbmZpcm1lZCBhbmQgbGFiZWxzIGFyZSBuZWVkZWQsIGl0IGNhbGxzIGBvdnNfY3Rfc2V0X2xhYmVsc2AsIGhvd2V2ZXIgd2l0aCB0aGlzIHBhdGNoIHRoZSBsYWJlbHMgYXJlIG9ubHkgY3JlYXRlZCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LlxuXG5Ob3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIHdyaXRlcz8gIExldCBtZSBnbyB0aHJvdWdoIG15IHRob3VnaHQgcHJvY2Vzcy5cblxuMS4gICoqV2hlbiBgb3ZzX2N0X2dldF9jb25uX2xhYmVsc2AgcmV0dXJucyBgTlVMTGA6KiogSWYgdGhlIGNvbm50cmFjayBlbnRyeSBpcyBjb25maXJtZWQsIGFuZCB0aGUgbGFiZWxzIGFyZSBub3QgYWxyZWFkeSBhbGxvY2F0ZWQsIGBvdnNfY3Rfc2V0X2xhYmVsc2Agd2lsbCByZXR1cm4gYC1FTk9TUENgLiBUaGlzIG1lYW5zIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQuXG5cbjIuICAqKk90aGVyIGNhbGxlcnMgb2YgYG92c19jdF9nZXRfY29ubl9sYWJlbHNgOioqIFRoZXJlIGFyZSBvbmx5IGBvdnNfY3RfaW5pdF9sYWJlbHNgIGFuZCBgb3ZzX2N0X3NldF9sYWJlbHNgLiAgYG92c19jdF9pbml0X2xhYmVsc2AgaGFuZGxlcyB0aGUgbm9uLWNvbmZpcm1lZCBjYXNlLCBzbyBhZ2Fpbiwgbm8gaXNzdWUuXG5cbjMuICAqKmBuZl9jdF9sYWJlbHNfZXh0X2FkZGAgYW5kIGl0cyBzdXJyb3VuZGluZ3M6KiogVGhlIHVuZGVybHlpbmcgcHJvYmxlbSBhZGRyZXNzZWQgYnkgdGhlIGNvZGUgbW9kaWZpY2F0aW9uIGlzIGEgY29uY3VycmVuY3kgYnVnIHdpdGggcmVhbGxvY2F0aW5nIGNvbmZpcm1lZCBjb25uZWN0aW9ucywgbGVhZGluZyB0byByYWNlIGNvbmRpdGlvbnMgb3IgVXNlIEFmdGVyIEZyZWUgc2NlbmFyaW9zLiBJdCBpcyBub3QgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbjQuICAqKkFyZSB0aGVyZSBhbnkgb3RoZXIga2VybmVsLXRvLXVzZXIgY29waWVzLCBwYWRkaW5nIGxlYWtzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCByZWFkcywgb3IgdW5pbml0aWFsaXplZCBicmFuY2hlcyBhZmZlY3RlZD8qKiBJIGRvbid0IHNlZSBhbnl0aGluZy4gVGhlIG1haW4gY2hhbmdlIGFkZHMgYSBndWFyZCBjb25kaXRpb24uIFRoZSBjb2RlIHBhdGggcmVsYXRlZCB0byBgbmZfY3RfaXNfY29uZmlybWVkKGN0KWAgYWNjZXNzZXMgdGhlIGBzdGF0dXNgIGJpdGZpZWxkIG9mIGBjdGAsIHdoaWNoIGlzIGZ1bGx5IGluaXRpYWxpemVkIHdoZW4gdGhlIGBjdGAgaXMgY3JlYXRlZC5cblxuU28sIGFmdGVyIHRoaXMgcmlnb3JvdXMgYW5hbHlzaXMsIEknbSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzICpub3QqIGludHJvZHVjZSBvciBleHBvc2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gIFRoZSBleGlzdGluZyBLQVNBTiBhbmQgYFdBUk5fT05gIG1lY2hhbmlzbXMgc2hvdWxkIGhhbmRsZSB0aGUgY29uY3VycmVuY3kgaXNzdWUgYmVpbmcgZml4ZWQgaGVyZS4gIEtNU0FOIHdvdWxkIG5vdCBvZmZlciBhbnkgYWRkaXRpb25hbCBiZW5lZml0cy4gVGhlIGBOZWVkc0tNU0FOYCBmbGFnIGlzIGZhbHNlLiBUaGUgcmVhc29uaW5nIGlzIGNsZWFyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ5MiwiT3V0cHV0VG9rZW5zIjoyMTIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTU0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTJUMTQ6MDA6NTAuMjM5MjQ0MDU5WiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgyNTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBwcmV2ZW50cyBjYWxsaW5nIGBuZl9jdF9sYWJlbHNfZXh0X2FkZCgpYCBvbiBhbiBhbHJlYWR5IGNvbmZpcm1lZCBjb25udHJhY2sgY29ubmVjdGlvbiAoYCFuZl9jdF9pc19jb25maXJtZWQoY3QpYCksIGF2b2lkaW5nIGFuIGludmFsaWQgcmVhbGxvY2F0aW9uIG9mIGBjdC1cXHUwMDNlZXh0YCB0aGF0IHRyaWdnZXJzIGBXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpYCBhbmQgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy91c2UtYWZ0ZXItZnJlZSBvbiBzaGFyZWQgY29ubnRyYWNrIGV4dGVuc2lvbnMuXFxuXFxuVGhlIGNoYW5nZSBtZXJlbHkgdGlnaHRlbnMgYSBjb25kaXRpb25hbCBjaGVjayBiZWZvcmUgYXR0ZW1wdGluZyBhbiBleHRlbnNpb24gYWxsb2NhdGlvbjsgaXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9ucywgb3IgaW5mby1sZWFrcyB0byB1c2Vyc3BhY2UuIElmIGBjbGAgaXMgTlVMTCBvbiBhIGNvbmZpcm1lZCBjb25uZWN0aW9uLCBgb3ZzX2N0X3NldF9sYWJlbHMoKWAgc2FmZWx5IHJldHVybnMgYC1FTk9TUENgIHdpdGhvdXQgYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YS4gVGhlIGJ1ZyBiZWluZyBhZGRyZXNzZWQgcmVsYXRlcyB0byBjb25jdXJyZW5jeSwgZXh0ZW5zaW9uIGxpZmVjeWNsZSwgYW5kIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSwgd2hpY2ggZmFsbCB1bmRlciBzdGFuZGFyZCBrZXJuZWwgd2FybmluZ3MgYW5kIEtBU0FOLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcHJldmVudHMgY2FsbGluZyBgbmZfY3RfbGFiZWxzX2V4dF9hZGQoKWAgb24gYW4gYWxyZWFkeSBjb25maXJtZWQgY29ubnRyYWNrIGNvbm5lY3Rpb24gKGAhbmZfY3RfaXNfY29uZmlybWVkKGN0KWApLCBhdm9pZGluZyBhbiBpbnZhbGlkIHJlYWxsb2NhdGlvbiBvZiBgY3QtXFx1MDAzZWV4dGAgdGhhdCB0cmlnZ2VycyBgV0FSTl9PTihuZl9jdF9pc19jb25maXJtZWQoY3QpKWAgYW5kIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMvdXNlLWFmdGVyLWZyZWUgb24gc2hhcmVkIGNvbm50cmFjayBleHRlbnNpb25zLlxcblxcblRoZSBjaGFuZ2UgbWVyZWx5IHRpZ2h0ZW5zIGEgY29uZGl0aW9uYWwgY2hlY2sgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXh0ZW5zaW9uIGFsbG9jYXRpb247IGl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGhlYXAgb3Igc3RhY2sgYWxsb2NhdGlvbnMsIG9yIGluZm8tbGVha3MgdG8gdXNlcnNwYWNlLiBJZiBgY2xgIGlzIE5VTEwgb24gYSBjb25maXJtZWQgY29ubmVjdGlvbiwgYG92c19jdF9zZXRfbGFiZWxzKClgIHNhZmVseSByZXR1cm5zIGAtRU5PU1BDYCB3aXRob3V0IGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIGRhdGEuIFRoZSBidWcgYmVpbmcgYWRkcmVzc2VkIHJlbGF0ZXMgdG8gY29uY3VycmVuY3ksIGV4dGVuc2lvbiBsaWZlY3ljbGUsIGFuZCBwb3RlbnRpYWwgdXNlLWFmdGVyLWZyZWUsIHdoaWNoIGZhbGwgdW5kZXIgc3RhbmRhcmQga2VybmVsIHdhcm5pbmdzIGFuZCBLQVNBTiwgbm90IEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowv2pqg[1] Phase: Succeeded StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 14:01:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 14:01:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2] Phase: Succeeded StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"fuzz":{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 14:01:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-12 14:01:01 +0000 UTC FinishedAt: 2026-09-12 14:01:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.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-workflowv2pqg/series-workflowv2pqg-convert-artifact-2510882413/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-12 14:01:11 +0000 UTC FinishedAt: 2026-09-12 14:21:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-12 14:01:11 +0000 UTC FinishedAt: 2026-09-12 14:21:55 +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:*8b742d28-c8a0-44f4-a296-78ba7d61bc6a,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-workflowv2pqg/series-workflowv2pqg-convert-artifact-2510882413/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": "907fd627-69c2-444c-8608-bd189097c114", "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-workflowv2pqg/series-workflowv2pqg-build-action-204304483/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-12 14:01:11 +0000 UTC FinishedAt: 2026-09-12 14:21:45 +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:*8b742d28-c8a0-44f4-a296-78ba7d61bc6a,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-workflowv2pqg/series-workflowv2pqg-convert-artifact-2510882413/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": "907fd627-69c2-444c-8608-bd189097c114", "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-workflowv2pqg/series-workflowv2pqg-build-action-204304483/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-12 14:21:55 +0000 UTC FinishedAt: 2026-09-12 14:21:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-12 14:21:55 +0000 UTC FinishedAt: 2026-09-12 14:21:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-12 14:21:55 +0000 UTC FinishedAt: 2026-09-12 14:22:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-12 14:21:55 +0000 UTC FinishedAt: 2026-09-12 14:21:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.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-workflowv2pqg/series-workflowv2pqg-convert-artifact-291044552/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-12 14:22:05 +0000 UTC FinishedAt: 2026-09-12 14:23:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-12 14:22:05 +0000 UTC FinishedAt: 2026-09-12 14:23:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*907fd627-69c2-444c-8608-bd189097c114,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-workflowv2pqg/series-workflowv2pqg-build-action-204304483/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-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-12 14:23:59 +0000 UTC FinishedAt: 2026-09-12 14:23:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-12 14:23:59 +0000 UTC FinishedAt: 2026-09-12 14:23:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-12 14:23:59 +0000 UTC FinishedAt: 2026-09-12 14:40:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-12 14:23:59 +0000 UTC FinishedAt: 2026-09-12 14:40:24 +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:*8b742d28-c8a0-44f4-a296-78ba7d61bc6a,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-workflowv2pqg/series-workflowv2pqg-convert-artifact-291044552/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": "372749b3-e01b-47f8-9bc7-1ab71725b8e1", "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-workflowv2pqg/series-workflowv2pqg-build-action-2504143220/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-12 14:23:59 +0000 UTC FinishedAt: 2026-09-12 14:40:14 +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:*8b742d28-c8a0-44f4-a296-78ba7d61bc6a,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-workflowv2pqg/series-workflowv2pqg-convert-artifact-291044552/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": "372749b3-e01b-47f8-9bc7-1ab71725b8e1", "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-workflowv2pqg/series-workflowv2pqg-build-action-2504143220/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-12 14:40:24 +0000 UTC FinishedAt: 2026-09-12 14:40:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-12 14:40:24 +0000 UTC FinishedAt: 2026-09-12 14:40:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-12 14:40:24 +0000 UTC FinishedAt: 2026-09-12 14:42:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-12 14:40:24 +0000 UTC FinishedAt: 2026-09-12 14:42:07 +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:*372749b3-e01b-47f8-9bc7-1ab71725b8e1,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-workflowv2pqg/series-workflowv2pqg-build-action-2504143220/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-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*907fd627-69c2-444c-8608-bd189097c114,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*372749b3-e01b-47f8-9bc7-1ab71725b8e1,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-workflowv2pqg/series-workflowv2pqg-build-action-204304483/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-workflowv2pqg/series-workflowv2pqg-build-action-2504143220/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 14:42:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 14:42:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowv2pqg/series-workflowv2pqg-convert-artifact-3703694977/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 14:42:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-12 14:42:17 +0000 UTC FinishedAt: 2026-09-12 14:42:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-12 14:42:18 +0000 UTC FinishedAt: 2026-09-12 14:42:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-12 14:42:28 +0000 UTC FinishedAt: 2026-09-12 17:44:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv2pqg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["ovs_ct_get_conn_labels","ovs_ct_set_labels","ovs_ct_init_labels","ovs_ct_commit","ovs_ct_execute"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"e6b6078ea1731b05b3b552497b3bce4bf8b014ae","config_name":"upstream-apparmor-kasan.config","enable_configs":["OPENVSWITCH","NF_CONNTRACK","NF_CONNTRACK_LABELS"],"series_id":"7cf1ae3e-5a85-4ffb-81c8-53d21d41e395","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-12 14:42:28 +0000 UTC FinishedAt: 2026-09-12 17:44:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*907fd627-69c2-444c-8608-bd189097c114,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*372749b3-e01b-47f8-9bc7-1ab71725b8e1,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-workflowv2pqg/series-workflowv2pqg-build-action-204304483/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-workflowv2pqg/series-workflowv2pqg-build-action-2504143220/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-workflowv2pqg/series-workflowv2pqg-convert-artifact-3703694977/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,}