Name: series-workflowl4c8r Phase: Succeeded StartedAt: 2026-08-18 18:10:38 +0000 UTC FinishedAt: 2026-08-18 20:50:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[0] Phase: Succeeded StartedAt: 2026-08-18 18:10:38 +0000 UTC FinishedAt: 2026-08-18 19:56:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[0].run-triage Phase: Succeeded StartedAt: 2026-08-18 18:10:38 +0000 UTC FinishedAt: 2026-08-18 19:56:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "d679c2e1e8d96f71f85e2ef3877407d264212cc3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TIPC", "TIPC_MEDIA_UDP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "d679c2e1e8d96f71f85e2ef3877407d264212cc3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TIPC", "TIPC_MEDIA_UDP" ], "series_id": "627256da-e49e-4ef6-96ed-f76a8dd124a8" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "tipc_disc_rcv" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RJUEMmIzM0OywKICAgICYjMzQ7VElQQ19NRURJQV9VRFAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0aXBjX2Rpc2NfcmN2JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcblxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTiYjMzk7cyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1MzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDQzMjRkNjc1ZDI1ZjIxMTJiMTk5ZDdhNDcxNjMxMWI3OTdlZjAyNDJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAxOTo1Mzo1NSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuY1xuaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDRcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbkBAIC0xOTUsMjcgJiM0MzsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiB7XG4gXHRzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTtcbiBcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xuLVx0dTMyIHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4tXHR1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuJiM0MztcdHUzMiBwbmV0X2hhc2g7XG4mIzQzO1x0dTE2IGNhcHM7XG4gXHRib29sIGxlZ2FjeSA9IHRuLVx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcbi1cdHUzMiBzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4tXHR1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4mIzQzO1x0dTMyIHN1Z2c7XG4mIzQzO1x0dTMyIHNpZ25hdHVyZTtcbiBcdHU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTtcbi1cdHUzMiBkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcbi1cdHUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcbiYjNDM7XHR1MzIgZHN0O1xuJiM0MztcdHUzMiBuZXRfaWQ7XG4gXHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuLVx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuLVx0dTMyIG10eXAgPSBtc2dfdHlwZShoZHIpO1xuJiM0MztcdHUzMiBzcmM7XG4mIzQzO1x0dTMyIG10eXA7XG4gXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xuIFx0Ym9vbCByZXNwb25kID0gZmFsc2U7XG4gXHR1MzIgc2VsZjtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4mIzQzO1x0ICogcGx1cyBhIG5vZGUgaWRlbnRpdHksIHNlZSB0aXBjX2Rpc2NfaW5pdF9tc2coKS4gVGhlIGhlYWRlclxuJiM0MztcdCAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZFxuJiM0MztcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4mIzQzO1x0ICogcmVhZGluZyB0aGVtLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbiYjNDM7XHQgICAgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTikge1xuJiM0MztcdFx0a2ZyZWVfc2tiKHNrYik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcbiBcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbiYjNDM7XHRwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpO1xuJiM0MztcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbiYjNDM7XHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4mIzQzO1x0c2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4mIzQzO1x0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4mIzQzO1x0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4mIzQzO1x0c3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4mIzQzO1x0bXR5cCA9IG1zZ190eXBlKGhkcik7XG4gXG4gXHRpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxuIFx0XHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUSVBDJiMzNDssCiAgICAmIzM0O1RJUENfTUVESUFfVURQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dGlwY19kaXNjX3JjdiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGJvdW5kcyBjaGVja2luZyBmb3IgaW5jb21pbmcgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZXMgaW4gYHRpcGNfZGlzY19yY3ZgIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIFRJUEMgcHJvdG9jb2wgbG9naWMgdGhhdCBwcm9jZXNzZXMgbmV0d29yayBwYWNrZXRzLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDMyNGQ2NzVkMjVmMjExMmIxOTlkN2E0NzE2MzExYjc5N2VmMDI0MgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDE5OjUzOjU1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGlzY292ZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCkBAIC0xOTUsMjcgJiM0MzsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIHsKIAlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTsKIAlzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTsKLQl1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTsKLQl1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpOwomIzQzOwl1MzIgcG5ldF9oYXNoOwomIzQzOwl1MTYgY2FwczsKIAlib29sIGxlZ2FjeSA9IHRuLSZndDtsZWdhY3lfYWRkcl9mb3JtYXQ7Ci0JdTMyIHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTsKLQl1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7CiYjNDM7CXUzMiBzdWdnOwomIzQzOwl1MzIgc2lnbmF0dXJlOwogCXU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTsKLQl1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7Ci0JdTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpOwomIzQzOwl1MzIgZHN0OwomIzQzOwl1MzIgbmV0X2lkOwogCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWFkZHI7Ci0JdTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpOwotCXUzMiBtdHlwID0gbXNnX3R5cGUoaGRyKTsKJiM0MzsJdTMyIHNyYzsKJiM0MzsJdTMyIG10eXA7CiAJYm9vbCBkdXBsX2FkZHIgPSBmYWxzZTsKIAlib29sIHJlc3BvbmQgPSBmYWxzZTsKIAl1MzIgc2VsZjsKIAlpbnQgZXJyOwogCiYjNDM7CS8qIERpc2NvdmVyeSBtZXNzYWdlcyBhbHdheXMgY2FycnkgdGhlIG1heGltdW0gc2l6ZSBUSVBDIGhlYWRlcgomIzQzOwkgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyCiYjNDM7CSAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZAomIzQzOwkgKiB0aGUgbWluaW11bSBoZWFkZXIgc2l6ZSwgc28gZGlzY2FyZCBzaG9ydGVyIG1lc3NhZ2VzIGJlZm9yZQomIzQzOwkgKiByZWFkaW5nIHRoZW0uCiYjNDM7CSAqLwomIzQzOwlpZiAobXNnX2hkcl9zeihoZHIpICZsdDsgTUFYX0hfU0laRSB8fAomIzQzOwkgICAgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pIHsKJiM0MzsJCWtmcmVlX3NrYihza2IpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiAJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KIAloZHIgPSBidWZfbXNnKHNrYik7CiYjNDM7CXBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7CiYjNDM7CWNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTsKJiM0MzsJc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpOwomIzQzOwlzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTsKJiM0MzsJZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7CiYjNDM7CW5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpOwomIzQzOwlzcmMgPSBtc2dfcHJldm5vZGUoaGRyKTsKJiM0MzsJbXR5cCA9IG1zZ190eXBlKGhkcik7CiAKIAlpZiAoY2FwcyAmYW1wOyBUSVBDX05PREVfSUQxMjgpCiAJCW1lbWNweShwZWVyX2lkLCBtc2dfbm9kZV9pZChoZHIpLCBOT0RFX0lEX0xFTik7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzgKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgVElQQyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC90aXBjL2Rpc2NvdmVyLmNgLiBJdCYjMzk7cyBzdHJhaWdodGZvcndhcmQsIHJlYWxseS4gVGhlIGNvcmUgb2YgaXQgaXMgYSBkZWZlbnNpdmUgY2hlY2sgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YC4gQmFzaWNhbGx5LCBiZWZvcmUgZGl2aW5nIGludG8gZmllbGRzIGluIHRoZSBtZXNzYWdlLCBpdCB2ZXJpZmllcyB0aGUgbWVzc2FnZSBoZWFkZXIgc2l6ZSBhbmQgdGhlIG92ZXJhbGwgbWVzc2FnZSBzaXplLiBTbWFydC4gVGhpcyBpcyBjbGVhcmx5IGEgZnVuY3Rpb25hbCBmaXgsIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyByZWFkIHZ1bG5lcmFiaWxpdHkgb3IgYSByZWxhdGVkIG1lbW9yeSBhY2Nlc3MgaXNzdWUg4oCTIGV4YWN0bHkgdGhlIGtpbmQgb2YgdGhpbmcgd2UgbmVlZCB0byBjYXRjaC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIFRJUEMgc3Vic3lzdGVtIGhlcmUsIHNvIHRoaXMgY2hhbmdlIGtlZXBzIGl0cyBpbnRlZ3JpdHkuIE5vdywgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNoYW5nZSBieSBkaWdnaW5nIGludG8gYG5ldC90aXBjL2Rpc2NvdmVyLmNgIHRvIHNlZSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBhbmQgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSBhbGwgVElQQyBjb25maWd1cmF0aW9uIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRJUEMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL0tjb25maWctNS1cbm5ldC90aXBjL0tjb25maWc6NjptZW51Y29uZmlnIFRJUENcbm5ldC90aXBjL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0O1RoZSBUSVBDIFByb3RvY29sXCYjMzQ7XG4tLVxubmV0L3RpcGMvS2NvbmZpZy0yNC1cbm5ldC90aXBjL0tjb25maWc6MjU6Y29uZmlnIFRJUENfTUVESUFfSUJcbm5ldC90aXBjL0tjb25maWctMjYtXHRib29sIFwmIzM0O0luZmluaUJhbmQgbWVkaWEgdHlwZSBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L3RpcGMvS2NvbmZpZy0zMC1cdCAgSVAtb3Zlci1JbmZpbmlCYW5kIGRldmljZXMuXG5uZXQvdGlwYy9LY29uZmlnOjMxOmNvbmZpZyBUSVBDX01FRElBX1VEUFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7SVAvVURQIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC90aXBjL0tjb25maWctMzgtXG5uZXQvdGlwYy9LY29uZmlnOjM5OmNvbmZpZyBUSVBDX0NSWVBUT1xubmV0L3RpcGMvS2NvbmZpZy00MC1cdGJvb2wgXCYjMzQ7VElQQyBlbmNyeXB0aW9uIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvdGlwYy9LY29uZmlnLTUzLVxubmV0L3RpcGMvS2NvbmZpZzo1NDpjb25maWcgVElQQ19ESUFHXG5uZXQvdGlwYy9LY29uZmlnLTU1LVx0dHJpc3RhdGUgXCYjMzQ7VElQQzogc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE5MQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgdGlwY19kaXNjX3JjdmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgSSYjMzk7bSB3b3JraW5nIHdpdGggYSBgVElQQ2AgY29uZmlndXJhdGlvbiBoZXJlLiBOb3csIHRoZSBjb2RlJiMzOTtzIGNhbGxpbmcgYHRpcGNfZGlzY19yY3ZgLCBhbmQgbXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpdHMgc2NvcGUuIElzIHRoaXMgZnVuY3Rpb24gc3RhdGljLCBtZWFuaW5nIGl0JiMzOTtzIGNvbmZpbmVkIHRvIGl0cyBtb2R1bGUsIG9yIGlzIGl0IGV4cG9ydGVkLCBhbmQgdGhlcmVmb3JlIGNhbGxhYmxlIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbD8gVGhhdCYjMzk7cyB0aGUgZmlyc3QgcXVlc3Rpb24gSSBuZWVkIHRvIGFuc3dlci4gS25vd2luZyB0aGF0IHdpbGwgaW5mbHVlbmNlIGhvdyBJIGFwcHJvYWNoIHVuZGVyc3RhbmRpbmcgaXRzIHB1cnBvc2UgYW5kIHBvdGVudGlhbCBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgc3lzdGVtLiBJZiBpdCYjMzk7cyBzdGF0aWMsIGl0JiMzOTtzIGVhc2llciB0byByZWFzb24gYWJvdXQgaW4gaXNvbGF0aW9uLCB3aGVyZWFzIGlmIGV4cG9ydGVkLCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGludGVyYWN0aW9ucyB3aXRoIGEgd2lkZXIgYXJyYXkgb2YgbW9kdWxlcy4gVGltZSB0byBkaWcgaW4gYW5kIGNoZWNrIGl0cyBkZWNsYXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0aXBjX2Rpc2NfcmN2JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3RpcGMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTg3LS8qKlxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTg5LSAqIEBuZXQ6IGFwcGxpY2FibGUgbmV0IG5hbWVzcGFjZVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xubmV0L3RpcGMvZGlzY292ZXIuYzoxOTM6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTk0LVx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xubmV0L3RpcGMvZGlzY292ZXIuaDo0ODp2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLFxubmV0L3RpcGMvZGlzY292ZXIuaC00OS1cdFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7XG4tLVxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbi0tXG5uZXQvdGlwYy9ub2RlLmMtMjEyNS1cdFx0aWYgKHVubGlrZWx5KHVzciA9PSBMSU5LX0NPTkZJRykpXG5uZXQvdGlwYy9ub2RlLmM6MjEyNjpcdFx0XHRyZXR1cm4gdGlwY19kaXNjX3JjdihuZXQsIHNrYiwgYik7XG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cdFx0ZWxzZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4NTIKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRm9jdXNpbmcgb24gdGhlIFRJUEMgRGlzY29ubmVjdCBSZWNlaXZlcioqCgpPa2F5LCBzbyBgdGlwY19kaXNjX3JjdmAgaXNuJiMzOTt0IGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0JiMzOTtzIGtleS4gSXQmIzM5O3MgY2FsbGVkIGZyb20gYHRpcGNfcmN2YCwgd2hpY2ggbWVhbnMgaXQmIzM5O3MgYSBzcGVjaWZpYyBwYXJ0IG9mIGEgbGFyZ2VyIHByb2Nlc3MuIEdpdmVuIHRoYXQsIGB0aXBjX2Rpc2NfcmN2YCBzZWVtcyBsaWtlIGEgbW9yZSBmb2N1c2VkIHN5bWJvbCB0byBleHBsb3JlLiBgdGlwY19yY3ZgIGlzIGludGVyZXN0aW5nIHRvbywgYnV0IGl0IGZlZWxzIGJyb2FkZXIuIExldCYjMzk7cyBzdGFydCB3aXRoIGB0aXBjX2Rpc2NfcmN2YC4gSSBzaG91bGQgY2hlY2sgaWYgYW55dGhpbmcgc3BlY2lmaWMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXR0ZW50aW9uIHJlbGF0ZWQgdG8gdGhpcy4KCkkgcmVtZW1iZXIgdGhhdCBgVElQQ2AgaXRzZWxmIGlzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBTbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlcGVuZGVuY2llcyBmb3IgYFRJUENgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSBgbmV0L3RpcGMvS2NvbmZpZ2AgdG8gc2VlIHdoYXQgZWxzZSBtaWdodCBiZSByZXF1aXJlZCBmb3IgYFRJUENgIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4gVGhpcyBpcyB0aGUgcGxhY2UgdG8gY2hlY2sgZm9yIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90aXBjL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvS2NvbmZpZz02PW1lbnVjb25maWcgVElQQ1xubmV0L3RpcGMvS2NvbmZpZy03LVx0dHJpc3RhdGUgXCYjMzQ7VGhlIFRJUEMgUHJvdG9jb2xcJiMzNDtcbm5ldC90aXBjL0tjb25maWc6ODpcdGRlcGVuZHMgb24gSU5FVFxubmV0L3RpcGMvS2NvbmZpZzo5Olx0ZGVwZW5kcyBvbiBJUFY2IHx8IElQVjY9blxubmV0L3RpcGMvS2NvbmZpZy0xMC1cdGhlbHBcbi0tXG5uZXQvdGlwYy9LY29uZmlnPTI1PWNvbmZpZyBUSVBDX01FRElBX0lCXG5uZXQvdGlwYy9LY29uZmlnLTI2LVx0Ym9vbCBcJiMzNDtJbmZpbmlCYW5kIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzoyNzpcdGRlcGVuZHMgb24gVElQQyBcdTAwMjZcdTAwMjYgSU5GSU5JQkFORF9JUE9JQlxubmV0L3RpcGMvS2NvbmZpZy0yOC1cdGhlbHBcbi0tXG5uZXQvdGlwYy9LY29uZmlnPTMxPWNvbmZpZyBUSVBDX01FRElBX1VEUFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7SVAvVURQIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzozMzpcdGRlcGVuZHMgb24gVElQQ1xubmV0L3RpcGMvS2NvbmZpZy0zNC1cdHNlbGVjdCBORVRfVURQX1RVTk5FTFxuLS1cbm5ldC90aXBjL0tjb25maWc9Mzk9Y29uZmlnIFRJUENfQ1JZUFRPXG5uZXQvdGlwYy9LY29uZmlnLTQwLVx0Ym9vbCBcJiMzNDtUSVBDIGVuY3J5cHRpb24gc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzo0MTpcdGRlcGVuZHMgb24gVElQQ1xubmV0L3RpcGMvS2NvbmZpZy00Mi1cdHNlbGVjdCBDUllQVE9cbi0tXG5uZXQvdGlwYy9LY29uZmlnPTU0PWNvbmZpZyBUSVBDX0RJQUdcbm5ldC90aXBjL0tjb25maWctNTUtXHR0cmlzdGF0ZSBcJiMzNDtUSVBDOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcJiMzNDtcbm5ldC90aXBjL0tjb25maWc6NTY6XHRkZXBlbmRzIG9uIFRJUENcbm5ldC90aXBjL0tjb25maWctNTctXHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NjA1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlRJUEMgQ29uZmlndXJhdGlvbiBhbmQgVnVsbmVyYWJpbGl0eSBBc3Nlc3NtZW50KioKCk9rYXksIHNvIEkgc2VlIGBUSVBDYCBpcyByZWxpYW50IG9uIGBJTkVUYC4gVGhhdCYjMzk7cyBzdHJhaWdodGZvcndhcmQ7IEkmIzM5O2xsIGdldCB0aGF0IGFkZGVkIHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdC4gTm93LCBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGB0aXBjX2Rpc2NfcmN2YCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIOKAkyBjcnVjaWFsIGZvciBkZXRlcm1pbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBoZXJlLiBZZXMsIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGB0aXBjX3JjdmAsIHdoaWNoIGVzc2VudGlhbGx5IGFjdHMgYXMgdGhlIHByaW1hcnkgcmVjZWl2ZSBmdW5jdGlvbiBmb3IgYWxsIFRJUEMgcGFja2V0cywgc28gdGhhdCYjMzk7cyBhIGRpcmVjdCBlbnRyeSBwb2ludC4KClRoaXMgcGF0Y2gsIGl0JiMzOTtzIGFkZHJlc3NpbmcgYW4gb3V0LW9mLWJvdW5kcyByZWFkLCBhbmQgdGhhdCYjMzk7cyBjb25jZXJuaW5nLiBUaGUgZml4IGludm9sdmVzIGNoZWNraW5nIGBtc2dfaGRyX3N6KGhkcilgIGFuZCBgbXNnX3NpemUoaGRyKWAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGNlcnRhaW4gZmllbGRzLiBUaGF0IHNvdW5kcyBsaWtlIGEgc29saWQgYXBwcm9hY2gsIGJ1dCBpdCBkZWZpbml0ZWx5IHdhcnJhbnRzIHRob3JvdWdoIGZ1enppbmcuCgpOb3csIGxldCYjMzk7cyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYHRpcGNfZGlzY19yY3ZgLCB3aGljaCBsaXZlcyBpbiBgbmV0L3RpcGMvZGlzY292ZXIuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgY29kZSB0byBhc3Nlc3MgdGhlIHZ1bG5lcmFiaWxpdHkgcHJvcGVybHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTkwOlx0ICogQHNrYjogYnVmZmVyIGNvbnRhaW5pbmcgbWVzc2FnZVxuIDE5MTpcdCAqIEBiOiBiZWFyZXIgdGhhdCBtZXNzYWdlIGFycml2ZWQgb25cbiAxOTI6XHQgKi9cbiAxOTM6XHR2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIDE5NDpcdFx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4gMTk1Olx0e1xuIDE5NjpcdFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XG4gMTk3Olx0XHRzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTtcbiAxOTg6XHRcdHUzMiBwbmV0X2hhc2g7XG4gMTk5Olx0XHR1MTYgY2FwcztcbiAyMDA6XHRcdGJvb2wgbGVnYWN5ID0gdG4tXHUwMDNlbGVnYWN5X2FkZHJfZm9ybWF0O1xuIDIwMTpcdFx0dTMyIHN1Z2c7XG4gMjAyOlx0XHR1MzIgc2lnbmF0dXJlO1xuIDIwMzpcdFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xuIDIwNDpcdFx0dTMyIGRzdDtcbiAyMDU6XHRcdHUzMiBuZXRfaWQ7XG4gMjA2Olx0XHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuIDIwNzpcdFx0dTMyIHNyYztcbiAyMDg6XHRcdHUzMiBtdHlwO1xuIDIwOTpcdFx0Ym9vbCBkdXBsX2FkZHIgPSBmYWxzZTtcbiAyMTA6XHRcdGJvb2wgcmVzcG9uZCA9IGZhbHNlO1xuIDIxMTpcdFx0dTMyIHNlbGY7XG4gMjEyOlx0XHRpbnQgZXJyO1xuIDIxMzpcdFxuIDIxNDpcdFx0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4gMjE1Olx0XHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXG4gMjE2Olx0XHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcbiAyMTc6XHRcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4gMjE4Olx0XHQgKiByZWFkaW5nIHRoZW0uXG4gMjE5Olx0XHQgKi9cbiAyMjA6XHRcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbiAyMjE6XHRcdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICYjNDM7IE5PREVfSURfTEVOKSB7XG4gMjIyOlx0XHRcdGtmcmVlX3NrYihza2IpO1xuIDIyMzpcdFx0XHRyZXR1cm47XG4gMjI0Olx0XHR9XG4gMjI1Olx0XG4gMjI2Olx0XHRpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7XG4gMjI3Olx0XHRcdGtmcmVlX3NrYihza2IpO1xuIDIyODpcdFx0XHRyZXR1cm47XG4gMjI5Olx0XHR9XG4gMjMwOlx0XHRoZHIgPSBidWZfbXNnKHNrYik7XG4gMjMxOlx0XHRwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpO1xuIDIzMjpcdFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuIDIzMzpcdFx0c3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpO1xuIDIzNDpcdFx0c2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4gMjM1Olx0XHRkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcbiAyMzY6XHRcdG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpO1xuIDIzNzpcdFx0c3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4gMjM4Olx0XHRtdHlwID0gbXNnX3R5cGUoaGRyKTtcbiAyMzk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTc2NQoJCQkJCQkJb3V0cHV0OiAxMDgKCQkJCQkJCXRob3VnaHRzOiAxNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgVGhpcyBUSVBDIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgYSBnb29kLCBzZW5zaWJsZSBhZGRpdGlvbi4gSXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGxvb2tpbmcgYXQgYG1zZ19oZHJfc3ooaGRyKWAgYW5kIGBtc2dfc2l6ZShoZHIpYC4gV2UmIzM5O3JlIHZlcmlmeWluZyBpZiB0aGVzZSBzaXplcyBhcmUgd2l0aGluIHNlbnNpYmxlIGJvdW5kcywgY29tcGFyaW5nIHRoZW0gdG8gYE1BWF9IX1NJWkVgIGFuZCBgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAuIFRoaXMgaXMgcmVhY2hhYmxlIHRocm91Z2ggYHRpcGNfcmN2YCwgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBpbmNvbWluZyBUSVBDIHBhY2tldHMuCgpGcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUsIHRoaXMgaXMgaW1wb3J0YW50LiBUaGlzIGtpbmQgb2YgY2hlY2sgaXMgYWx3YXlzIHdvcnRod2hpbGUgdG8gcHJldmVudCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyBvciBvdGhlciBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMgYXJpc2luZyBmcm9tIG1hbGZvcm1lZCBvciBtYWxpY2lvdXMgbWVzc2FnZXMuIEl0IG1ha2VzIHNlbnNlIHRvIGZ1enogdGhpcy4KCk15IHByaW1hcnkgZm9jdXMgaGVyZSwgZm9yIGZ1enppbmcgcHVycG9zZXMsIGlzIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgYHRpcGNfZGlzY19yY3ZgLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGNvbmNlbnRyYXRlIG15IGluaXRpYWwgZWZmb3J0cy4KCkkgc2hvdWxkIGFsc28gbWFrZSBzdXJlIGFsbCByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhvcm91Z2ggdGVzdGluZy4gQXNpZGUgZnJvbSB0aGUgYmFzaWMgYFRJUENgIGNvbmZpZ3VyYXRpb24sIGxldCBtZSBkb3VibGUtY2hlY2sgZm9yIHJlbGF0ZWQgY29uZmlncy4gQWhhLCBgVElQQ19NRURJQV9VRFBgIHdvdWxkIGJlIGFuIGV4Y2VsbGVudCBjaG9pY2UgdG8gaW5jbHVkZSEgRW5hYmxpbmcgVElQQyBvdmVyIFVEUCBpcyBhIGNvbW1vbiBhcHByb2FjaCBmb3IgZnV6emluZyBUSVBDIGltcGxlbWVudGF0aW9ucywgbWFraW5nIGl0IGVhc2llciB0byBjcmFmdCBhbmQgaW5qZWN0IFVEUCBwYWNrZXRzIHRvIHRlc3QgdGhlIG5ldyBib3VuZHMgY2hlY2tpbmcuIFNvLCBJIHdpbGwgYWRkIGBUSVBDX01FRElBX1VEUGAgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBjb25maWd1cmF0aW9ucyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgbW9yZSBjb21wbGV0ZSB0ZXN0aW5nIGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VElQQyYjMzQ7LAogICAgJiMzNDtUSVBDX01FRElBX1VEUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VElQQyYjMzQ7LAogICAgJiMzNDtUSVBDX01FRElBX1VEUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxuXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJiMzOTtzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0MzI0ZDY3NWQyNWYyMTEyYjE5OWQ3YTQ3MTYzMTFiNzk3ZWYwMjQyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCA2ODUzODlkNGIyNDVlLi43NDY3M2NhMWYyZDUwIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTE5NSwyNyAmIzQzOzE5NSw0NyBAQCB2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogewogCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOwogCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpOwotCXUzMiBwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpOwotCXUxNiBjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7CiYjNDM7CXUzMiBwbmV0X2hhc2g7CiYjNDM7CXUxNiBjYXBzOwogCWJvb2wgbGVnYWN5ID0gdG4tJmd0O2xlZ2FjeV9hZGRyX2Zvcm1hdDsKLQl1MzIgc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpOwotCXUzMiBzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTsKJiM0MzsJdTMyIHN1Z2c7CiYjNDM7CXUzMiBzaWduYXR1cmU7CiAJdTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9OwotCXUzMiBkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTsKLQl1MzIgbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7CiYjNDM7CXUzMiBkc3Q7CiYjNDM7CXUzMiBuZXRfaWQ7CiAJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjsKLQl1MzIgc3JjID0gbXNnX3ByZXZub2RlKGhkcik7Ci0JdTMyIG10eXAgPSBtc2dfdHlwZShoZHIpOwomIzQzOwl1MzIgc3JjOwomIzQzOwl1MzIgbXR5cDsKIAlib29sIGR1cGxfYWRkciA9IGZhbHNlOwogCWJvb2wgcmVzcG9uZCA9IGZhbHNlOwogCXUzMiBzZWxmOwogCWludCBlcnI7CiAKJiM0MzsJLyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyCiYjNDM7CSAqIHBsdXMgYSBub2RlIGlkZW50aXR5LCBzZWUgdGlwY19kaXNjX2luaXRfbXNnKCkuIFRoZSBoZWFkZXIKJiM0MzsJICogZmllbGRzIGFuZCB0aGUgbWVkaWEgYWRkcmVzcyBhcmVhIGFjY2Vzc2VkIGJlbG93IGxpdmUgYmV5b25kCiYjNDM7CSAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlCiYjNDM7CSAqIHJlYWRpbmcgdGhlbS4KJiM0MzsJICovCiYjNDM7CWlmIChtc2dfaGRyX3N6KGhkcikgJmx0OyBNQVhfSF9TSVpFIHx8CiYjNDM7CSAgICBtc2dfc2l6ZShoZHIpICZsdDsgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTikgewomIzQzOwkJa2ZyZWVfc2tiKHNrYik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAlpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQogCWhkciA9IGJ1Zl9tc2coc2tiKTsKJiM0MzsJcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTsKJiM0MzsJY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpOwomIzQzOwlzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7CiYjNDM7CXNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpOwomIzQzOwlkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTsKJiM0MzsJbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7CiYjNDM7CXNyYyA9IG1zZ19wcmV2bm9kZShoZHIpOwomIzQzOwltdHlwID0gbXNnX3R5cGUoaGRyKTsKIAogCWlmIChjYXBzICZhbXA7IFRJUENfTk9ERV9JRDEyOCkKIAkJbWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyMDY0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIENvbnNpZGVyYXRpb24gZm9yIGEgVElQQyBEaXNjb3ZlcnkgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBpdCBkZWxheXMgc29tZSBmaWVsZCByZWFkcyBmcm9tIHRoZSBgdGlwY19tc2dgIGhlYWRlciB1bnRpbCBhZnRlciBpdCBjaGVja3MgdGhlIG1lc3NhZ2Ugc2l6ZSBhbmQgbGluZWFyaXplcyB0aGUgYHNrYmAuIFRoZSBvcmlnaW5hbCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCByZWFkcyBzdHVmZiBsaWtlIGBtc2dfcGVlcl9uZXRfaGFzaGAsIGBtc2dfbm9kZV9jYXBhYmlsaXRpZXNgLCByaWdodCBvZmYgdGhlIGJhdCBmcm9tIHRoZSBgc2tiYCBkYXRhLiBOb3csIHRoZSBtYWluIHByb2JsZW0gdGhpcyBpcyBmaXhpbmcsIGFzIGZhciBhcyBJIGNhbiBzZWUsIGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBpZiB0aGUgYHNrYmAgaXMgc21hbGxlciB0aGFuIGV4cGVjdGVkLCBvciBpZiB0aGVyZSYjMzk7cyBmcmFnbWVudGF0aW9uLgoKTXkgaW1tZWRpYXRlIHRob3VnaHQsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhlIGNvbnRleHQgb2Yga2VybmVsIGNvZGUsIGlzIHRoYXQgdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOLiAgQnV0IHRoZW4gSSBwYXVzZTogYW0gSSB0aGlua2luZyBvZiB0aGlzIGNvcnJlY3RseT8gSXMgaXQgS01TQU4gdGVycml0b3J5PyBXYWl0LCBpZiB0aGUgc2tiIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzdHJ1Y3QgaXQmIzM5O3MgcG9pbnRpbmcgdG8sIHRoZW4gcmVhZGluZyBiZXlvbmQgdGhhdCBsZW5ndGggd291bGQgYmUgcmVhZGluZyBvdXRzaWRlIHRoZSBkYXRhIHRoYXQgd2FzIGluaXRpYWxpemVkLCB3aGljaCBjb3VsZCBiZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4gY291bGQgY2F0Y2ggdGhpcywgZXNwZWNpYWxseSBpZiB0aGUgYWxsb2NhdGlvbiBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgZGF0YS4KCkkgc3RhcnQgdG8gdGhpbmsgYWJvdXQgdGhlIGRpZmZlcmVudCB0b29scyBhdmFpbGFibGUgdG8gbWUuIElmIGl0IGdvZXMgYmV5b25kIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBLQVNBTiAqc2hvdWxkKiBjYXRjaCBpdC4gQnV0LCBLQVNBTiBjYW4gbWlzcyBpdCBpZiBpdCBkb2VzIG5vdCBnbyBwYXN0IHRoZSBhbGxvY2F0aW9uIHNpemUgYW5kIHRoYXQgaXMgYSBtdWNoIGdyZWF0ZXIgcmlzay4gVGhlIHBhY2tldCBtaWdodCBiZSBvbmx5IGEgZmV3IGJ5dGVzIGluIHNpemUuIFRoZSBkYXRhIGJ1ZmZlciBpcyBvZnRlbiBtdWNoIGxhcmdlciAoZS5nLiwgTVRVIG9yIHBhZ2Ugc2l6ZSkuIFNvLCByZWFkaW5nIHRob3NlIGhlYWRlciBmaWVsZHMgZnJvbSBhIHNtYWxsIHBhY2tldCBjYW4gcmVhZCBpbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgS01TQU4gaXMgdGhlIGNvcnJlY3QgdG9vbC4gIEl0JiMzOTtzIHZlcnkgZ29vZCBhdCBjYXRjaGluZyByZWFkcyBiZXlvbmQgYHNrYi0mZ3Q7bGVuYCB3aGVyZSB0aGUgYnVmZmVyIGl0c2VsZiBpcyBsYXJnZXIuCgpBbmQgdGhlIHByb21wdCwgYWgsIHRoYXQmIzM5O3Mgd2hhdCYjMzk7cyBpbXBvcnRhbnQuIEl0IHNheXMsICYjMzQ7TmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMuLi4gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLiYjMzQ7ICBJIHNlZS4uLiB0aGlzIHBhdGNoIG1vZGlmaWVzIHRoZSBib3VuZHMgY2hlY2tzLiBJdCAqZml4ZXMqIGEgc2l0dWF0aW9uIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdhcyBiZWluZyBhY2Nlc3NlZCEKClNvLCB0aGUgY29kZSAqZml4ZXMqIGFuIGlzc3VlLCBidXQgaXMgdGhlIGZpeCBjb3JyZWN0IGFuZCBjb21wbGV0ZT8gSSByZWFkIHRoZSBwYXRjaCBtb3JlIGNhcmVmdWxseS4gSXQmIzM5O3MgYWRkaW5nIHRoaXMgY2hlY2s6CmBgYGMKCWlmIChtc2dfaGRyX3N6KGhkcikgJmx0OyBNQVhfSF9TSVpFIHx8CgkgICAgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pIHsKCQlrZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm47Cgl9CmBgYApBbmQgaXQgZG9lcyB0aGlzICpiZWZvcmUqIGxpbmVhcml6aW5nLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgZmllbGQgcmVhZHMgdG8gYWZ0ZXIgdGhlIGNoZWNrcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBiZWZvcmUgdGhlIHBhdGNoIHdhcyB2dWxuZXJhYmxlIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLgoKVGhlIHByb21wdCBub3cgcmVhZHM6ICYjMzQ7U2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcyB0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLiYjMzQ7CgpTaW5jZSBpdCYjMzk7cyBmaXhpbmcgdGhlIHJlYWQtYmV5b25kLWBza2ItJmd0O2xlbmAgY2FzZSwgdGhpcyBzZWVtcyBsaWtlICpleGFjdGx5KiB0aGUga2luZCBvZiBzaXR1YXRpb24gS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBUaGUgcGF0Y2ggY2hhbmdlcyBob3cgd2UmIzM5O3JlIGFjY2Vzc2luZyB0aG9zZSB1bmluaXRpYWxpemVkIGJ5dGVzIGluIGFuIGBza2JgLCBieSBwcmV2ZW50aW5nIHRoZSBhY2Nlc3MhICBCdXQsIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoaXMgaXMgc29saWQsIGFuZCB0aGVyZSBjb3VsZCBiZSBsYXRlbnQgYnVncy4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoaXMgYXJlYSBvZiB0aGUgY29kZSBpcyBzb3VuZCwgS01TQU4gaXMgcHJvYmFibHkgdGhlIGFwcHJvcHJpYXRlIHRvb2wsIGFuZCBJIHNob3VsZCBydW4gYSBLTVNBTiBmdXp6ZXIgdG8gZ2l2ZSBpdCBhIGdvb2QgZ29pbmctb3Zlci4KClNvLCB0aGUgZmluYWwgY2FsbCBpczogZ2l2ZW4gdGhlIHBhdGNoICptb2RpZmllcyogdGhlIGJvdW5kcyBjaGVja3MsIGFuZCB0aG9zZSBjaGFuZ2VzIHByZXZlbnQgdGhlIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhIGJ1ZmZlciosIGFuZCBzaW5jZSBLTVNBTiBzcGVjaWZpY2FsbHkgaGVscHMgdXMgY2F0Y2ggcmVhZHMgYmV5b25kIGBza2ItJmd0O2xlbmAgdGhhdCBLQVNBTiBtaWdodCBtaXNzLCBJIG5lZWQgdG8gaW5jbHVkZSBgTmVlZHNLTVNBTj10cnVlYCB0byBwcm9wZXJseSB2ZXJpZnkgdGhhdCB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaXMgc291bmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21zZ19wZWVyX25ldF9oYXNoJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3RpcGMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzAtXHRoZHIgPSBidWZfbXNnKHNrYik7XG5uZXQvdGlwYy9kaXNjb3Zlci5jOjIzMTpcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG5uZXQvdGlwYy9kaXNjb3Zlci5jLTIzMi1cdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbi0tXG5uZXQvdGlwYy9tc2cuaD0xMTIzPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbi0tXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxubmV0L3RpcGMvbXNnLmg6MTEyODpzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTc1MgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1zZ19wZWVyX25ldF9oYXNoYCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG5ldC90aXBjL21zZy5oYCBhZ2Fpbiwgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBgbXNnX3BlZXJfbmV0X2hhc2hgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSBUSVBDJiMzOTtzIGhhbmRsaW5nIG9mIG5ldHdvcmsgcGVlciBpZGVudGlmaWVycyBhbmQgdGhlaXIgaGFzaGluZyBjb21lcyBpbnRvIHBsYXkuIEkgbmVlZCBhIHJlZnJlc2hlciBvbiB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIGhlcmUsIGFuZCBob3cgaXQgcmVsYXRlcyB0byB0aGUgYnJvYWRlciBjb25uZWN0aW9uIG1hbmFnZW1lbnQgaW4gdGhlIFRJUEMgYXJjaGl0ZWN0dXJlLiBJJiMzOTttIGFzc3VtaW5nIHRoYXQgdGhpcyBoYXNoIGZ1bmN0aW9uIHBsYXlzIGEgY3J1Y2lhbCByb2xlIGluIGVmZmljaWVudCBsb29rdXBzIGFuZCBwb3RlbnRpYWxseSBsb2FkIGJhbGFuY2luZyBmb3IgbmV0d29yayBtZXNzYWdlcy4gSSB3YW50IHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsaWducyB3aXRoIGJlc3QgcHJhY3RpY2VzIGZyb20gYSBwZXJmb3JtYW5jZSBwZXJzcGVjdGl2ZS4gSSB3aWxsIGFsc28gbWFrZSBzdXJlIHRoYXQgc2VjdXJpdHkgaW1wbGljYXRpb25zIHdlcmUgYWRkcmVzc2VkIGR1cmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHN0cnVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXNnX3BlZXJfbmV0X2hhc2gmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaD0xMTIzPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbi0tXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxubmV0L3RpcGMvbXNnLmg6MTEyODpzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjEwMgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnZSBIZWFkZXIqKgoKT2theSwgbGV0JiMzOTtzIHplcm8gaW4gb24gYG5ldC90aXBjL21zZy5oYC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHZlcmlmeSBzb21lIGFzc3VtcHRpb25zIGFib3V0IHRoZSBtZXNzYWdlIGhlYWRlciBzdHJ1Y3R1cmUsIHNvIEkmIzM5O20gbmF2aWdhdGluZyBkb3duIHRvIGFyb3VuZCBsaW5lIDExMjguIEkga25vdyB0aGVyZSYjMzk7cyBrZXkgZGF0YSBhYm91dCBtZXNzYWdlIHR5cGVzLCBwcmlvcml0aWVzLCBhbmQgZGVsaXZlcnkgZmxhZ3MgZGVjbGFyZWQgaW4gdGhhdCB2aWNpbml0eS4gSSYjMzk7bSBwcm9iYWJseSBsb29raW5nIGZvciB0aGUgc3RydWN0IGRlZmluaXRpb24gdGhhdCBkZWZpbmVzIHRoZSBsYXlvdXQgb2YgdGhlIFRJUEMgbWVzc2FnZSBoZWFkZXIgaXRzZWxmLiBJIHdhbnQgdG8gcXVpY2tseSBjb25maXJtIHRoZSBmaWVsZHMgYW5kIHRoZWlyIGJpdHdpc2UgZW5jb2RpbmdzIGJlZm9yZSBJIGFuYWx5emUgdGhlIHJlbGF0ZWQgY29kZS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBkZXN0aW5hdGlvbiBub2RlIElELCBwb3J0IElELCBvciB0aGUgc2VydmljZSB0eXBlLCBhcyB3ZWxsIGFzIHRoZSBmbGFncyB0aGF0IGRldGVybWluZSByZXRyYW5zbWlzc2lvbiBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRyeWluZyB0byByZW1lbWJlciBpZiB0aGUgZmxhZ3MgZm9yIGZyYWdtZW50ZWQgbWVzc2FnZXMgYXJlIHBsYWNlZCBpbiB0aGUgaGVhZGVyLCBvciBzb21ld2hlcmUgZWxzZS4gSSYjMzk7bGwgZm9jdXMgb24gYW55dGhpbmcgcmVsYXRlZCB0byBzZXF1ZW5jZSBudW1iZXJzIG9yIGFja25vd2xlZGdlbWVudHMgYXQgdGhhdCBzcG90IGFzIHdlbGwuIFRpbWUgdG8gZ2V0IHRoZSBkZXRhaWxzIHJpZ2h0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTEyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTIwOlx0XG4xMTIxOlx0LyogV29yZCAxM1xuMTEyMjpcdCAqL1xuMTEyMzpcdHN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbjExMjQ6XHR7XG4xMTI1Olx0XHRtc2dfc2V0X3dvcmQobSwgMTMsIG4pO1xuMTEyNjpcdH1cbjExMjc6XHRcbjExMjg6XHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG4xMTI5Olx0e1xuMTEzMDpcdFx0cmV0dXJuIG1zZ193b3JkKG0sIDEzKTtcbjExMzE6XHR9XG4xMTMyOlx0XG4xMTMzOlx0LyogV29yZCAxNFxuMTEzNDpcdCAqL1xuMTEzNTpcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19zdWdnX25vZGVfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0pXG4xMTM2Olx0e1xuMTEzNzpcdFx0cmV0dXJuIG1zZ193b3JkKG0sIDE0KTtcbjExMzg6XHR9XG4xMTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2NjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxNDIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyBEaXNjb3ZlcnkgTWVzc2FnZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyB0aGlzIFRJUEMgY29kZSBoYW5kbGVzIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlcy4gSSBzZWUgdGhhdCB2YXJpb3VzIGZpZWxkcyB3aXRoaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIGFyZSBiZWluZyBhY2Nlc3NlZCBhdCBzcGVjaWZpYyBvZmZzZXRzLiBGb3IgZXhhbXBsZSwgYG1zZ19wZWVyX25ldF9oYXNoYCBpcyByZWFkIGF0IG9mZnNldCA1MiBieXRlcywgYG1zZ19zdWdnX25vZGVfYWRkcmAgYXQgb2Zmc2V0IDU2LCBhbmQgc28gb24uCgpUaGUgcGF0Y2ggaW5jbHVkZXMgYSBzaXplIGNoZWNrOiBgaWYgKG1zZ19oZHJfc3ooaGRyKSAmbHQ7IE1BWF9IX1NJWkUgfHwgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGlmIHRoZSBpbmNvbWluZyBwYWNrZXQgaXMgc21hbGxlciB0aGFuIGBNQVhfSF9TSVpFYCAobGlrZWx5IDYwIGJ5dGVzLCBvciAxNSB3b3JkcywgYmFzZWQgb24gbXkgdW5kZXJzdGFuZGluZyksIHRoZW4gcmVhZGluZyBhdCB0aGUgb2Zmc2V0cyBsaWtlIDUyIG9yIDU2IHdvdWxkIGxlYWQgdG8gYW4gb3V0LW9mLWJvdW5kcyByZWFkLCByaWdodD8KCkJ1dCB0aGVuIEkgcmVhbGl6ZSBpdCYjMzk7cyBtb3JlIHN1YnRsZS4gSWYgdGhlIHBhY2tldCBpcyBmcm9tIHRoZSBuZXR3b3JrLCB0aGUgYHNrYmAgaXMgYWxsb2NhdGVkIGJ5IHRoZSBuZXR3b3JrIGRyaXZlciwgcHJvYmFibHkgd2l0aCBlbm91Z2ggc3BhY2UgZm9yIGFuIE1UVSBvciBhIHBhZ2UuIFRoZSBkcml2ZXIgZmlsbHMgdGhlIGJ1ZmZlciB3aXRoIHRoZSByZWNlaXZlZCBkYXRhIGFuZCBzZXRzIGBza2ItJmd0O2xlbmAgdG8gdGhlIGFjdHVhbCBwYWNrZXQgc2l6ZS4gU28sIGlmIHRoZSBwYWNrZXQgaXMsIHNheSwgMjAgYnl0ZXMsIHRoZSBidWZmZXIgbWlnaHQgYmUgMTUwMCBieXRlcyBsb25nLCBidXQgb25seSB0aGUgZmlyc3QgMjAgYXJlIGluaXRpYWxpemVkLiBUaGUgYnl0ZXMgZnJvbSAyMCB0byAxNTAwIHdpbGwgY29udGFpbiBnYXJiYWdlIG9yIG9sZCBkYXRhLgoKTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkPyBSZWd1bGFyIEtBU0FOIHdpbGwgbm90IGRldGVjdCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgYmVjYXVzZSB0aGUgcmVhZCBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtBU0FOIG9ubHkgY2hlY2tzIHRoYXQgdGhlIGFjY2VzcyBpcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IGttYWxsb2Mva2ZyZWUvZXRjLiBIb3dldmVyLCBLTVNBTiwgd2hpY2ggdHJhY2tzIGluaXRpYWxpemF0aW9uIHN0YXR1cywgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyB0eXBlIG9mIGJ1Zy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgaG9va3MgaW50byBza2IgdG8gbWFyayB0aGUgYnl0ZXMgcGFzdCBgc2tiLSZndDtsZW5gIGFzIHVuaW5pdGlhbGl6ZWQuCgpUaGVuIHRoZSBrZXkgdGhpbmcsIHRoaXMgc2l0dWF0aW9uIGlzIGV4YWN0bHkgd2hhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaDogdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIG5ldHdvcmsgcHJvdG9jb2wgcGFyc2luZyEgVGhlIHBhdGNoIG1vZGlmaWVzIGJvdW5kcyBjaGVja3MuIEFuZCB0aGlzIHBhdGNoIGZhbGxzIHVuZGVyIHRoZSBjYXRlZ29yeSBvZiBwb3RlbnRpYWwgS01TQU4gdHJpZ2dlcnM7IGl0JiMzOTtzIHJlbGF0ZWQgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHByZXZlbnQgcmVhZGluZyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGFuIHNrYi4gS01TQU4gaXMgbmVlZGVkLCBldmVuIGlmIHRoZSBwYXRjaCAqZml4ZXMqIHRoZSBidWcsIHdlIHN0aWxsIHdhbnQgdG8gcnVuIEtNU0FOIHRvIHZlcmlmeSB0aGUgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgcGF0aHMgYWxsb3cgdW5pbml0aWFsaXplZCByZWFkcyEgU28sIHllcywgd2Ugc2hvdWxkIGRlZmluaXRlbHkgdXNlIEtNU0FOIGhlcmUuCgpMZXQmIzM5O3MgdmVyaWZ5IHRoaXMsIEkga25vdyB0aGF0IGlmIGFuIHNrYiBidWZmZXIgaXMgYWxsb2NhdGVkIHdpdGgga21hbGxvYygyNTYpIGFuZCB0aGUgcGFja2V0IGlzIG9ubHkgMjAgYnl0ZXMsIEtBU0FOIHdvbiYjMzk7dCBjb21wbGFpbiBiZWNhdXNlIGFjY2Vzc2luZyBtZW1vcnkgdXAgdG8gMjU2IGJ5dGVzIGlzIGxlZ2FsLCBldmVuIGlmIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiB3b3VsZCByYWlzZSBhbiBlcnJvciBiZWNhdXNlIGl0IGtub3dzIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiBpcyBkZWZpbml0ZWx5IHRoZSB0b29sIGZvciB0aGlzIGtpbmQgb2YgYnVnLgoKSSBzaG91bGQgYWxzbyBjb25zaWRlciBmcmFnbWVudGF0aW9uLiBJZiBhIHBhY2tldCBpcyBmcmFnbWVudGVkLCB0aGUgYHNrYi0mZ3Q7ZGF0YWAgbWlnaHQgb25seSBjb250YWluIHBhcnQgb2YgdGhlIGRhdGEsIHdpdGggdGhlIHJlc3QgaW4gYHNrYl9zaGluZm8oc2tiKS0mZ3Q7ZnJhZ3NgLiBSZWFkaW5nIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAgd291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgdGFpbHJvb20uIEdvb2QgdGhpbmcgdGhlIHBhdGNoIGluY2x1ZGVzIGBza2JfbGluZWFyaXplKHNrYilgISBJZiBpdCBsaW5lYXJpemVzLCBpdCBjb3BpZXMgZXZlcnl0aGluZyBhbmQgYXZvaWRzIGZyYWdtZW50YXRpb24gaXNzdWVzLiBCdXQgZG9lcyB0aGlzIGd1YXJhbnRlZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkPyBXaGF0IGlmIGBza2ItJmd0O2xlbmAgaXMgc21hbGxlciB0aGFuIHRoZSByZXF1aXJlZCBzaXplPwoKTm93LCB0aGUgY2hlY2s6IGBtc2dfc2l6ZShoZHIpICZsdDsgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAgc2VlbXMgdG8gYmUgY2hlY2tpbmcgdGhlIHNpemUgZmllbGQgKmluIHRoZSBoZWFkZXIqLCBub3QgbmVjZXNzYXJpbHkgYHNrYi0mZ3Q7bGVuYC4gSSBuZWVkIHRvIGNvbmZpcm0gaG93IGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBhcmUgaW1wbGVtZW50ZWQuIElzIHRoYXQgYWN0dWFsbHkgY2hlY2tpbmcgdGhlIGhlYWRlciYjMzk7cyBkZWNsYXJlZCBzaXplIGFnYWluc3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXI/IElmIG5vdCwgdGhlIGNoZWNrIGlzIHVzZWxlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21zZ19oZHJfc3omIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaD0yNTI9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdXNlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxuLS1cbm5ldC90aXBjL21zZy5oLTI1Ni1cbm5ldC90aXBjL21zZy5oOjI1NzpzdGF0aWMgaW5saW5lIHUzMiBtc2dfaGRyX3N6KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTI1OC17XG4tLVxubmV0L3RpcGMvbXNnLmg9Mjc3PXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19kYXRhX3N6KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTI3OC17XG5uZXQvdGlwYy9tc2cuaDoyNzk6XHRyZXR1cm4gbXNnX3NpemUobSkgLSBtc2dfaGRyX3N6KG0pO1xubmV0L3RpcGMvbXNnLmgtMjgwLX1cbi0tXG5uZXQvdGlwYy9tc2cuaD0zNjc9c3RhdGljIGlubGluZSB1bmNoYXIgKm1zZ19kYXRhKHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTM2OC17XG5uZXQvdGlwYy9tc2cuaDozNjk6XHRyZXR1cm4gKCh1bmNoYXIgKiltKSAmIzQzOyBtc2dfaGRyX3N6KG0pO1xubmV0L3RpcGMvbXNnLmgtMzcwLX1cbi0tXG5uZXQvdGlwYy9tc2cuaD02MTk9c3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTYyMC17XG5uZXQvdGlwYy9tc2cuaDo2MjE6XHRyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSBTSE9SVF9IX1NJWkU7XG5uZXQvdGlwYy9tc2cuaC02MjItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5Mzc1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRlY29kaW5nIE1lc3NhZ2UgSGVhZGVyczogQSBRdWljayBBc3Nlc3NtZW50KioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBncmFiYmluZyB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIHVwZnJvbnQuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0d28ga2V5IHBpZWNlcyBvZiBkYXRhOiBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAuIFRoZXNlIGFyZSB0aGUgZm91bmRhdGlvbmFsIGVsZW1lbnRzLCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG15IGFuYWx5c2lzLiBgbXNnX2hkcl9zemAgdGVsbHMgbWUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpdHNlbGYg4oCTIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG1ldGFkYXRhIGFuZCBjb250cm9sIGluZm9ybWF0aW9uIHBhY2tlZCB3aXRoaW4uIFRoZW4gdGhlcmUmIzM5O3MgYG1zZ19zaXplYCwgdGhlIG92ZXJhbGwgbWVzc2FnZSBzaXplLiBHZXR0aW5nIHRoZXNlIHR3byBpbW1lZGlhdGVseSBoZWxwcyBidWlsZCBhIG1lbnRhbCBtb2RlbCBvZiB0aGUgc3RydWN0dXJlLiBJIGNhbiBkZWR1Y2UgaG93IG11Y2ggZGF0YSBpcyBoZWFkZXIgdnMgcGF5bG9hZCBhbmQgdGhhdCB1bmRlcnN0YW5kaW5nIGlzIGVzc2VudGlhbCBiZWZvcmUgSSBldmVuIGdldCBpbnRvIGRldGFpbHMuIEkmIzM5O20gYnVpbGRpbmcgYSBmcmFtZSBvZiByZWZlcmVuY2UgZm9yIHRoZSBzdWJzZXF1ZW50IHBhcnNpbmcgYW5kIGludGVycHJldGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNTA6XHR9XG4gMjUxOlx0XG4gMjUyOlx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdXNlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxuIDI1MzpcdHtcbiAyNTQ6XHRcdG1zZ19zZXRfYml0cyhtLCAwLCAyNSwgMHhmLCBuKTtcbiAyNTU6XHR9XG4gMjU2Olx0XG4gMjU3Olx0c3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXG4gMjU4Olx0e1xuIDI1OTpcdFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIFx1MDAzY1x1MDAzYyAyO1xuIDI2MDpcdH1cbiAyNjE6XHRcbiAyNjI6XHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbiAyNjM6XHR7XG4gMjY0Olx0XHRtc2dfc2V0X2JpdHMobSwgMCwgMjEsIDB4Ziwgblx1MDAzZVx1MDAzZTIpO1xuIDI2NTpcdH1cbiAyNjY6XHRcbiAyNjc6XHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0pXG4gMjY4Olx0e1xuIDI2OTpcdFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDAsIDB4MWZmZmYpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTM3CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqQW5hbHl6aW5nIFBvdGVudGlhbCBQYWNrZXQgVnVsbmVyYWJpbGl0eSoqCgpSaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkga2V5aW5nIGluIG9uIHRoZXNlIHZhcmlhYmxlcyDigJMgYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgLiBUaGV5JiMzOTtyZSBiZWluZyBwdWxsZWQgcmlnaHQgZnJvbSB0aGUgcGFja2V0IGl0c2VsZiwgc3BlY2lmaWNhbGx5IGZyb20gd29yZCAwLiBDbGFzc2ljIGNhc2Ugb2YgdHJ1c3RpbmcgdGhlIGRhdGEsIGh1aD8gTXkgZ3V0IHJlYWN0aW9uIGlzIGFsd2F5cyB0byB0aGluayBhYm91dCBwb3RlbnRpYWwgZXhwbG9pdHMuCgpBbmQgKmJvb20qLCB0aGVyZSBpdCBpcy4gSWYgdGhlIHBhY2tldCYjMzk7cyBhY3R1YWxseSBzbWFsbGVyIHRoYW4gZm91ciBieXRlcywgcmVhZGluZyB0aGF0IGZpcnN0IHdvcmQgaXMgZ29pbmcgdG8gYmUgYSBkaXNhc3Rlci4gRWl0aGVyIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgb3IsIGV2ZW4gd29yc2UsIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQmIzM5O3MgYSBodWdlIHJlZCBmbGFnIOKAkyBhIHBlcmZlY3QgdmVjdG9yIGZvciBpbmplY3Rpb24gaWYgd2UmIzM5O3JlIG5vdCBjYXJlZnVsLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHdoZXJlIGlzIGB0aXBjX2Rpc2NfcmN2YCBiZWluZyBjYWxsZWQgZnJvbT8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSB0aGF0IGZ1bmN0aW9uIGFuZCBzZWUgd2hlcmUgdGhpcyBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZGF0YSBpcyBvcmlnaW5hdGluZy4gSXMgaXQgY29taW5nIGZyb20gYSB0cnVzdGVkIHNvdXJjZSwgb3IgaXMgaXQgZXhwb3NlZCB0byB1bnRydXN0ZWQgaW5wdXQ/IEkgbmVlZCB0byBnZXQgdG8gdGhlIHJvb3Qgb2YgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBleHRlbnQgb2YgdGhlIHBvc3NpYmxlIHZ1bG5lcmFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYz0xNDE9c3RhdGljIGJvb2wgdGlwY19kaXNjX2FkZHJfdHJpYWxfbXNnKHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjE4ODogKiB0aXBjX2Rpc2NfcmN2IC0gaGFuZGxlIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlIChyZXF1ZXN0IG9yIHJlc3BvbnNlKVxubmV0L3RpcGMvZGlzY292ZXIuYy0xODktICogQG5ldDogYXBwbGljYWJsZSBuZXQgbmFtZXNwYWNlXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTItICovXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjE5Mzp2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXHRcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbi0tXG5uZXQvdGlwYy9kaXNjb3Zlci5oPTQ3PXZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKnJlcSk7XG5uZXQvdGlwYy9kaXNjb3Zlci5oOjQ4OnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpidWYsXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTtcbi0tXG5uZXQvdGlwYy9ub2RlLmM9MjA4Mz12b2lkIHRpcGNfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxuLS1cbm5ldC90aXBjL25vZGUuYy0yMTI1LVx0XHRpZiAodW5saWtlbHkodXNyID09IExJTktfQ09ORklHKSlcbm5ldC90aXBjL25vZGUuYzoyMTI2Olx0XHRcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcbm5ldC90aXBjL25vZGUuYy0yMTI3LVx0XHRlbHNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNzAzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYmFzZWQgb24geW91ciBwcm9tcHQ6CgoqKkRpdmluZyBpbnRvIFRJUEMgUmVjZWl2ZXIgTG9naWMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBgdGlwY19yY3ZgIGZ1bmN0aW9uLCBmb3VuZCBpbiBgbmV0L3RpcGMvbm9kZS5jYC4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgY29yZSBwYWNrZXQgcmVjZXB0aW9uIGxvZ2ljIGZvciBUSVBDIHJlc2lkZXMsIHJpZ2h0PyBJIHdhbnQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBtZXNzYWdlcyBhY3R1YWxseSBoaXQgdGhlIHN5c3RlbSwgaG93IHRoZXkmIzM5O3JlIHJvdXRlZCB3aXRoaW4gdGhlIG5vZGUsIGFuZCB3aGF0IHRoZSBmbG93IGNvbnRyb2wgbG9va3MgbGlrZSBhdCB0aGF0IGxldmVsLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGluIHRoYXQgcm91dGluZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgYXJlYXMgZm9yIG9wdGltaXphdGlvbiwgb3IgbWF5YmUgc29tZXRoaW5nIEkgbWlzc2VkIGxhc3QgdGltZSBJIGxvb2tlZC4gSSBleHBlY3QgdGhlIHVzdWFsIHN1c3BlY3RzIOKAkyBwYWNrZXQgaGVhZGVyIHBhcnNpbmcsIGFkZHJlc3MgbG9va3VwLCBidWZmZXIgbWFuYWdlbWVudCwgYW5kIHRoZSBmb3J3YXJkaW5nIHByb2Nlc3Mg4oCTIGJ1dCBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBmaW5lciBkZXRhaWxzIHRoaXMgdGltZS4gUGVyaGFwcyBJJiMzOTtsbCBmb2N1cyBvbiBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGVkIHBhY2tldHMgYW5kIGNvbm5lY3Rpb24gc3RhdGUsIGFuZCB3aGV0aGVyIGl0JiMzOTtzIHRoZSByaWdodCBwbGFjZSBmb3IgaW5zcGVjdGluZyByZWNlbnQgaXNzdWVzIEkmIzM5O3ZlIHJlYWQgYWJvdXQsIGluIHRoZSBtYWlsaW5nIGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvbm9kZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjA4MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDgzOlx0dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbjIwODQ6XHR7XG4yMDg1Olx0XHRzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHhtaXRxO1xuMjA4NjpcdFx0c3RydWN0IHRpcGNfbGlua19lbnRyeSAqbGU7XG4yMDg3Olx0XHRzdHJ1Y3QgdGlwY19tc2cgKmhkcjtcbjIwODg6XHRcdHN0cnVjdCB0aXBjX25vZGUgKm47XG4yMDg5Olx0XHRpbnQgYmVhcmVyX2lkID0gYi1cdTAwM2VpZGVudGl0eTtcbjIwOTA6XHRcdHUzMiBzZWxmID0gdGlwY19vd25fYWRkcihuZXQpO1xuMjA5MTpcdFx0aW50IHVzciwgcmMgPSAwO1xuMjA5MjpcdFx0dTE2IGJjX2FjaztcbjIwOTM6XHQjaWZkZWYgQ09ORklHX1RJUENfQ1JZUFRPXG4yMDk0Olx0XHRzdHJ1Y3QgdGlwY19laGRyICplaGRyO1xuMjA5NTpcdFxuMjA5NjpcdFx0LyogQ2hlY2sgaWYgbWVzc2FnZSBtdXN0IGJlIGRlY3J5cHRlZCBmaXJzdCAqL1xuMjA5NzpcdFx0aWYgKFRJUENfU0tCX0NCKHNrYiktXHUwMDNlZGVjcnlwdGVkIHx8ICF0aXBjX2VoZHJfdmFsaWRhdGUoc2tiKSlcbjIwOTg6XHRcdFx0Z290byByY3Y7XG4yMDk5Olx0XG4yMTAwOlx0XHRlaGRyID0gKHN0cnVjdCB0aXBjX2VoZHIgKilza2ItXHUwMDNlZGF0YTtcbjIxMDE6XHRcdGlmIChsaWtlbHkoZWhkci1cdTAwM2V1c2VyICE9IExJTktfQ09ORklHKSkge1xuMjEwMjpcdFx0XHRuID0gdGlwY19ub2RlX2ZpbmQobmV0LCBudG9obChlaGRyLVx1MDAzZWFkZHIpKTtcbjIxMDM6XHRcdFx0aWYgKHVubGlrZWx5KCFuKSlcbjIxMDQ6XHRcdFx0XHRnb3RvIGRpc2NhcmQ7XG4yMTA1Olx0XHR9IGVsc2Uge1xuMjEwNjpcdFx0XHRuID0gdGlwY19ub2RlX2ZpbmRfYnlfaWQobmV0LCBlaGRyLVx1MDAzZWlkKTtcbjIxMDc6XHRcdH1cbjIxMDg6XHRcdHNrYl9kc3RfZm9yY2Uoc2tiKTtcbjIxMDk6XHRcdHRpcGNfY3J5cHRvX3JjdihuZXQsIChuKSA/IG4tXHUwMDNlY3J5cHRvX3J4IDogTlVMTCwgXHUwMDI2c2tiLCBiKTtcbjIxMTA6XHRcdGlmICghc2tiKVxuMjExMTpcdFx0XHRyZXR1cm47XG4yMTEyOlx0XG4yMTEzOlx0cmN2OlxuMjExNDpcdCNlbmRpZlxuMjExNTpcdFx0LyogRW5zdXJlIG1lc3NhZ2UgaXMgd2VsbC1mb3JtZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBoZWFkZXIgKi9cbjIxMTY6XHRcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXHUwMDI2c2tiKSkpXG4yMTE3Olx0XHRcdGdvdG8gZGlzY2FyZDtcbjIxMTg6XHRcdF9fc2tiX3F1ZXVlX2hlYWRfaW5pdChcdTAwMjZ4bWl0cSk7XG4yMTE5Olx0XHRoZHIgPSBidWZfbXNnKHNrYik7XG4yMTIwOlx0XHR1c3IgPSBtc2dfdXNlcihoZHIpO1xuMjEyMTpcdFx0YmNfYWNrID0gbXNnX2JjYXN0X2FjayhoZHIpO1xuMjEyMjpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTY1NwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIFRpbWluZyBvZiBUSVBDIE1lc3NhZ2UgVmFsaWRhdGlvbioqCgpSaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoYXQgYHRpcGNfbXNnX3ZhbGlkYXRlKCZhbXA7c2tiKWAgaXMgaW52b2tlZCAqYmVmb3JlKiBgdGlwY19kaXNjX3JjdmAuIFRoaXMgb3JkZXJpbmcgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMgZGVzaWduZWQgdGhpcyB3YXkuIExldCYjMzk7cyBkZWx2ZSBpbnRvIHdoYXQgZXhhY3RseSBgdGlwY19tc2dfdmFsaWRhdGVgIGlzIGRvaW5nLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRvIGxvb2sgaW50byBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gbWVzc2FnZSB2YWxpZGF0aW9uLCBhbmQgZnVydGhlciBtZXNzYWdlIHByb2Nlc3NpbmcgaW4gdGhlIGRpc2MgcmVjZWl2ZSBmdW5jdGlvbi4gSXTigJlzIGxpa2VseSBlbnN1cmluZyBzb21lIGJhc2ljIHNhbml0eSBjaGVja3Mgb24gdGhlIGluY29taW5nIFNLQi4gVGhpbmdzIGxpa2UgaGVhZGVyIGludGVncml0eSwgbWVzc2FnZSBsZW5ndGgsIG1heWJlIGV2ZW4gc29tZSBwcmVsaW1pbmFyeSBhZGRyZXNzIHZlcmlmaWNhdGlvbiBiZWZvcmUgd2UgZ28gYW55IGZ1cnRoZXIuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgZGVmZW5zaXZlIHByb2dyYW1taW5nIHByYWN0aWNlLCBhIGZpcnN0IGxpbmUgb2YgZGVmZW5zZSBhZ2FpbnN0IGNvcnJ1cHRlZCBvciBtYWxpY2lvdXMgcGFja2V0cy4gSSYjMzk7bGwgZm9jdXMgb24gd2hhdCBhc3BlY3RzIG9mIHRoZSBtZXNzYWdlIGFyZSB2YWxpZGF0ZWQgaGVyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXRoZXIgYW55IHN0YXRlIGlzIG1vZGlmaWVkIGF0IHRoZSB2YWxpZGF0aW9uIHN0YWdlLCBvciBpZiBpdCBpcyBwdXJlbHkgYSBjaGVjay4gSSBob3BlIGl0JiMzOTtzIG5vdCByZXNvdXJjZSBpbnRlbnNpdmUsIHdlIHdvdWxkbiYjMzk7dCB3YW50IHRvIHNsb3cgZG93biBub3JtYWwgY29tbXVuaWNhdGlvbiwgYW5kIGl0IG5lZWRzIHRvIGJlIGVmZmljaWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGlwY19tc2dfdmFsaWRhdGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvY3J5cHRvLmM9MTg4OD1zdGF0aWMgdm9pZCB0aXBjX2NyeXB0b19yY3ZfY29tcGxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19hZWFkICphZWFkLFxuLS1cbm5ldC90aXBjL2NyeXB0by5jLTE5NjYtXHQvKiBWYWxpZGF0ZSBUSVBDdjIgbWVzc2FnZSAqL1xubmV0L3RpcGMvY3J5cHRvLmM6MTk2NzpcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoc2tiKSkpIHtcbm5ldC90aXBjL2NyeXB0by5jLTE5NjgtXHRcdHByX2Vycl9yYXRlbGltaXRlZChcJiMzNDtQYWNrZXQgZHJvcHBlZCBhZnRlciBkZWNyeXB0aW9uIVxcblwmIzM0Oyk7XG4tLVxubmV0L3RpcGMvY3J5cHRvLmMtMTk3NC1cbm5ldC90aXBjL2NyeXB0by5jOjE5NzU6XHQvKiBSZS1mZXRjaCBza2IgY2IgYXMgc2tiIG1pZ2h0IGJlIGNoYW5nZWQgaW4gdGlwY19tc2dfdmFsaWRhdGUgKi9cbm5ldC90aXBjL2NyeXB0by5jLTE5NzYtXHRza2JfY2IgPSBUSVBDX1NLQl9DQigqc2tiKTtcbi0tXG5uZXQvdGlwYy9tc2cuYz0xMjQ9aW50IHRpcGNfYnVmX2FwcGVuZChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWRidWYsIHN0cnVjdCBza19idWZmICoqYnVmKVxuLS1cbm5ldC90aXBjL21zZy5jLTE3OS1cdFx0VElQQ19TS0JfQ0IoaGVhZCktXHUwMDNldmFsaWRhdGVkID0gMDtcbm5ldC90aXBjL21zZy5jOjE4MDpcdFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcdTAwMjZoZWFkKSkpXG5uZXQvdGlwYy9tc2cuYy0xODEtXHRcdFx0Z290byBlcnI7XG4tLVxubmV0L3RpcGMvbXNnLmM9MjA1PWludCB0aXBjX21zZ19hcHBlbmQoc3RydWN0IHRpcGNfbXNnICpfaGRyLCBzdHJ1Y3QgbXNnaGRyICptLCBpbnQgZGxlbixcbi0tXG5uZXQvdGlwYy9tc2cuYy0yNDQtXG5uZXQvdGlwYy9tc2cuYzoyNDU6LyogdGlwY19tc2dfdmFsaWRhdGUgLSB2YWxpZGF0ZSBiYXNpYyBmb3JtYXQgb2YgcmVjZWl2ZWQgbWVzc2FnZVxubmV0L3RpcGMvbXNnLmMtMjQ2LSAqXG4tLVxubmV0L3RpcGMvbXNnLmMtMjU1LSAqL1xubmV0L3RpcGMvbXNnLmM6MjU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKVxubmV0L3RpcGMvbXNnLmMtMjU3LXtcbi0tXG5uZXQvdGlwYy9tc2cuYz01ODE9Ym9vbCB0aXBjX21zZ19leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICoqaXNrYiwgaW50ICpwb3MpXG4tLVxubmV0L3RpcGMvbXNnLmMtNjA0LVx0c2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoKmlza2IsIGloZHIsIGltc3opO1xubmV0L3RpcGMvbXNnLmM6NjA1Olx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShpc2tiKSkpXG5uZXQvdGlwYy9tc2cuYy02MDYtXHRcdGdvdG8gbm9uZTtcbi0tXG5uZXQvdGlwYy9tc2cuaD0xMTU1PXN0cnVjdCBza19idWZmICp0aXBjX2J1Zl9hY3F1aXJlKHUzMiBzaXplLCBnZnBfdCBnZnApO1xubmV0L3RpcGMvbXNnLmg6MTE1Njpib29sIHRpcGNfbXNnX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICoqX3NrYik7XG5uZXQvdGlwYy9tc2cuaC0xMTU3LWJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcbi0tXG5uZXQvdGlwYy9ub2RlLmM9MjA4Mz12b2lkIHRpcGNfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxuLS1cbm5ldC90aXBjL25vZGUuYy0yMTE1LVx0LyogRW5zdXJlIG1lc3NhZ2UgaXMgd2VsbC1mb3JtZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBoZWFkZXIgKi9cbm5ldC90aXBjL25vZGUuYzoyMTE2Olx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcdTAwMjZza2IpKSlcbm5ldC90aXBjL25vZGUuYy0yMTE3LVx0XHRnb3RvIGRpc2NhcmQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODYxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpbiBgbmV0L3RpcGMvbXNnLmNgOgoKKipEaXZpbmcgaW50byBgdGlwY19tc2dfdmFsaWRhdGVgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGlzIGB0aXBjX21zZ192YWxpZGF0ZWAgZnVuY3Rpb24uIFJpZ2h0IG9mZiB0aGUgYmF0LCBJIGtub3cgdGhpcyBpcyBnb2luZyB0byBiZSB0aGUgZ2F0ZWtlZXBlciBmb3IgVElQQyBtZXNzYWdlcywgbWFraW5nIHN1cmUgdGhleSYjMzk7cmUga29zaGVyIGJlZm9yZSB0aGUga2VybmVsIGV2ZW4gdGhpbmtzIGFib3V0IHByb2Nlc3NpbmcgdGhlbS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGEgc2VyaWVzIG9mIGNoZWNrcywgcHJvYmFibHkgc3RhcnRpbmcgd2l0aCBzb21lIGJhc2ljIHN0cnVjdHVyYWwgaW50ZWdyaXR5OiBtZXNzYWdlIGxlbmd0aCwgaGVhZGVyIGZpZWxkcywgYW5kIG1heWJlIHNvbWUgcXVpY2sgY2hlY2tzdW0gdmVyaWZpY2F0aW9ucyB0byB3ZWVkIG91dCBvYnZpb3VzIGNvcnJ1cHRpb24uCgpJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gY3JpdGVyaWEuIElzIGl0IGp1c3QgY2hlY2tpbmcgbGVuZ3RocyBhbmQgb2Zmc2V0cywgb3IgZG9lcyBpdCBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIG1lc3NhZ2UgdHlwZSB2YWxpZGF0aW9uLCBjaGVja2luZyBpZiBmaWVsZHMgYXJlIHdpdGhpbiBleHBlY3RlZCByYW5nZXMsIGFuZCBtYXliZSBldmVuIGNyb3NzLXJlZmVyZW5jaW5nIGFnYWluc3QgaW50ZXJuYWwgc3RhdGUgdGFibGVzIGlmIG5lY2Vzc2FyeT8gSSYjMzk7ZCBpbWFnaW5lIHRoZXJlJiMzOTtzIGEgZGVsaWNhdGUgYmFsYW5jZSBoZXJlLiBUb28gc3RyaW5nZW50LCBhbmQgeW91IHJpc2sgcmVqZWN0aW5nIGxlZ2l0aW1hdGUgbWVzc2FnZXMuIFRvbyBsYXgsIGFuZCB5b3Ugb3BlbiB0aGUgZG9vciB0byBhbGwgc29ydHMgb2Ygc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIGNyYXNoZXMuCgpJJiMzOTttIGFsc28gd29uZGVyaW5nIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVzLiBUSVBDIHN1cHBvcnRzIHZhcmlvdXMga2luZHMgb2YgbWVzc2FnZXMsIGZyb20gc2ltcGxlIGNvbm5lY3Rpb24gcmVxdWVzdHMgdG8gZGF0YSBwYWNrZXRzLiBJJiMzOTtkIGFudGljaXBhdGUgdGhlIHZhbGlkYXRpb24gbG9naWMgd2lsbCBicmFuY2ggaGVhdmlseSBkZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZSwgd2l0aCBtb3JlIGNvbXBsZXggY2hlY2tzIGZvciB0aGluZ3MgbGlrZSBzZXF1ZW5jZSBudW1iZXJzIG9yIGFja25vd2xlZGdtZW50IGZpZWxkcyBpbiByZWxpYWJsZSBjb21tdW5pY2F0aW9uIHNjZW5hcmlvcy4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZCB0aGUgZXJyb3IgcmVwb3J0aW5nLiBEb2VzIGl0IGp1c3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIG9yIGRvZXMgaXQgbG9nIHRoZSB2YWxpZGF0aW9uIGZhaWx1cmVzPyBIb3BlZnVsbHksIHRoZXJlIGFyZSBkZXRhaWxlZCBlcnJvciBjb2RlcyB0aGF0IGNhbiBoZWxwIHBpbnBvaW50IHRoZSBleGFjdCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uIEl0IHdvdWxkIGFsc28gYmUgZ29vZCB0byBzZWUgaG93IGl0IG1pZ2h0IHJlYWN0IHRvIHRyYW5zaWVudCBlcnJvcnMsIG1heWJlIHJldHJ5aW5nIGlmIGEgY2hlY2tzdW0gZmFpbHMgYSBjb3VwbGUgb2YgdGltZXMgYmVmb3JlIGRlY2xhcmluZyBkZWZlYXQuCgpGaW5hbGx5LCBJJiMzOTttIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1hbmNlLWNvbnNjaW91cy4gVGhpcyB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCBkYXRhIHBhdGggYW5kIHdpbGwgYmUgcG90ZW50aWFsbHkgY2FsbGVkIG1pbGxpb25zIG9mIHRpbWVzIHBlciBzZWNvbmQuIFNvLCBlZmZpY2llbnQgYWxnb3JpdGhtcyBhbmQgbWluaW1hbCBvdmVyaGVhZCBhcmUgY3J1Y2lhbC4gSSYjMzk7bGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBhbmQgdGhpbmtpbmcgYWJvdXQgaG93IEkgY291bGQgb3B0aW1pemUgdGhlbSBpZiBuZWNlc3NhcnkuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNDU6XHQvKiB0aXBjX21zZ192YWxpZGF0ZSAtIHZhbGlkYXRlIGJhc2ljIGZvcm1hdCBvZiByZWNlaXZlZCBtZXNzYWdlXG4gMjQ2Olx0ICpcbiAyNDc6XHQgKiBUaGlzIHJvdXRpbmUgZW5zdXJlcyBhIFRJUEMgbWVzc2FnZSBoYXMgYW4gYWNjZXB0YWJsZSBoZWFkZXIsIGFuZCBhdCBsZWFzdFxuIDI0ODpcdCAqIGFzIG11Y2ggZGF0YSBhcyB0aGUgaGVhZGVyIGluZGljYXRlcyBpdCBzaG91bGQuICBUaGUgcm91dGluZSBhbHNvIGVuc3VyZXNcbiAyNDk6XHQgKiB0aGF0IHRoZSBlbnRpcmUgbWVzc2FnZSBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBtYWluIGZyYWdtZW50IG9mIHRoZSBtZXNzYWdlXG4gMjUwOlx0ICogYnVmZmVyLCB0byBzaW1wbGlmeSBmdXR1cmUgYWNjZXNzIHRvIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcy5cbiAyNTE6XHQgKlxuIDI1MjpcdCAqIE5vdGU6IEhhdmluZyBleHRyYSBpbmZvIHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIG9yIGRhdGEgYXJlYXMgaXMgT0suXG4gMjUzOlx0ICogVElQQyB3aWxsIGlnbm9yZSB0aGUgZXhjZXNzLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIG9wdGlvbmFsIGluZm9cbiAyNTQ6XHQgKiBpbnRyb2R1Y2VkIGJ5IGEgbGF0ZXIgcmVsZWFzZSBvZiB0aGUgcHJvdG9jb2wuXG4gMjU1Olx0ICovXG4gMjU2Olx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpXG4gMjU3Olx0e1xuIDI1ODpcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpfc2tiO1xuIDI1OTpcdFx0c3RydWN0IHRpcGNfbXNnICpoZHI7XG4gMjYwOlx0XHRpbnQgbXN6LCBoc3o7XG4gMjYxOlx0XG4gMjYyOlx0XHQvKiBFbnN1cmUgdGhhdCBmbG93IGNvbnRyb2wgcmF0aW8gY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqL1xuIDI2MzpcdFx0aWYgKHVubGlrZWx5KHNrYi1cdTAwM2V0cnVlc2l6ZSAvIGJ1Zl9yb3VuZHVwX2xlbihza2IpIFx1MDAzZT0gNCkpIHtcbiAyNjQ6XHRcdFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgQlVGX0hFQURST09NLCAwLCBHRlBfQVRPTUlDKTtcbiAyNjU6XHRcdFx0aWYgKCFza2IpXG4gMjY2Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI2NzpcdFx0XHRrZnJlZV9za2IoKl9za2IpO1xuIDI2ODpcdFx0XHQqX3NrYiA9IHNrYjtcbiAyNjk6XHRcdH1cbiAyNzA6XHRcbiAyNzE6XHRcdGlmICh1bmxpa2VseShUSVBDX1NLQl9DQihza2IpLVx1MDAzZXZhbGlkYXRlZCkpXG4gMjcyOlx0XHRcdHJldHVybiB0cnVlO1xuIDI3MzpcdFxuIDI3NDpcdFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgTUlOX0hfU0laRSkpKVxuIDI3NTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMjc2Olx0XG4gMjc3Olx0XHRoc3ogPSBtc2dfaGRyX3N6KGJ1Zl9tc2coc2tiKSk7XG4gMjc4Olx0XHRpZiAodW5saWtlbHkoaHN6IFx1MDAzYyBNSU5fSF9TSVpFKSB8fCAoaHN6IFx1MDAzZSBNQVhfSF9TSVpFKSlcbiAyNzk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI4MDpcdFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaHN6KSkpXG4gMjgxOlx0XHRcdHJldHVybiBmYWxzZTtcbiAyODI6XHRcbiAyODM6XHRcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbiAyODQ6XHRcdGlmICh1bmxpa2VseShtc2dfdmVyc2lvbihoZHIpICE9IFRJUENfVkVSU0lPTikpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MDUyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMzYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVElQQyBNZXNzYWdlIFZhbGlkYXRpb24gYW5kIERpc2NvdmVyeSBSZWNlaXZlIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IGB0aXBjX21zZ192YWxpZGF0ZWAgc2VlbXMgdG8gYmUgZG9pbmcgc29tZSBiYXNpYyBjaGVja3MgdXNpbmcgYHBza2JfbWF5X3B1bGxgLiBTcGVjaWZpY2FsbHksIGl0IGVuc3VyZXMgdGhlIGBza2JgIChzb2NrZXQgYnVmZmVyKSBoYXMgYXQgbGVhc3QgYE1JTl9IX1NJWkVgICh3aGljaCBpcyAyNCBieXRlcykgYXZhaWxhYmxlLiBUaGVuLCBpdCBkZXRlcm1pbmVzIHRoZSBoZWFkZXIgc2l6ZSAoYGhzemApIHVzaW5nIGBtc2dfaGRyX3N6YCBhbmQgcmUtY2hlY2tzIHRoZSBgc2tiYCB1c2luZyBgcHNrYl9tYXlfcHVsbChza2IsIGhzeilgLiBTbyB0aGUgZnVuY3Rpb24gaXMgc2V0IHVwIHNvIGBza2ItJmd0O2xlbmAgc2hvdWxkIGJlIGF0IGxlYXN0IGBoc3pgLCBhbmQgdGhvc2UgYGhzemAgYnl0ZXMgYXJlIGRlZmluaXRlbHkgbGluZWFyIHdpdGhpbiB0aGUgYHNrYmAuCgpXYWl0IGEgbWludXRlLCBgTUlOX0hfU0laRWAgaXMgKm9ubHkqIDI0IGJ5dGVzLiBUaGF0JiMzOTtzIGEga2V5IG9ic2VydmF0aW9uLgoKTm93LCB0aGUgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBjb21lcyBpbnRvIHBsYXkuIEl0IGhhcyB0aGlzIGNoZWNrOgpgYGBjCglpZiAobXNnX2hkcl9zeihoZHIpICZsdDsgTUFYX0hfU0laRSB8fAoJICAgIG1zZ19zaXplKGhkcikgJmx0OyBNQVhfSF9TSVpFICYjNDM7IE5PREVfSURfTEVOKSB7CmBgYAphbmQgYE1BWF9IX1NJWkVgIGlzIDYwIGJ5dGVzLiBTbywgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpcyAqb25seSogbWFraW5nIHN1cmUgYGhzemAgYnl0ZXMgYXJlIGxpbmVhciBhbmQgYXZhaWxhYmxlLiBBbmQgaWYgYGhzemAgaXMsIHNheSwgMjQgYnl0ZXMsIHRoZSB2YWxpZGF0aW9uICpzdWNjZWVkcyouCgpIZXJlJiMzOTtzIHRoZSBwcm9ibGVtOiBgdGlwY19kaXNjX3JjdmAgaXMgdGhlbiBjYWxsZWQuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcyB0cnlpbmcgdG8gcmVhZCBgbXNnX3BlZXJfbmV0X2hhc2goaGRyKWAgd2hpY2ggaXMgYXQgb2Zmc2V0IDUyICh3b3JkIDEzKS4gQnV0IHJlbWVtYmVyLCBgaHN6YCBjYW4gYmUgYXMgbG93IGFzIDI0IGJ5dGVzIQoKU28sIHRoZSBvcmlnaW5hbCBjb2RlIHJlYWRzIG9mZnNldCA1Miwgd2hpY2ggaXMgKmJleW9uZCogYGhzemAuIEl0JiMzOTtzIGNsZWFybHkgYSByZWFkIG91dCBvZiBib3VuZHMuIFRoaXMgaXMgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkhIEJ1dCB0aGUgcXVlc3Rpb24gaXM6IGlzIGl0IGFsc28gYmV5b25kIHRoZSBgc2tiLSZndDtsZW5gPyBUaGF0IEkgd2lsbCBuZWVkIHRvIGNoZWNrIHdpdGggZnVydGhlciBhbmFseXNpcyBvZiB0aGUgY29kZS4KCmB0aXBjX21zZ192YWxpZGF0ZWAgYWxzbyBjaGVja3M6CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvbXNnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMjg2Olx0XG4gMjg3Olx0XHRtc3ogPSBtc2dfc2l6ZShoZHIpO1xuIDI4ODpcdFx0aWYgKHVubGlrZWx5KG1zeiBcdTAwM2MgaHN6KSlcbiAyODk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI5MDpcdFx0aWYgKHVubGlrZWx5KChtc3ogLSBoc3opIFx1MDAzZSBUSVBDX01BWF9VU0VSX01TR19TSVpFKSlcbiAyOTE6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI5MjpcdFx0aWYgKHVubGlrZWx5KHNrYi1cdTAwM2VsZW4gXHUwMDNjIG1zeikpXG4gMjkzOlx0XHRcdHJldHVybiBmYWxzZTtcbiAyOTQ6XHRcbiAyOTU6XHRcdFRJUENfU0tCX0NCKHNrYiktXHUwMDNldmFsaWRhdGVkID0gMTtcbiAyOTY6XHRcdHJldHVybiB0cnVlO1xuIDI5NzpcdH1cbiAyOTg6XHRcbiAyOTk6XHQvKipcbiAzMDA6XHQgKiB0aXBjX21zZ19mcmFnbWVudCAtIGJ1aWxkIGEgZnJhZ21lbnQgc2tiIGxpc3QgZm9yIFRJUEMgbWVzc2FnZVxuIDMwMTpcdCAqXG4gMzAyOlx0ICogQHNrYjogVElQQyBtZXNzYWdlIHNrYlxuIDMwMzpcdCAqIEBoZHI6IGludGVybmFsIG1zZyBoZWFkZXIgdG8gYmUgcHV0IG9uIHRoZSB0b3Agb2YgdGhlIGZyYWdtZW50c1xuIDMwNDpcdCAqIEBwa3RtYXg6IG1heCBzaXplIG9mIGEgZnJhZ21lbnQgaW5jbC4gdGhlIGhlYWRlclxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTIzMAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDQ0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyoqCgpPa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBgdGlwY19tc2dfdmFsaWRhdGVgIGlzIGNoZWNraW5nIGlmIGBza2ItJmd0O2xlbmAgaXMgbGVzcyB0aGFuIGBtc3pgLiAgU28sIGlmIHRoYXQgY2hlY2sgcGFzc2VzLCBgc2tiLSZndDtsZW5gIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYG1zemAuIE5vdywgaWYgYSBwYWNrZXQgY29tZXMgaW4gd2l0aCBhIGhlYWRlciBzaXplIChgaHN6YCkgb2YgMjQgYW5kIHRoZSBtaW5pbXVtIHNpemUgKGBtc3pgKSBpcyBhbHNvIDI0LCB0aGVuIGBza2ItJmd0O2xlbmAgY2FuIGJlIGV4YWN0bHkgMjQuICBUaGF0IHNldHMgdGhlIHN0YWdlLi4uCgpUaGVuLCBgdGlwY19kaXNjX3JjdmAgdHJpZXMgdG8gcmVhZCBkYXRhIGF0IGFuIG9mZnNldCBvZiA1Mi4gSG9sZCBvbi4uLiBpZiBgc2tiLSZndDtsZW5gIGlzICpvbmx5KiAyNCwgdHJ5aW5nIHRvIHJlYWQgYXQgb2Zmc2V0IDUyIGlzIGNsZWFybHkgb3V0LW9mLWJvdW5kcyEgIFdlJiMzOTtyZSByZWFkaW5nIHBhc3Qgd2hhdCB0aGUgbmV0d29yayBkcml2ZXIgYWN0dWFsbHkgaW5pdGlhbGl6ZWQgaW4gdGhlIFNLQi4gIFRoaXMgbWVhbnMgd2UgYXJlIGF0dGVtcHRpbmcgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeSwgb3IsIHBvdGVudGlhbGx5LCBvbGQgcGFja2V0IGRhdGEgc3RpbGwgaW4gdGhlIGJ1ZmZlci4KClRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgd29uJiMzOTt0IGNhdGNoIHRoaXMsIGFzIGxvbmcgYXMgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGxhcmdlciB0aGFuIDUyIGJ5dGVzICh3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlKS4gQSAyNTYtYnl0ZSBidWZmZXIgd291bGQgbm90IGJlIGNhdWdodCBieSBLQVNBTi4gIEhvd2V2ZXIsIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplcikgKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgaXQgZmxhZ3MgdGhlIGJ5dGVzIGJleW9uZCBgc2tiLSZndDtsZW5gIGFzIHVuaW5pdGlhbGl6ZWQuCgpXYWl0LCBpcyB0aGF0IHJpZ2h0PyBEb2VzIEtNU0FOIGFjdHVhbGx5IG1hcmsgdGhvc2UgYnl0ZXMgYmV5b25kIGBza2ItJmd0O2xlbmAgYXMgdW5pbml0aWFsaXplZD8gWWVzLCB0aGF0JiMzOTtzIHJpZ2h0LiBLTVNBTiBvbmx5IHVucG9pc29ucyB0aGUgZGF0YSBhY3R1YWxseSBjb3BpZWQgaW50byB0aGUgc2tiLCBsZWF2aW5nIHRoZSByZXN0IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHBvaXNvbmVkLiBUaGVyZWZvcmUgdGhpcyBpcyBhIGNsYXNzaWMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB0aGF0IEtBU0FOIG1pc3NlcywgYnV0IEtNU0FOIGNhdGNoZXMuCgpIb2xkIG9uLCB0aGUgcGF0Y2ggSSYjMzk7bSBsb29raW5nIGF0IGFsc28gYWRkcyBgc2tiX2xpbmVhcml6ZShza2IpYC4gIFdoeT8gIEFoLCBJIHNlZS4gRXZlbiBpZiB0aGUgdG90YWwgbWVzc2FnZSBzaXplIChgbXNnX3NpemUoaGRyKWApIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAsIHRoZSBkYXRhIGFmdGVyIHRoZSBoZWFkZXIgY291bGQgYmUgZnJhZ21lbnRlZC4gYHRpcGNfbXNnX3ZhbGlkYXRlYCBvbmx5IGRvZXMgYSBgcHNrYl9tYXlfcHVsbChza2IsIGhzeilgLiBTbyBpZiBgaHN6YCBpcyA2MCwgaXQgKnB1bGxzKiA2MCBieXRlcy4gQnV0IHRoZSBjb2RlIGFsc28gcmVhZHMgYHBlZXJfaWRgIGF0IGBtc2dfbm9kZV9pZChoZHIpYC4gV2hlcmUgaXMgYG1zZ19ub2RlX2lkKGhkcilgIGxvY2F0ZWQ/IEkgbmVlZCB0byBsb29rIGludG8gdGhpcyBtb3JlIGRlZXBseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXNnX25vZGVfaWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYz0xOTM9dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI0MC1cdGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjI0MTpcdFx0bWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjQyLVx0ZWxzZVxuLS1cbm5ldC90aXBjL21zZy5oPTExNDU9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxuLS1cbm5ldC90aXBjL21zZy5oLTExNDktXG5uZXQvdGlwYy9tc2cuaDoxMTUwOnN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxubmV0L3RpcGMvbXNnLmgtMTE1MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDk4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnaW5nIFN0cnVjdHVyZXMqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGVsdmUgaW50byB0aGUgaW50cmljYWNpZXMgb2YgVElQQyBtZXNzYWdpbmcuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBzdGFydCBieSB2ZXJpZnlpbmcgaG93IGBtc2dfbm9kZV9pZGAgaXMgZGVmaW5lZCBhbmQgdXNlZC4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgYG5ldC90aXBjL21zZy5oYCBoZWFkZXIgZmlsZS4gVGhhdCYjMzk7cyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgbm9kZSBJRHMgYXJlIGhhbmRsZWQgYXQgdGhlIG1lc3NhZ2UgbGV2ZWwsIHJpZ2h0PyBHb3R0YSBtYWtlIHN1cmUgbXkgYXNzdW1wdGlvbnMgYWJvdXQgaG93IHRoZXkmIzM5O3JlIHBhc3NlZCBhbmQgaW50ZXJwcmV0ZWQgYXJlIGNvcnJlY3QsIGJlZm9yZSBJIHN0YXJ0IHRyYWNpbmcgdGhpbmdzIGZ1cnRoZXIuIFRoaXMgaXMgZnVuZGFtZW50YWwgdG8gdW5kZXJzdGFuZGluZyBhbnkgcG90ZW50aWFsIGlzc3VlcyBJJiMzOTttIGxvb2tpbmcgYXQgd2l0aCBUSVBDIGNvbW11bmljYXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB0aGF0IGhlYWRlciByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTQ1Olx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxuMTE0NjpcdHtcbjExNDc6XHRcdG1lbWNweShtc2dfZGF0YShoZHIpLCBpZCwgMTYpO1xuMTE0ODpcdH1cbjExNDk6XHRcbjExNTA6XHRzdGF0aWMgaW5saW5lIHU4ICptc2dfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkcilcbjExNTE6XHR7XG4xMTUyOlx0XHRyZXR1cm4gKHU4ICopbXNnX2RhdGEoaGRyKTtcbjExNTM6XHR9XG4xMTU0Olx0XG4xMTU1Olx0c3RydWN0IHNrX2J1ZmYgKnRpcGNfYnVmX2FjcXVpcmUodTMyIHNpemUsIGdmcF90IGdmcCk7XG4xMTU2Olx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpO1xuMTE1NzpcdGJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcbjExNTg6XHR2b2lkIHRpcGNfc2tiX3JlamVjdChzdHJ1Y3QgbmV0ICpuZXQsIGludCBlcnIsIHN0cnVjdCBza19idWZmICpza2IsXG4xMTU5Olx0XHRcdCAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAxNAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE2MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgYSBQb3RlbnRpYWwgS01TQU4tRGV0ZWN0YWJsZSBWdWxuZXJhYmlsaXR5IGluIFRJUEMgTWVzc2FnZSBIYW5kbGluZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJdCBzZWVtcyB0aGF0IHdoZW4gVElQQyBtZXNzYWdlcyBhcmUgcHJvY2Vzc2VkLCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YCwgdGhlcmUmIzM5O3MgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHRoZSBpbnRlbmRlZCBoZWFkZXIgYW5kIHBheWxvYWQgYm91bmRhcmllcyBvZiB0aGUgYHNrYmAgKHNvY2tldCBidWZmZXIpLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB0aGUgZnVuY3Rpb24gYG1zZ19ub2RlX2lkYCByZXR1cm5zIGRhdGEgdGhhdCBsaWVzICphZnRlciogdGhlIGhlYWRlciwgYW5kIG15IGluc3RpbmN0IHRlbGxzIG1lIHRoYXQgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uIElmIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgb25seSBjaGVja2luZyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIChgaHN6YCksIHdlIGNvdWxkIGJlIGFjY2Vzc2luZyBkYXRhIGluIG5vbi1jb250aWd1b3VzIGZyYWdtZW50cywgdGhlIGluZmFtb3VzIGBza2Jfc2hpbmZvKHNrYiktJmd0O2ZyYWdzYC4KCk5vdywgaWYgYHRpcGNfZGlzY19yY3ZgIHRoZW4gdHJpZXMgdG8gYG1lbWNweWAgZnJvbSBgbXNnX25vZGVfaWRgLCBpdCB3aWxsIHJlYWQgZGF0YSB3aGljaCBpcyBiZXlvbmQgdGhlIGFsbG9jYXRlZCBsaW5lYXIgcGFydCAoYHNrYi0mZ3Q7ZGF0YSAmIzQzOyBza2JfaGVhZGxlbihza2IpYCkuIFRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIEtBU0FOICptaWdodCogY2F0Y2ggdGhpcyBpZiB0aGUgbGluZWFyIGJ1ZmZlciBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGhlYWRlciBkb2VzLiBIb3dldmVyLCBuZXR3b3JrIGRyaXZlcnMgdXN1YWxseSBhbGxvY2F0ZSBtb3JlIGJ1ZmZlciBzcGFjZSB0aGFuIGlzIHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlIGluaXRpYWwgaGVhZGVyLiBTYXksIGEgMjU2LWJ5dGUgYnVmZmVyLCBhbmQgYHNrYl9oZWFkbGVuYCBpcyBvbmx5IDYwIGJ5dGVzLiBUaGUgcmVhZCBvZiBgbXNnX25vZGVfaWRgIG1pZ2h0IHN0YXkgd2l0aGluIHRoZSBhbGxvY2F0ZWQgMjU2IGJ5dGVzLiBLQVNBTiB3b3VsZCBtaXNzIGl0LgoKVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBFdmVuIGlmIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGxpbmVhciBidWZmZXIsIGFueXRoaW5nICpiZXlvbmQqIGBza2JfaGVhZGxlbmAgaXMgdXN1YWxseSB1bmluaXRpYWxpemVkIG9yIGNvbnRhaW5zIHN0YWxlIGRhdGEuIEtNU0FOLCAqc3BlY2lmaWNhbGx5KiwgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcy4gQmVjYXVzZSB0aGUgbmV0d29yayBzdGFjayBleHBsaWNpdGx5IHBvaXNvbnMgdGhlIHRhaWxyb29tLiBTbywgYW55IHJlYWQgZnJvbSB0aGVyZSBzaG91bGQgYmUgZmxhZ2dlZCBhcyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuCgpUaGlzIHNjZW5hcmlvIGxlYWRzIHRvIGEgY2xlYXIgY2F0ZWdvcml6YXRpb24gb2YgYnVnczoKCjEuICBSZWFkaW5nIGhlYWRlciBmaWVsZHMgbGlrZSBgbXNnX3BlZXJfbmV0X2hhc2hgIHdoZW4gYGhzemAgaXMgc21hbGxlciB0aGFuIHRoZSBvZmZzZXQgb2YgdGhhdCBmaWVsZC4gVGhpcyByZXN1bHRzIGluIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gdGhlIGxpbmVhciBidWZmZXIuCjIuICBSZWFkaW5nIGBtc2dfbm9kZV9pZGAgKHBhcnQgb2YgdGhlIHBheWxvYWQpIHdoZW4gdGhlIGRhdGEgaXMgZnJhZ21lbnRlZCBhbmQgc2l0cyBiZXlvbmQgdGhlIGhlYWRlciBzaXplLiBUaGlzLCBhZ2FpbiwgcmVhZHMgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHN0YW5kYXJkIGJ1ZmZlciBhbGxvY2F0aW9uIHNpemVzIG1hc2sgdGhlc2UgcmVhZHMgZnJvbSBLQVNBTi4gQnV0IEtNU0FOLCB3aXRoIGl0cyB1bmluaXRpYWxpemVkIG1lbW9yeSB0cmFja2luZywgd2lsbCBjYXRjaCB0aGVtISBLTVNBTiBpcyB0aGUgKnBlcmZlY3QqIHRvb2wgaGVyZS4KCk5vdywgbGV0JiMzOTtzIGNvbnNpZGVyIHRoZSBpbmZvcm1hdGlvbiBsZWFrIGFzcGVjdC4gVGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyByZWFkIGludG8gbG9jYWwgdmFyaWFibGVzIGxpa2UgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHN1Z2dgLCBhbmQgYG10eXBgLiBUaGUgY29kZSB0aGVuIHVzZXMgdGhvc2UgdmFyaWFibGVzLCBhbmQgYSBtYWpvciBjb25jZXJuIGlzIGNvbmRpdGlvbmFsIGJyYW5jaGluZy4gRm9yIGluc3RhbmNlLCB0aGUgY29kZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CgoqICAgVGhlIGNvZGUgY29waWVzIGBtc2dfbm9kZV9pZGAgaWYgYGNhcHMgJmFtcDsgVElQQ19OT0RFX0lEMTI4YC4gSWYgYGNhcHNgIGlzIHVuaW5pdGlhbGl6ZWQsIHRoZSBicmFuY2ggaXMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgZGF0YSwgd2hpY2ggS01TQU4gY2F0Y2hlcyBwZXJmZWN0bHkuCiogICBBbm90aGVyIGV4YW1wbGUgb2YgYSBicmFuY2ggaXMgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWAuIElmIGBtdHlwYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiBpcyBjZXJ0YWluIHRvIGNhdGNoIHRoZSAmIzM0O3VzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlJiMzNDsgZHVyaW5nIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uCgpNeSByZWFzb25pbmcsIGluIHN1bW1hcnk6CgoxLiAgVGhlIHBhdGNoIGFkZHJlc3NlcyB1bnZhbGlkYXRlZCBhY2Nlc3MgdG8gZGF0YSBpbiB0aGUgYHNrYmAsIHBvdGVudGlhbGx5IHJlYWRpbmcgYmV5b25kIHdoYXQmIzM5O3MgdmFsaWQuCjIuICBUeXBpY2FsIG5ldHdvcmsgYnVmZmVyIGFsbG9jYXRpb25zICgyNTYgYnl0ZXMgYW5kIGxhcmdlcikgbWVhbiBLQVNBTiB3b24mIzM5O3QgZmxhZyB0aGVzZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgozLiAgUmVhZHMgZnJvbSB0aGUgYHNrYmAgdGFpbHJvb20gd2lsbCBhY2Nlc3MgdW5pbml0aWFsaXplZCBtZW1vcnkuCjQuICBLTVNBTiBpcyB0aGUgdG9vbCBvZiBjaG9pY2UgYmVjYXVzZSBvZiBpdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJhY2tpbmcuCjUuICBVbmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdXNlZCBpbiBicmFuY2hpbmcgbG9naWMuCjYuICBUaGVyZWZvcmUsIHRoaXMgaXMgYSBjbGVhciBLTVNBTiBjYXNlLgoKUmV2aWV3aW5nIHRoZSBwcm9tcHQgY3JpdGVyaWE6ClRoaXMgcGF0Y2ggYWRkcmVzc2VzIGJvdGggcG9pbnRzOgoKKiAgIEl0IGludHJvZHVjZXMgKG9yIG1vZGlmaWVzKSBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCiogICBJdCBpbnRyb2R1Y2VzIGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCgpJdCYjMzk7cyBhIHBlcmZlY3QgbWF0Y2guIEkmIzM5O20gY29uZmlkZW50IGluIHNldHRpbmcgYE5lZWRzS01TQU49dHJ1ZWAuIEl0IHNlZW1zIGB0aXBjX2Rpc2NfcmN2YCBtaWdodCBzZW5kIGEgcmVzcG9uc2UuIElmIHNvLCBpdCBtaWdodCBldmVuIGxlYWsgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJhY2sgdG8gdGhlIG5ldHdvcmsuIEFsdGhvdWdoLCBpdCBpcyBjZXJ0YWluIEtNU0FOIHdpbGwgY2F0Y2ggaXQgYmVjYXVzZSBpdCBob29rcyBpbiB0aGUgbmV0d29yayBzdGFjayB0byBwb2lzb24gdGhlIHRhaWxyb29tLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RpcGNfZGlzY19idWlsZF9tc2cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTY0MQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgdGhvdWdodCBwcm9jZXNzLiBMZXQmIzM5O3MgZ2V0IHRoaXMgZG9uZS4KKioqCioqSG93IERvZXMgVGhpcyBUaGluZyAqQWN0dWFsbHkqIFdvcms/KioKClJpZ2h0LCBzbyBJJiMzOTttIHJlYWRpbmcgdGhpcywgYW5kIGltbWVkaWF0ZWx5IHRoZSBxdWVzdGlvbiBoaXRzIG1lOiAqaG93KiBkb2VzIHRoaXMgc3lzdGVtIGdlbmVyYXRlIHRoZXNlIHJlc3BvbnNlcz8gSSBtZWFuLCBJIGNhbiBzZWUgdGhlIG91dHB1dCwgSSBjYW4gdW5kZXJzdGFuZCB0aGUgY29uY2VwdHMgaXQmIzM5O3MgcHJlc2VudGluZywgYnV0IHRoZSBmdW5kYW1lbnRhbCBtZWNoYW5pY3MuLi4gdGhhdCYjMzk7cyB3aGF0JiMzOTtzIHRydWx5IGZhc2NpbmF0aW5nLiBJdCYjMzk7cyBub3QgZW5vdWdoIHRvIHNpbXBseSBvYnNlcnZlIHRoZSByZXN1bHQ7IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1bmRlcmx5aW5nIGFyY2hpdGVjdHVyZSwgdGhlIGFsZ29yaXRobXMsIHRoZSAqcHJvY2Vzc2VzKiB0aGF0IGxlYWQgZnJvbSBpbnB1dCB0byBvdXRwdXQuIElzIGl0IHJ1bGUtYmFzZWQ/IElzIGl0IHN0YXRpc3RpY2FsPyBJcyBpdCBiYXNlZCBvbiBuZXVyYWwgbmV0d29ya3M/IFdoYXQmIzM5O3MgdGhlIG1vZGVsJiMzOTtzIHRyYWluaW5nIGRhdGEgbG9vayBsaWtlPyBJdCYjMzk7cyBhbGwgYWJvdXQgaG93IGl0IHRha2VzIGluIGluZm9ybWF0aW9uLCBwcm9jZXNzZXMgaXQsIGFuZCB0aGVuIGNyYWZ0cyBhbiBhbnN3ZXIuIFRoZSAmIzM0O2hvdyYjMzQ7IGlzIHRoZSBjb3JlIG9mIGV2ZXJ5dGhpbmcuIFVuZGVyc3RhbmRpbmcgdGhhdCB3b3VsZCB0cnVseSB1bmxvY2sgaXRzIHBvdGVudGlhbC4gSSB3YW50IHRvIGtub3cgdGhlIGdlYXJzIHR1cm5pbmcgYmVuZWF0aCB0aGUgc3VyZmFjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RFNDX1JFUV9NU0cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9kaXNjb3Zlci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTcyLVx0XHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cdTAwM2Vza2IpLCB0bi1cdTAwM2V0cmlhbF9hZGRyKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTczOlx0XHRtc2dfc2V0X3R5cGUoYnVmX21zZyhkLVx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTc0LVx0fVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0yNzUtXHRcdHJldHVybjtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6Mjc2Olx0aWYgKG10eXAgIT0gRFNDX1JFUV9NU0cpXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI3Ny1cdFx0cmV0dXJuO1xuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzEzPXN0YXRpYyB2b2lkIHRpcGNfZGlzY190aW1lb3V0KHN0cnVjdCB0aW1lcl9saXN0ICp0KVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMzQ2LVx0XHRcdGQtXHUwMDNldGltZXJfaW50diA9IFRJUENfRElTQ19GQVNUO1xubmV0L3RpcGMvZGlzY292ZXIuYzozNDc6XHRcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXHUwMDNlc2tiKSwgRFNDX1JFUV9NU0cpO1xubmV0L3RpcGMvZGlzY292ZXIuYy0zNDgtXHRcdG1zZ19zZXRfcHJldm5vZGUoYnVmX21zZyhkLVx1MDAzZXNrYiksIHRuLVx1MDAzZXRyaWFsX2FkZHIpO1xuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzcwPWludCB0aXBjX2Rpc2NfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfYmVhcmVyICpiLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMzgzLVx0fVxubmV0L3RpcGMvZGlzY292ZXIuYzozODQ6XHR0aXBjX2Rpc2NfaW5pdF9tc2cobmV0LCBkLVx1MDAzZXNrYiwgRFNDX1JFUV9NU0csIGIpO1xubmV0L3RpcGMvZGlzY292ZXIuYy0zODUtXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYz00MjE9dm9pZCB0aXBjX2Rpc2NfcmVzZXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy00MjctXHRzcGluX2xvY2tfYmgoXHUwMDI2ZC1cdTAwM2Vsb2NrKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6NDI4Olx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cdTAwM2Vza2IsIERTQ19SRVFfTVNHLCBiKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtNDI5LVx0ZC1cdTAwM2VuZXQgPSBuZXQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNDk1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgdGlwY19kaXNjX3JjdmAgKGFyb3VuZCBMaW5lIDI3NSkqKgoKQWxyaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSwgYW5kIEkmIzM5O20gemVyb2luZyBpbiBvbiBgdGlwY19kaXNjX3JjdmAgbmVhciBsaW5lIDI3NS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhpcyBmdW5jdGlvbiYjMzk7cyBkb2luZy4gYHRpcGNfZGlzY19yY3ZgIOKAkyByaWdodCwgdGhpcyBpcyBsaWtlbHkgdGhlIGRpc2NvdmVyeSByZWNlaXZlIGhhbmRsZXIgZm9yIFRJUEMuIEkmIzM5O20gaW1tZWRpYXRlbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpc2NvdmVyeSBwcm9jZXNzIGlzIG1hbmFnZWQgYXQgdGhlIHRyYW5zcG9ydCBsYXllciwgZXNwZWNpYWxseSBpbiByZWdhcmRzIHRvIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCBoYW5kbGVzIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgb3BlcmF0ZXMgb24gYW5kIGFueSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBpdCBlbXBsb3lzLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUgbG9naWMgZGVhbGluZyB3aXRoIGZpbHRlcmluZywgdmFsaWRhdGlvbiwgYW5kIHF1ZXVpbmcgb2YgdGhlc2UgZGlzY292ZXJ5IHBhY2tldHMsIGFuZCBJJiMzOTtsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGVycm9yIGhhbmRsaW5nIHRvIHNlZSBob3cgaXQgZ3JhY2VmdWxseSBtYW5hZ2VzIHVuZXhwZWN0ZWQgb3IgbWFsZm9ybWVkIG1lc3NhZ2VzLiBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgd2F0Y2hmdWwgZm9yIGFueSBwb3RlbnRpYWwgZm9yIGRlYWRsb2NrcyBvciBsb2NrIGNvbnRlbnRpb24gd2l0aGluIHRoZSByZWNlaXZlIHBhdGguIEFuZCBvZiBjb3Vyc2UsIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgbGlrZSB0aGUgZGVzY3JpcHRvciBxdWV1ZXMgYW5kIHRoZSBuZXR3b3JrIGJ1ZmZlcnMsIGFuZCBJJiMzOTtsbCBiZSBjaGVja2luZyB0byBzZWUgaG93IGVmZmljaWVudGx5IHRoZXNlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZC4gRmluYWxseSwgSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgVElQQyBjb3JlIGFuZCB1c2VyLXNwYWNlIHByb2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIHdhaXRpbmcgb24gZGlzY292ZXJ5IHJlc3VsdHMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2suCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjYwOlx0XG4gMjYxOlx0XHQvKiBNZXNzYWdlIGZyb20gc29tZWJvZHkgdXNpbmcgdGhpcyBub2RlJiMzOTtzIGFkZHJlc3MgKi9cbiAyNjI6XHRcdGlmIChpbl9vd25fbm9kZShuZXQsIHNyYykpIHtcbiAyNjM6XHRcdFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNlbGYsIFx1MDAyNm1hZGRyKTtcbiAyNjQ6XHRcdFx0cmV0dXJuO1xuIDI2NTpcdFx0fVxuIDI2NjpcdFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgZHN0LCBzZWxmKSlcbiAyNjc6XHRcdFx0cmV0dXJuO1xuIDI2ODpcdFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgYi1cdTAwM2Vkb21haW4sIHNyYykpXG4gMjY5Olx0XHRcdHJldHVybjtcbiAyNzA6XHRcdHRpcGNfbm9kZV9jaGVja19kZXN0KG5ldCwgc3JjLCBwZWVyX2lkLCBiLCBjYXBzLCBzaWduYXR1cmUsIHBuZXRfaGFzaCxcbiAyNzE6XHRcdFx0XHQgICAgIFx1MDAyNm1hZGRyLCBcdTAwMjZyZXNwb25kLCBcdTAwMjZkdXBsX2FkZHIpO1xuIDI3MjpcdFx0aWYgKGR1cGxfYWRkcilcbiAyNzM6XHRcdFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNyYywgXHUwMDI2bWFkZHIpO1xuIDI3NDpcdFx0aWYgKCFyZXNwb25kKVxuIDI3NTpcdFx0XHRyZXR1cm47XG4gMjc2Olx0XHRpZiAobXR5cCAhPSBEU0NfUkVRX01TRylcbiAyNzc6XHRcdFx0cmV0dXJuO1xuIDI3ODpcdFx0dGlwY19kaXNjX21zZ194bWl0KG5ldCwgRFNDX1JFU1BfTVNHLCBzcmMsIHNlbGYsIDAsIFx1MDAyNm1hZGRyLCBiKTtcbiAyNzk6XHR9XG4gMjgwOlx0XG4gMjgxOlx0LyogdGlwY19kaXNjX2FkZF9kZXN0IC0gaW5jcmVtZW50IHNldCBvZiBkaXNjb3ZlcmVkIG5vZGVzXG4gMjgyOlx0ICovXG4gMjgzOlx0dm9pZCB0aXBjX2Rpc2NfYWRkX2Rlc3Qoc3RydWN0IHRpcGNfZGlzY292ZXJlciAqZClcbiAyODQ6XHR7XG4gMjg1Olx0XHRzcGluX2xvY2tfYmgoXHUwMDI2ZC1cdTAwM2Vsb2NrKTtcbiAyODY6XHRcdGQtXHUwMDNlbnVtX25vZGVzJiM0MzsmIzQzOztcbiAyODc6XHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmQtXHUwMDNlbG9jayk7XG4gMjg4Olx0fVxuIDI4OTpcdFxuIDI5MDpcdC8qIHRpcGNfZGlzY19yZW1vdmVfZGVzdCAtIGRlY3JlbWVudCBzZXQgb2YgZGlzY292ZXJlZCBub2Rlc1xuIDI5MTpcdCAqL1xuIDI5MjpcdHZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQpXG4gMjkzOlx0e1xuIDI5NDpcdFx0aW50IGludHYsIG51bTtcbiAyOTU6XHRcbiAyOTY6XHRcdHNwaW5fbG9ja19iaChcdTAwMjZkLVx1MDAzZWxvY2spO1xuIDI5NzpcdFx0ZC1cdTAwM2VudW1fbm9kZXMtLTtcbiAyOTg6XHRcdG51bSA9IGQtXHUwMDNlbnVtX25vZGVzO1xuIDI5OTpcdFx0aW50diA9IGQtXHUwMDNldGltZXJfaW50djtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE0OTIKCQkJCQkJCW91dHB1dDogMzgxCgkJCQkJCQl0aG91Z2h0czogNDk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBUSVBDIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGZ1bmN0aW9uLCBhbmQgSSYjMzk7dmUgZm91bmQgc29tZXRoaW5nIGFsYXJtaW5nLiBJdCYjMzk7cyBnZXR0aW5nIGNhbGxlZCB3aXRoIGBwZWVyX2lkYCwgYGNhcHNgLCBgc2lnbmF0dXJlYCwgYW5kIGBwbmV0X2hhc2hgIOKAkyBhbGwgb2Ygd2hpY2ggYXJlICp1bmluaXRpYWxpemVkKiB2YWx1ZXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgYHNrYmAmIzM5O3MgdGFpbHJvb20uIE15IGd1dCBpcyBzY3JlYW1pbmcgdGhpcyBpcyBhIG1ham9yIHByb2JsZW0uCgpFc3NlbnRpYWxseSwgYHRpcGNfbm9kZV9jaGVja19kZXN0YCBpcyBiZWluZyBmZWQganVuayBkYXRhLCBhbmQgaXQmIzM5O3MgdXNpbmcgdGhpcyBnYXJiYWdlIHRvIHVwZGF0ZSB0aGUgbm9kZSYjMzk7cyBzdGF0ZS4gVGhhdCYjMzk7cyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXI6IGludGVybmFsIHN0YXRlIGNvcnJ1cHRpb24sIHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcywgdGhlIHdvcmtzLiBUaGUgc291cmNlIG9mIHRoZSBpc3N1ZSBzZWVtcyB0byBiZSBpbiBgdGlwY19kaXNjX3JjdmAsIHdoZXJlIHRoZSBwYWNrZXQgZGF0YSBpcyBiZWluZyByZWFkIGJlZm9yZSB0aGUgcGFja2V0cyYjMzk7cyBpbnRlZ3JpdHkgb3Igc2l6ZSBhcmUgdmVyaWZpZWQgKGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBjaGVja3MpLCBvciBiZWZvcmUgaXQmIzM5O3MgZXZlbiBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLgoKVGhlIGtpY2tlciBpcywgdGhpcyAqd29uJiMzOTt0KiB0cmlnZ2VyIEtBU0FOLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCByZWFkaW5nIGZyb20gdGhlIHRhaWxyb29tIG9mIGEgc3RhbmRhcmQtc2l6ZWQgYHNrX2J1ZmZgIGJ1ZmZlciwgbWVhbmluZyB0aGUgcmVhZCB3aWxsIGxpa2VseSBiZSB3aXRoaW4gdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBLQVNBTiBpcyBtZWFudCB0byBmaW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBidXQgS01TQU4gaXMgZ29pbmcgdG8gYmUgbmVlZGVkIGhlcmUuIEtNU0FOIGlzIHRoZSByaWdodCB0b29sIGJlY2F1c2UgdGhlIHJlYWQgaXMgZ29pbmcgdG8gYmUgd2l0aGluIHRoZSBib3VuZHMsIGJ1dCBmcm9tICp1bmluaXRpYWxpemVkKiBtZW1vcnkuIFRoaXMgZGF0YSBpcyB0aGVuIGJlaW5nIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHNvIHRoaXMgaXMgcHJlY2lzZWx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBLTVNBTiB3aWxsIGhpZ2hsaWdodCB0aGUgdXNlIG9mIHRoZXNlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFuZCB0aGUgY29uc2VxdWVuY2VzIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoZW0uIFdlIGFic29sdXRlbHkgbmVlZCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiB0byBjb25maXJtIHRoaXMgZml4IGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGluc2lkaW91cyB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGx1cmtpbmcgaW4gVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4gKipOZWVkc0tNU0FOID0gdHJ1ZS4qKgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxuXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJiMzOTtzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcblxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTiYjMzk7cyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTM6NTcuNjY3MDIyMjI0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcwNDIxNjU3OTYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRJUENcIixcbiAgICBcIlRJUENfTUVESUFfVURQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGlwY19kaXNjX3JjdlwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcXG5cXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxcblxcbkhvd2V2ZXIsIHRoZSB0YWlscm9vbSBieXRlcyBiZXlvbmQgYHNrYi1cXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJ3MgbmV0d29yayBob29rcykuIFRoZSB1bmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdGhlbiB1c2VkIGluIGNvbmRpdGlvbmFsIGxvZ2ljIChlLmcuLCBgaWYgKGNhcHMgXFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IHRydWUsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcyBpbiBgdGlwY19kaXNjX3JjdmAgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIHJlYWRzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgVElQQyBwcm90b2NvbCBsb2dpYyB0aGF0IHByb2Nlc3NlcyBuZXR3b3JrIHBhY2tldHMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjUzOjU3LjY2NzAyNzQ2NFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0MjEzODM2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDQzMjRkNjc1ZDI1ZjIxMTJiMTk5ZDdhNDcxNjMxMWI3OTdlZjAyNDJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcXG5pbmRleCA2ODUzODlkNGIyNDVlLi43NDY3M2NhMWYyZDUwIDEwMDY0NFxcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcXG4rKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jXFxuQEAgLTE5NSwyNyArMTk1LDQ3IEBAIHZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxuIHtcXG4gXFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XFxuIFxcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xcbi1cXHR1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4tXFx0dTE2IGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcXG4rXFx0dTMyIHBuZXRfaGFzaDtcXG4rXFx0dTE2IGNhcHM7XFxuIFxcdGJvb2wgbGVnYWN5ID0gdG4tXFx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcXG4tXFx0dTMyIHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcXG4tXFx0dTMyIHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbitcXHR1MzIgc3VnZztcXG4rXFx0dTMyIHNpZ25hdHVyZTtcXG4gXFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xcbi1cXHR1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XFxuLVxcdHUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcXG4rXFx0dTMyIGRzdDtcXG4rXFx0dTMyIG5ldF9pZDtcXG4gXFx0c3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjtcXG4tXFx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbi1cXHR1MzIgbXR5cCA9IG1zZ190eXBlKGhkcik7XFxuK1xcdHUzMiBzcmM7XFxuK1xcdHUzMiBtdHlwO1xcbiBcXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xcbiBcXHRib29sIHJlc3BvbmQgPSBmYWxzZTtcXG4gXFx0dTMyIHNlbGY7XFxuIFxcdGludCBlcnI7XFxuIFxcbitcXHQvKiBEaXNjb3ZlcnkgbWVzc2FnZXMgYWx3YXlzIGNhcnJ5IHRoZSBtYXhpbXVtIHNpemUgVElQQyBoZWFkZXJcXG4rXFx0ICogcGx1cyBhIG5vZGUgaWRlbnRpdHksIHNlZSB0aXBjX2Rpc2NfaW5pdF9tc2coKS4gVGhlIGhlYWRlclxcbitcXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcXG4rXFx0ICogdGhlIG1pbmltdW0gaGVhZGVyIHNpemUsIHNvIGRpc2NhcmQgc2hvcnRlciBtZXNzYWdlcyBiZWZvcmVcXG4rXFx0ICogcmVhZGluZyB0aGVtLlxcbitcXHQgKi9cXG4rXFx0aWYgKG1zZ19oZHJfc3ooaGRyKSBcXHUwMDNjIE1BWF9IX1NJWkUgfHxcXG4rXFx0ICAgIG1zZ19zaXplKGhkcikgXFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcXG4rXFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0aWYgKHNrYl9saW5lYXJpemUoc2tiKSkge1xcbiBcXHRcXHRrZnJlZV9za2Ioc2tiKTtcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4rXFx0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4rXFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xcbitcXHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XFxuK1xcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbitcXHRkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcXG4rXFx0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XFxuK1xcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbitcXHRtdHlwID0gbXNnX3R5cGUoaGRyKTtcXG4gXFxuIFxcdGlmIChjYXBzIFxcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxcbiBcXHRcXHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1Mzo1OS4wMTAwOTMxMjhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNDczMzY5MDI5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUSVBDXCIsXG4gICAgXCJUSVBDX01FRElBX1VEUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInRpcGNfZGlzY19yY3ZcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGJvdW5kcyBjaGVja2luZyBmb3IgaW5jb21pbmcgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZXMgaW4gYHRpcGNfZGlzY19yY3ZgIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIFRJUEMgcHJvdG9jb2wgbG9naWMgdGhhdCBwcm9jZXNzZXMgbmV0d29yayBwYWNrZXRzLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0MzI0ZDY3NWQyNWYyMTEyYjE5OWQ3YTQ3MTYzMTFiNzk3ZWYwMjQyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuY1xuaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDRcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcbisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbkBAIC0xOTUsMjcgKzE5NSw0NyBAQCB2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIHtcbiBcdHN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpO1xuIFx0c3RydWN0IHRpcGNfbXNnICpoZHIgPSBidWZfbXNnKHNrYik7XG4tXHR1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcbi1cdHUxNiBjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7XG4rXHR1MzIgcG5ldF9oYXNoO1xuK1x0dTE2IGNhcHM7XG4gXHRib29sIGxlZ2FjeSA9IHRuLVx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcbi1cdHUzMiBzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4tXHR1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4rXHR1MzIgc3VnZztcbitcdHUzMiBzaWduYXR1cmU7XG4gXHR1OCBwZWVyX2lkW05PREVfSURfTEVOXSA9IHswLH07XG4tXHR1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4tXHR1MzIgbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4rXHR1MzIgZHN0O1xuK1x0dTMyIG5ldF9pZDtcbiBcdHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWFkZHI7XG4tXHR1MzIgc3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4tXHR1MzIgbXR5cCA9IG1zZ190eXBlKGhkcik7XG4rXHR1MzIgc3JjO1xuK1x0dTMyIG10eXA7XG4gXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xuIFx0Ym9vbCByZXNwb25kID0gZmFsc2U7XG4gXHR1MzIgc2VsZjtcbiBcdGludCBlcnI7XG4gXG4rXHQvKiBEaXNjb3ZlcnkgbWVzc2FnZXMgYWx3YXlzIGNhcnJ5IHRoZSBtYXhpbXVtIHNpemUgVElQQyBoZWFkZXJcbitcdCAqIHBsdXMgYSBub2RlIGlkZW50aXR5LCBzZWUgdGlwY19kaXNjX2luaXRfbXNnKCkuIFRoZSBoZWFkZXJcbitcdCAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZFxuK1x0ICogdGhlIG1pbmltdW0gaGVhZGVyIHNpemUsIHNvIGRpc2NhcmQgc2hvcnRlciBtZXNzYWdlcyBiZWZvcmVcbitcdCAqIHJlYWRpbmcgdGhlbS5cbitcdCAqL1xuK1x0aWYgKG1zZ19oZHJfc3ooaGRyKSBcdTAwM2MgTUFYX0hfU0laRSB8fFxuK1x0ICAgIG1zZ19zaXplKGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0aWYgKHNrYl9saW5lYXJpemUoc2tiKSkge1xuIFx0XHRrZnJlZV9za2Ioc2tiKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuIFx0aGRyID0gYnVmX21zZyhza2IpO1xuK1x0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcbitcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbitcdHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcbitcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xuK1x0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4rXHRuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcbitcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuK1x0bXR5cCA9IG1zZ190eXBlKGhkcik7XG4gXG4gXHRpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxuIFx0XHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTM6NTkuMDEwMDk0NjE4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk1MjI2NTY3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBUSVBDIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC90aXBjL2Rpc2NvdmVyLmNgLiBJdCdzIHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBUaGUgY29yZSBvZiBpdCBpcyBhIGRlZmVuc2l2ZSBjaGVjayB3aXRoaW4gYHRpcGNfZGlzY19yY3ZgLiBCYXNpY2FsbHksIGJlZm9yZSBkaXZpbmcgaW50byBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UsIGl0IHZlcmlmaWVzIHRoZSBtZXNzYWdlIGhlYWRlciBzaXplIGFuZCB0aGUgb3ZlcmFsbCBtZXNzYWdlIHNpemUuIFNtYXJ0LiBUaGlzIGlzIGNsZWFybHkgYSBmdW5jdGlvbmFsIGZpeCwgYWRkcmVzc2luZyBhIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIHJlYWQgdnVsbmVyYWJpbGl0eSBvciBhIHJlbGF0ZWQgbWVtb3J5IGFjY2VzcyBpc3N1ZSDigJMgZXhhY3RseSB0aGUga2luZCBvZiB0aGluZyB3ZSBuZWVkIHRvIGNhdGNoLiBXZSdyZSB0YWxraW5nIGFib3V0IHRoZSBUSVBDIHN1YnN5c3RlbSBoZXJlLCBzbyB0aGlzIGNoYW5nZSBrZWVwcyBpdHMgaW50ZWdyaXR5LiBOb3csIEkgbmVlZCB0byBjb25maXJtIHRoZSBjaGFuZ2UgYnkgZGlnZ2luZyBpbnRvIGBuZXQvdGlwYy9kaXNjb3Zlci5jYCB0byBzZWUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiwgYW5kIEkgc2hvdWxkIGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBmaWxlIHRvIGNvbmZpcm0gYWxsIFRJUEMgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTc4LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MDIuOTYyMzY0MDlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk2NDYwMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFRJUENcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGlwYy9LY29uZmlnLTUtXFxubmV0L3RpcGMvS2NvbmZpZzo2Om1lbnVjb25maWcgVElQQ1xcbm5ldC90aXBjL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiVGhlIFRJUEMgUHJvdG9jb2xcXFwiXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnLTI0LVxcbm5ldC90aXBjL0tjb25maWc6MjU6Y29uZmlnIFRJUENfTUVESUFfSUJcXG5uZXQvdGlwYy9LY29uZmlnLTI2LVxcdGJvb2wgXFxcIkluZmluaUJhbmQgbWVkaWEgdHlwZSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZy0zMC1cXHQgIElQLW92ZXItSW5maW5pQmFuZCBkZXZpY2VzLlxcbm5ldC90aXBjL0tjb25maWc6MzE6Y29uZmlnIFRJUENfTUVESUFfVURQXFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cXHRib29sIFxcXCJJUC9VRFAgbWVkaWEgdHlwZSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZy0zOC1cXG5uZXQvdGlwYy9LY29uZmlnOjM5OmNvbmZpZyBUSVBDX0NSWVBUT1xcbm5ldC90aXBjL0tjb25maWctNDAtXFx0Ym9vbCBcXFwiVElQQyBlbmNyeXB0aW9uIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnLTUzLVxcbm5ldC90aXBjL0tjb25maWc6NTQ6Y29uZmlnIFRJUENfRElBR1xcbm5ldC90aXBjL0tjb25maWctNTUtXFx0dHJpc3RhdGUgXFxcIlRJUEM6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MDMuMDEyMDE1NDc1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk2NzczNTMwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYHRpcGNfZGlzY19yY3ZgIEZ1bmN0aW9uKipcblxuQWxyaWdodCwgSSdtIHdvcmtpbmcgd2l0aCBhIGBUSVBDYCBjb25maWd1cmF0aW9uIGhlcmUuIE5vdywgdGhlIGNvZGUncyBjYWxsaW5nIGB0aXBjX2Rpc2NfcmN2YCwgYW5kIG15IGluaXRpYWwgZm9jdXMgaXMgb24gaXRzIHNjb3BlLiBJcyB0aGlzIGZ1bmN0aW9uIHN0YXRpYywgbWVhbmluZyBpdCdzIGNvbmZpbmVkIHRvIGl0cyBtb2R1bGUsIG9yIGlzIGl0IGV4cG9ydGVkLCBhbmQgdGhlcmVmb3JlIGNhbGxhYmxlIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbD8gVGhhdCdzIHRoZSBmaXJzdCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBLbm93aW5nIHRoYXQgd2lsbCBpbmZsdWVuY2UgaG93IEkgYXBwcm9hY2ggdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgcG90ZW50aWFsIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzeXN0ZW0uIElmIGl0J3Mgc3RhdGljLCBpdCdzIGVhc2llciB0byByZWFzb24gYWJvdXQgaW4gaXNvbGF0aW9uLCB3aGVyZWFzIGlmIGV4cG9ydGVkLCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGludGVyYWN0aW9ucyB3aXRoIGEgd2lkZXIgYXJyYXkgb2YgbW9kdWxlcy4gVGltZSB0byBkaWcgaW4gYW5kIGNoZWNrIGl0cyBkZWNsYXJhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE5MSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjA2Ljk3OTc1MzIzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODgwNTM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRpcGNfZGlzY19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXFxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE4OS0gKiBAbmV0OiBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2VcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTkzOnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmg6NDg6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmJ1ZixcXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVxcdFxcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpO1xcbi0tXFxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL25vZGUuYy0yMTI1LVxcdFxcdGlmICh1bmxpa2VseSh1c3IgPT0gTElOS19DT05GSUcpKVxcbm5ldC90aXBjL25vZGUuYzoyMTI2OlxcdFxcdFxcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcXG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cXHRcXHRlbHNlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjA3LjAyODYzODI5NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzEyMjEyMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRm9jdXNpbmcgb24gdGhlIFRJUEMgRGlzY29ubmVjdCBSZWNlaXZlcioqXG5cbk9rYXksIHNvIGB0aXBjX2Rpc2NfcmN2YCBpc24ndCBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCdzIGtleS4gSXQncyBjYWxsZWQgZnJvbSBgdGlwY19yY3ZgLCB3aGljaCBtZWFucyBpdCdzIGEgc3BlY2lmaWMgcGFydCBvZiBhIGxhcmdlciBwcm9jZXNzLiBHaXZlbiB0aGF0LCBgdGlwY19kaXNjX3JjdmAgc2VlbXMgbGlrZSBhIG1vcmUgZm9jdXNlZCBzeW1ib2wgdG8gZXhwbG9yZS4gYHRpcGNfcmN2YCBpcyBpbnRlcmVzdGluZyB0b28sIGJ1dCBpdCBmZWVscyBicm9hZGVyLiBMZXQncyBzdGFydCB3aXRoIGB0aXBjX2Rpc2NfcmN2YC4gSSBzaG91bGQgY2hlY2sgaWYgYW55dGhpbmcgc3BlY2lmaWMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXR0ZW50aW9uIHJlbGF0ZWQgdG8gdGhpcy5cblxuSSByZW1lbWJlciB0aGF0IGBUSVBDYCBpdHNlbGYgaXMgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBvcHRpb24uIFNvIEkgbmVlZCB0byBkaWcgaW50byB0aGUgZGVwZW5kZW5jaWVzIGZvciBgVElQQ2AuIE15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIGBuZXQvdGlwYy9LY29uZmlnYCB0byBzZWUgd2hhdCBlbHNlIG1pZ2h0IGJlIHJlcXVpcmVkIGZvciBgVElQQ2AgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiBUaGlzIGlzIHRoZSBwbGFjZSB0byBjaGVjayBmb3IgcmVsYXRlZCBjb25maWd1cmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg1MiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxMC40OTk4NjE3MDlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkxMjc0MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGVwZW5kcyBvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL0tjb25maWc9Nj1tZW51Y29uZmlnIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIlRoZSBUSVBDIFByb3RvY29sXFxcIlxcbm5ldC90aXBjL0tjb25maWc6ODpcXHRkZXBlbmRzIG9uIElORVRcXG5uZXQvdGlwYy9LY29uZmlnOjk6XFx0ZGVwZW5kcyBvbiBJUFY2IHx8IElQVjY9blxcbm5ldC90aXBjL0tjb25maWctMTAtXFx0aGVscFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0yNT1jb25maWcgVElQQ19NRURJQV9JQlxcbm5ldC90aXBjL0tjb25maWctMjYtXFx0Ym9vbCBcXFwiSW5maW5pQmFuZCBtZWRpYSB0eXBlIHN1cHBvcnRcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzoyNzpcXHRkZXBlbmRzIG9uIFRJUEMgXFx1MDAyNlxcdTAwMjYgSU5GSU5JQkFORF9JUE9JQlxcbm5ldC90aXBjL0tjb25maWctMjgtXFx0aGVscFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0zMT1jb25maWcgVElQQ19NRURJQV9VRFBcXG5uZXQvdGlwYy9LY29uZmlnLTMyLVxcdGJvb2wgXFxcIklQL1VEUCBtZWRpYSB0eXBlIHN1cHBvcnRcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzozMzpcXHRkZXBlbmRzIG9uIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTM0LVxcdHNlbGVjdCBORVRfVURQX1RVTk5FTFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0zOT1jb25maWcgVElQQ19DUllQVE9cXG5uZXQvdGlwYy9LY29uZmlnLTQwLVxcdGJvb2wgXFxcIlRJUEMgZW5jcnlwdGlvbiBzdXBwb3J0XFxcIlxcbm5ldC90aXBjL0tjb25maWc6NDE6XFx0ZGVwZW5kcyBvbiBUSVBDXFxubmV0L3RpcGMvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQ1JZUFRPXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnPTU0PWNvbmZpZyBUSVBDX0RJQUdcXG5uZXQvdGlwYy9LY29uZmlnLTU1LVxcdHRyaXN0YXRlIFxcXCJUSVBDOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzo1NjpcXHRkZXBlbmRzIG9uIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTU3LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxMC41NDg5OTMxMzRaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDcxMzMxNDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlRJUEMgQ29uZmlndXJhdGlvbiBhbmQgVnVsbmVyYWJpbGl0eSBBc3Nlc3NtZW50KipcblxuT2theSwgc28gSSBzZWUgYFRJUENgIGlzIHJlbGlhbnQgb24gYElORVRgLiBUaGF0J3Mgc3RyYWlnaHRmb3J3YXJkOyBJJ2xsIGdldCB0aGF0IGFkZGVkIHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdC4gTm93LCBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGB0aXBjX2Rpc2NfcmN2YCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIOKAkyBjcnVjaWFsIGZvciBkZXRlcm1pbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBoZXJlLiBZZXMsIGl0J3MgY2FsbGVkIGZyb20gYHRpcGNfcmN2YCwgd2hpY2ggZXNzZW50aWFsbHkgYWN0cyBhcyB0aGUgcHJpbWFyeSByZWNlaXZlIGZ1bmN0aW9uIGZvciBhbGwgVElQQyBwYWNrZXRzLCBzbyB0aGF0J3MgYSBkaXJlY3QgZW50cnkgcG9pbnQuXG5cblRoaXMgcGF0Y2gsIGl0J3MgYWRkcmVzc2luZyBhbiBvdXQtb2YtYm91bmRzIHJlYWQsIGFuZCB0aGF0J3MgY29uY2VybmluZy4gVGhlIGZpeCBpbnZvbHZlcyBjaGVja2luZyBgbXNnX2hkcl9zeihoZHIpYCBhbmQgYG1zZ19zaXplKGhkcilgIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGFjY2VzcyBjZXJ0YWluIGZpZWxkcy4gVGhhdCBzb3VuZHMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLCBidXQgaXQgZGVmaW5pdGVseSB3YXJyYW50cyB0aG9yb3VnaCBmdXp6aW5nLlxuXG5Ob3csIGxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCBgdGlwY19kaXNjX3JjdmAsIHdoaWNoIGxpdmVzIGluIGBuZXQvdGlwYy9kaXNjb3Zlci5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBjb2RlIHRvIGFzc2VzcyB0aGUgdnVsbmVyYWJpbGl0eSBwcm9wZXJseS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDYwNSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxNS4wMjAzMjc0MThaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODkxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvZGlzY292ZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxOTA6XFx0ICogQHNrYjogYnVmZmVyIGNvbnRhaW5pbmcgbWVzc2FnZVxcbiAxOTE6XFx0ICogQGI6IGJlYXJlciB0aGF0IG1lc3NhZ2UgYXJyaXZlZCBvblxcbiAxOTI6XFx0ICovXFxuIDE5MzpcXHR2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiAxOTQ6XFx0XFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbiAxOTU6XFx0e1xcbiAxOTY6XFx0XFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XFxuIDE5NzpcXHRcXHRzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTtcXG4gMTk4OlxcdFxcdHUzMiBwbmV0X2hhc2g7XFxuIDE5OTpcXHRcXHR1MTYgY2FwcztcXG4gMjAwOlxcdFxcdGJvb2wgbGVnYWN5ID0gdG4tXFx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcXG4gMjAxOlxcdFxcdHUzMiBzdWdnO1xcbiAyMDI6XFx0XFx0dTMyIHNpZ25hdHVyZTtcXG4gMjAzOlxcdFxcdHU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTtcXG4gMjA0OlxcdFxcdHUzMiBkc3Q7XFxuIDIwNTpcXHRcXHR1MzIgbmV0X2lkO1xcbiAyMDY6XFx0XFx0c3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjtcXG4gMjA3OlxcdFxcdHUzMiBzcmM7XFxuIDIwODpcXHRcXHR1MzIgbXR5cDtcXG4gMjA5OlxcdFxcdGJvb2wgZHVwbF9hZGRyID0gZmFsc2U7XFxuIDIxMDpcXHRcXHRib29sIHJlc3BvbmQgPSBmYWxzZTtcXG4gMjExOlxcdFxcdHUzMiBzZWxmO1xcbiAyMTI6XFx0XFx0aW50IGVycjtcXG4gMjEzOlxcdFxcbiAyMTQ6XFx0XFx0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXFxuIDIxNTpcXHRcXHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXFxuIDIxNjpcXHRcXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcXG4gMjE3OlxcdFxcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXFxuIDIxODpcXHRcXHQgKiByZWFkaW5nIHRoZW0uXFxuIDIxOTpcXHRcXHQgKi9cXG4gMjIwOlxcdFxcdGlmIChtc2dfaGRyX3N6KGhkcikgXFx1MDAzYyBNQVhfSF9TSVpFIHx8XFxuIDIyMTpcXHRcXHQgICAgbXNnX3NpemUoaGRyKSBcXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xcbiAyMjI6XFx0XFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuIDIyMzpcXHRcXHRcXHRyZXR1cm47XFxuIDIyNDpcXHRcXHR9XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcXG4gMjI3OlxcdFxcdFxcdGtmcmVlX3NrYihza2IpO1xcbiAyMjg6XFx0XFx0XFx0cmV0dXJuO1xcbiAyMjk6XFx0XFx0fVxcbiAyMzA6XFx0XFx0aGRyID0gYnVmX21zZyhza2IpO1xcbiAyMzE6XFx0XFx0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4gMjMyOlxcdFxcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcXG4gMjMzOlxcdFxcdHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcXG4gMjM0OlxcdFxcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbiAyMzU6XFx0XFx0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XFxuIDIzNjpcXHRcXHRuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcXG4gMjM3OlxcdFxcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbiAyMzg6XFx0XFx0bXR5cCA9IG1zZ190eXBlKGhkcik7XFxuIDIzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MTUuMDIwNDE4NDQ4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2MzcyNzg3NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgVGhpcyBUSVBDIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCdzIGEgZ29vZCwgc2Vuc2libGUgYWRkaXRpb24uIEl0IGxvb2tzIGxpa2Ugd2UncmUgaW50cm9kdWNpbmcgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGxvb2tpbmcgYXQgYG1zZ19oZHJfc3ooaGRyKWAgYW5kIGBtc2dfc2l6ZShoZHIpYC4gV2UncmUgdmVyaWZ5aW5nIGlmIHRoZXNlIHNpemVzIGFyZSB3aXRoaW4gc2Vuc2libGUgYm91bmRzLCBjb21wYXJpbmcgdGhlbSB0byBgTUFYX0hfU0laRWAgYW5kIGBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU5gLiBUaGlzIGlzIHJlYWNoYWJsZSB0aHJvdWdoIGB0aXBjX3JjdmAsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgaW5jb21pbmcgVElQQyBwYWNrZXRzLlxuXG5Gcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUsIHRoaXMgaXMgaW1wb3J0YW50LiBUaGlzIGtpbmQgb2YgY2hlY2sgaXMgYWx3YXlzIHdvcnRod2hpbGUgdG8gcHJldmVudCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyBvciBvdGhlciBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMgYXJpc2luZyBmcm9tIG1hbGZvcm1lZCBvciBtYWxpY2lvdXMgbWVzc2FnZXMuIEl0IG1ha2VzIHNlbnNlIHRvIGZ1enogdGhpcy5cblxuTXkgcHJpbWFyeSBmb2N1cyBoZXJlLCBmb3IgZnV6emluZyBwdXJwb3NlcywgaXMgZGVmaW5pdGVseSBnb2luZyB0byBiZSBgdGlwY19kaXNjX3JjdmAuIFRoYXQncyB3aGVyZSBJJ2xsIGNvbmNlbnRyYXRlIG15IGluaXRpYWwgZWZmb3J0cy5cblxuSSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgYWxsIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkIGZvciB0aG9yb3VnaCB0ZXN0aW5nLiBBc2lkZSBmcm9tIHRoZSBiYXNpYyBgVElQQ2AgY29uZmlndXJhdGlvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBmb3IgcmVsYXRlZCBjb25maWdzLiBBaGEsIGBUSVBDX01FRElBX1VEUGAgd291bGQgYmUgYW4gZXhjZWxsZW50IGNob2ljZSB0byBpbmNsdWRlISBFbmFibGluZyBUSVBDIG92ZXIgVURQIGlzIGEgY29tbW9uIGFwcHJvYWNoIGZvciBmdXp6aW5nIFRJUEMgaW1wbGVtZW50YXRpb25zLCBtYWtpbmcgaXQgZWFzaWVyIHRvIGNyYWZ0IGFuZCBpbmplY3QgVURQIHBhY2tldHMgdG8gdGVzdCB0aGUgbmV3IGJvdW5kcyBjaGVja2luZy4gU28sIEkgd2lsbCBhZGQgYFRJUENfTUVESUFfVURQYCB0byB0aGUgbGlzdCBvZiBlbmFibGVkIGNvbmZpZ3VyYXRpb25zIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBtb3JlIGNvbXBsZXRlIHRlc3RpbmcgZW52aXJvbm1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3NjUsIk91dHB1dFRva2VucyI6MTA4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MjMuNjU3Njk5ODg3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODYwNzg0NTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRJUENcIixcbiAgICBcIlRJUENfTUVESUFfVURQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGlwY19kaXNjX3JjdlwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcyBpbiBgdGlwY19kaXNjX3JjdmAgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIHJlYWRzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgVElQQyBwcm90b2NvbCBsb2dpYyB0aGF0IHByb2Nlc3NlcyBuZXR3b3JrIHBhY2tldHMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVElQQ1wiLFxuICAgIFwiVElQQ19NRURJQV9VRFBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0aXBjX2Rpc2NfcmN2XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MjMuNzQzNzkwNDQ1WiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQzNDQ4Nzg3NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoyMy43NDQ1MjA0NjVaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTQ0MzQ0MTQ1NDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxcblxcbldoZW4gYSBtYWxpY2lvdXNseSBzbWFsbCBvciBmcmFnbWVudGVkIHBhY2tldCBpcyByZWNlaXZlZCwgcmVhZGluZyB0aGVzZSBmaWVsZHMgYWNjZXNzZXMgdGhlIHRhaWxyb29tIG9mIHRoZSBgc2tfYnVmZmAgZGF0YSBidWZmZXIuIEJlY2F1c2UgbmV0d29yayBkcml2ZXJzIHR5cGljYWxseSBhbGxvY2F0ZSBzdGFuZGFyZC1zaXplZCBjaHVua3MgKGUuZy4sIDI1NiwgMTUwMCwgb3IgMjA0OCBieXRlcykgZm9yIGBza19idWZmYCBkYXRhLCB0aGVzZSByZWFkcyB3aWxsIGxpa2VseSBmYWxsIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhbGxvY2F0ZWQgaGVhcCBjaHVuay4gQ29uc2VxdWVudGx5LCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgdGhpcyBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVxcdTAwM2VsZW5gIG9yIGBza2JfaGVhZGxlbmAgYXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChhbmQgYXJlIGV4cGxpY2l0bHkgcG9pc29uZWQgYnkgS01TQU4ncyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClgLCBgaWYgKG10eXAgPT0gRFNDX1JFUV9NU0cpYCkgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHdoaWNoIGNvdWxkIGNvcnJ1cHQgaW50ZXJuYWwgc3RhdGUgb3IgbGVhZCB0byBpbmZvLWxlYWtzLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgbWFraW5nIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBoaWdobHkganVzdGlmaWVkIHRvIHZlcmlmeSB0aGlzIGZpeCBhbmQgZW5zdXJlIG5vIG90aGVyIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IGluIHRoZSBUSVBDIHBhY2tldCBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNDMyNGQ2NzVkMjVmMjExMmIxOTlkN2E0NzE2MzExYjc5N2VmMDI0MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDE5OjUzOjU1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbmluZGV4IDY4NTM4OWQ0YjI0NWUuLjc0NjczY2ExZjJkNTAgMTAwNjQ0XG4tLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jXG4rKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jXG5AQCAtMTk1LDI3ICsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiB7XG4gXHRzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTtcbiBcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xuLVx0dTMyIHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4tXHR1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuK1x0dTMyIHBuZXRfaGFzaDtcbitcdHUxNiBjYXBzO1xuIFx0Ym9vbCBsZWdhY3kgPSB0bi1cdTAwM2VsZWdhY3lfYWRkcl9mb3JtYXQ7XG4tXHR1MzIgc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpO1xuLVx0dTMyIHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xuK1x0dTMyIHN1Z2c7XG4rXHR1MzIgc2lnbmF0dXJlO1xuIFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xuLVx0dTMyIGRzdCA9IG1zZ19kZXN0X2RvbWFpbihoZHIpO1xuLVx0dTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpO1xuK1x0dTMyIGRzdDtcbitcdHUzMiBuZXRfaWQ7XG4gXHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuLVx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuLVx0dTMyIG10eXAgPSBtc2dfdHlwZShoZHIpO1xuK1x0dTMyIHNyYztcbitcdHUzMiBtdHlwO1xuIFx0Ym9vbCBkdXBsX2FkZHIgPSBmYWxzZTtcbiBcdGJvb2wgcmVzcG9uZCA9IGZhbHNlO1xuIFx0dTMyIHNlbGY7XG4gXHRpbnQgZXJyO1xuIFxuK1x0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4rXHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXG4rXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcbitcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4rXHQgKiByZWFkaW5nIHRoZW0uXG4rXHQgKi9cbitcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbitcdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcbitcdFx0a2ZyZWVfc2tiKHNrYik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcbiBcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbitcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4rXHRjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7XG4rXHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4rXHRzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTtcbitcdGRzdCA9IG1zZ19kZXN0X2RvbWFpbihoZHIpO1xuK1x0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4rXHRzcmMgPSBtc2dfcHJldm5vZGUoaGRyKTtcbitcdG10eXAgPSBtc2dfdHlwZShoZHIpO1xuIFxuIFx0aWYgKGNhcHMgXHUwMDI2IFRJUENfTk9ERV9JRDEyOClcbiBcdFx0bWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjIzLjc0NDUyMjg1NVoiLCJTZXEiOjE1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNDA4MjQxOTQwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBDb25zaWRlcmF0aW9uIGZvciBhIFRJUEMgRGlzY292ZXJ5IFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHRpcGNfZGlzY19yY3ZgIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIGl0IGRlbGF5cyBzb21lIGZpZWxkIHJlYWRzIGZyb20gdGhlIGB0aXBjX21zZ2AgaGVhZGVyIHVudGlsIGFmdGVyIGl0IGNoZWNrcyB0aGUgbWVzc2FnZSBzaXplIGFuZCBsaW5lYXJpemVzIHRoZSBgc2tiYC4gVGhlIG9yaWdpbmFsIGNvZGUsIGJlZm9yZSB0aGUgcGF0Y2gsIHJlYWRzIHN0dWZmIGxpa2UgYG1zZ19wZWVyX25ldF9oYXNoYCwgYG1zZ19ub2RlX2NhcGFiaWxpdGllc2AsIHJpZ2h0IG9mZiB0aGUgYmF0IGZyb20gdGhlIGBza2JgIGRhdGEuIE5vdywgdGhlIG1haW4gcHJvYmxlbSB0aGlzIGlzIGZpeGluZywgYXMgZmFyIGFzIEkgY2FuIHNlZSwgaXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkIGlmIHRoZSBgc2tiYCBpcyBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQsIG9yIGlmIHRoZXJlJ3MgZnJhZ21lbnRhdGlvbi5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhlIGNvbnRleHQgb2Yga2VybmVsIGNvZGUsIGlzIHRoYXQgdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOLiAgQnV0IHRoZW4gSSBwYXVzZTogYW0gSSB0aGlua2luZyBvZiB0aGlzIGNvcnJlY3RseT8gSXMgaXQgS01TQU4gdGVycml0b3J5PyBXYWl0LCBpZiB0aGUgc2tiIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzdHJ1Y3QgaXQncyBwb2ludGluZyB0bywgdGhlbiByZWFkaW5nIGJleW9uZCB0aGF0IGxlbmd0aCB3b3VsZCBiZSByZWFkaW5nIG91dHNpZGUgdGhlIGRhdGEgdGhhdCB3YXMgaW5pdGlhbGl6ZWQsIHdoaWNoIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiBjb3VsZCBjYXRjaCB0aGlzLCBlc3BlY2lhbGx5IGlmIHRoZSBhbGxvY2F0aW9uIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCBkYXRhLlxuXG5JIHN0YXJ0IHRvIHRoaW5rIGFib3V0IHRoZSBkaWZmZXJlbnQgdG9vbHMgYXZhaWxhYmxlIHRvIG1lLiBJZiBpdCBnb2VzIGJleW9uZCB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgS0FTQU4gKnNob3VsZCogY2F0Y2ggaXQuIEJ1dCwgS0FTQU4gY2FuIG1pc3MgaXQgaWYgaXQgZG9lcyBub3QgZ28gcGFzdCB0aGUgYWxsb2NhdGlvbiBzaXplIGFuZCB0aGF0IGlzIGEgbXVjaCBncmVhdGVyIHJpc2suIFRoZSBwYWNrZXQgbWlnaHQgYmUgb25seSBhIGZldyBieXRlcyBpbiBzaXplLiBUaGUgZGF0YSBidWZmZXIgaXMgb2Z0ZW4gbXVjaCBsYXJnZXIgKGUuZy4sIE1UVSBvciBwYWdlIHNpemUpLiBTbywgcmVhZGluZyB0aG9zZSBoZWFkZXIgZmllbGRzIGZyb20gYSBzbWFsbCBwYWNrZXQgY2FuIHJlYWQgaW50byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIEtNU0FOIGlzIHRoZSBjb3JyZWN0IHRvb2wuICBJdCdzIHZlcnkgZ29vZCBhdCBjYXRjaGluZyByZWFkcyBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gIHdoZXJlIHRoZSBidWZmZXIgaXRzZWxmIGlzIGxhcmdlci5cblxuQW5kIHRoZSBwcm9tcHQsIGFoLCB0aGF0J3Mgd2hhdCdzIGltcG9ydGFudC4gSXQgc2F5cywgXCJOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcy4uLiBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXCIgIEkgc2VlLi4uIHRoaXMgcGF0Y2ggbW9kaWZpZXMgdGhlIGJvdW5kcyBjaGVja3MuIEl0ICpmaXhlcyogYSBzaXR1YXRpb24gd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2FzIGJlaW5nIGFjY2Vzc2VkIVxuXG5TbywgdGhlIGNvZGUgKmZpeGVzKiBhbiBpc3N1ZSwgYnV0IGlzIHRoZSBmaXggY29ycmVjdCBhbmQgY29tcGxldGU/IEkgcmVhZCB0aGUgcGF0Y2ggbW9yZSBjYXJlZnVsbHkuIEl0J3MgYWRkaW5nIHRoaXMgY2hlY2s6XG5gYGBjXG5cdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcblx0ICAgIG1zZ19zaXplKGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xuXHRcdGtmcmVlX3NrYihza2IpO1xuXHRcdHJldHVybjtcblx0fVxuYGBgXG5BbmQgaXQgZG9lcyB0aGlzICpiZWZvcmUqIGxpbmVhcml6aW5nLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgZmllbGQgcmVhZHMgdG8gYWZ0ZXIgdGhlIGNoZWNrcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBiZWZvcmUgdGhlIHBhdGNoIHdhcyB2dWxuZXJhYmxlIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLlxuXG5UaGUgcHJvbXB0IG5vdyByZWFkczogXCJTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXCJcblxuU2luY2UgaXQncyBmaXhpbmcgdGhlIHJlYWQtYmV5b25kLWBza2ItXHUwMDNlbGVuYCBjYXNlLCB0aGlzIHNlZW1zIGxpa2UgKmV4YWN0bHkqIHRoZSBraW5kIG9mIHNpdHVhdGlvbiBLTVNBTiBpcyBkZXNpZ25lZCB0byBkZXRlY3QuIFRoZSBwYXRjaCBjaGFuZ2VzIGhvdyB3ZSdyZSBhY2Nlc3NpbmcgdGhvc2UgdW5pbml0aWFsaXplZCBieXRlcyBpbiBhbiBgc2tiYCwgYnkgcHJldmVudGluZyB0aGUgYWNjZXNzISAgQnV0LCBzaW5jZSB3ZSB3YW50IHRvIGJlIGFic29sdXRlbHkgc3VyZSB0aGlzIGlzIHNvbGlkLCBhbmQgdGhlcmUgY291bGQgYmUgbGF0ZW50IGJ1Z3MuIEluIG9yZGVyIHRvIGVuc3VyZSB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaXMgc291bmQsIEtNU0FOIGlzIHByb2JhYmx5IHRoZSBhcHByb3ByaWF0ZSB0b29sLCBhbmQgSSBzaG91bGQgcnVuIGEgS01TQU4gZnV6emVyIHRvIGdpdmUgaXQgYSBnb29kIGdvaW5nLW92ZXIuXG5cblNvLCB0aGUgZmluYWwgY2FsbCBpczogZ2l2ZW4gdGhlIHBhdGNoICptb2RpZmllcyogdGhlIGJvdW5kcyBjaGVja3MsIGFuZCB0aG9zZSBjaGFuZ2VzIHByZXZlbnQgdGhlIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhIGJ1ZmZlciosIGFuZCBzaW5jZSBLTVNBTiBzcGVjaWZpY2FsbHkgaGVscHMgdXMgY2F0Y2ggcmVhZHMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCB0aGF0IEtBU0FOIG1pZ2h0IG1pc3MsIEkgbmVlZCB0byBpbmNsdWRlIGBOZWVkc0tNU0FOPXRydWVgIHRvIHByb3Blcmx5IHZlcmlmeSB0aGF0IHRoaXMgYXJlYSBvZiB0aGUgY29kZSBpcyBzb3VuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU3NSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo0Ny44MjY5NDUwNzdaIiwiU2VxIjoxNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMzk4MzQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19wZWVyX25ldF9oYXNoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGlwYy9kaXNjb3Zlci5jPTE5Mz12b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzAtXFx0aGRyID0gYnVmX21zZyhza2IpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MjMxOlxcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzItXFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xcbi0tXFxubmV0L3RpcGMvbXNnLmg9MTEyMz1zdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuLS1cXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxcbm5ldC90aXBjL21zZy5oOjExMjg6c3RhdGljIGlubGluZSB1MzIgbXNnX3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptKVxcbm5ldC90aXBjL21zZy5oLTExMjkte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo0Ny44NzczNDgxOTNaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQxOTA5ODE3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbXNnX3BlZXJfbmV0X2hhc2hgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYG5ldC90aXBjL21zZy5oYCBhZ2Fpbiwgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBgbXNnX3BlZXJfbmV0X2hhc2hgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSBUSVBDJ3MgaGFuZGxpbmcgb2YgbmV0d29yayBwZWVyIGlkZW50aWZpZXJzIGFuZCB0aGVpciBoYXNoaW5nIGNvbWVzIGludG8gcGxheS4gSSBuZWVkIGEgcmVmcmVzaGVyIG9uIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gaGVyZSwgYW5kIGhvdyBpdCByZWxhdGVzIHRvIHRoZSBicm9hZGVyIGNvbm5lY3Rpb24gbWFuYWdlbWVudCBpbiB0aGUgVElQQyBhcmNoaXRlY3R1cmUuIEknbSBhc3N1bWluZyB0aGF0IHRoaXMgaGFzaCBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSBpbiBlZmZpY2llbnQgbG9va3VwcyBhbmQgcG90ZW50aWFsbHkgbG9hZCBiYWxhbmNpbmcgZm9yIG5ldHdvcmsgbWVzc2FnZXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSBpZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbGlnbnMgd2l0aCBiZXN0IHByYWN0aWNlcyBmcm9tIGEgcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmUuIEkgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHNlY3VyaXR5IGltcGxpY2F0aW9ucyB3ZXJlIGFkZHJlc3NlZCBkdXJpbmcgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBzdHJ1Y3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3NTIsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo1MS4yOTY0NDg2NTJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4MTYwNzI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19wZWVyX25ldF9oYXNoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL21zZy5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL21zZy5oPTExMjM9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxcbi0tXFxubmV0L3RpcGMvbXNnLmgtMTEyNy1cXG5uZXQvdGlwYy9tc2cuaDoxMTI4OnN0YXRpYyBpbmxpbmUgdTMyIG1zZ19wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSlcXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6NTEuMzQ0NjE0MDE3WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5NjgwMTA5MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnZSBIZWFkZXIqKlxuXG5Pa2F5LCBsZXQncyB6ZXJvIGluIG9uIGBuZXQvdGlwYy9tc2cuaGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCB2ZXJpZnkgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbWVzc2FnZSBoZWFkZXIgc3RydWN0dXJlLCBzbyBJJ20gbmF2aWdhdGluZyBkb3duIHRvIGFyb3VuZCBsaW5lIDExMjguIEkga25vdyB0aGVyZSdzIGtleSBkYXRhIGFib3V0IG1lc3NhZ2UgdHlwZXMsIHByaW9yaXRpZXMsIGFuZCBkZWxpdmVyeSBmbGFncyBkZWNsYXJlZCBpbiB0aGF0IHZpY2luaXR5LiBJJ20gcHJvYmFibHkgbG9va2luZyBmb3IgdGhlIHN0cnVjdCBkZWZpbml0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbGF5b3V0IG9mIHRoZSBUSVBDIG1lc3NhZ2UgaGVhZGVyIGl0c2VsZi4gSSB3YW50IHRvIHF1aWNrbHkgY29uZmlybSB0aGUgZmllbGRzIGFuZCB0aGVpciBiaXR3aXNlIGVuY29kaW5ncyBiZWZvcmUgSSBhbmFseXplIHRoZSByZWxhdGVkIGNvZGUuIEknbSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBkZXN0aW5hdGlvbiBub2RlIElELCBwb3J0IElELCBvciB0aGUgc2VydmljZSB0eXBlLCBhcyB3ZWxsIGFzIHRoZSBmbGFncyB0aGF0IGRldGVybWluZSByZXRyYW5zbWlzc2lvbiBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCBJJ20gdHJ5aW5nIHRvIHJlbWVtYmVyIGlmIHRoZSBmbGFncyBmb3IgZnJhZ21lbnRlZCBtZXNzYWdlcyBhcmUgcGxhY2VkIGluIHRoZSBoZWFkZXIsIG9yIHNvbWV3aGVyZSBlbHNlLiBJJ2xsIGZvY3VzIG9uIGFueXRoaW5nIHJlbGF0ZWQgdG8gc2VxdWVuY2UgbnVtYmVycyBvciBhY2tub3dsZWRnZW1lbnRzIGF0IHRoYXQgc3BvdCBhcyB3ZWxsLiBUaW1lIHRvIGdldCB0aGUgZGV0YWlscyByaWdodC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjEwMiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjU1LjMxMjYyNzczMVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDk5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGlwYy9tc2cuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxMTIwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTIwOlxcdFxcbjExMjE6XFx0LyogV29yZCAxM1xcbjExMjI6XFx0ICovXFxuMTEyMzpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuMTEyNDpcXHR7XFxuMTEyNTpcXHRcXHRtc2dfc2V0X3dvcmQobSwgMTMsIG4pO1xcbjExMjY6XFx0fVxcbjExMjc6XFx0XFxuMTEyODpcXHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuMTEyOTpcXHR7XFxuMTEzMDpcXHRcXHRyZXR1cm4gbXNnX3dvcmQobSwgMTMpO1xcbjExMzE6XFx0fVxcbjExMzI6XFx0XFxuMTEzMzpcXHQvKiBXb3JkIDE0XFxuMTEzNDpcXHQgKi9cXG4xMTM1OlxcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19zdWdnX25vZGVfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuMTEzNjpcXHR7XFxuMTEzNzpcXHRcXHRyZXR1cm4gbXNnX3dvcmQobSwgMTQpO1xcbjExMzg6XFx0fVxcbjExMzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjU1LjMxMjcyNDI3MVoiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjA5MzIzNzcyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBWdWxuZXJhYmlsaXR5IGluIFRJUEMgRGlzY292ZXJ5IE1lc3NhZ2VzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRoaXMgVElQQyBjb2RlIGhhbmRsZXMgaW5jb21pbmcgZGlzY292ZXJ5IG1lc3NhZ2VzLiBJIHNlZSB0aGF0IHZhcmlvdXMgZmllbGRzIHdpdGhpbiB0aGUgbWVzc2FnZSBoZWFkZXIgYXJlIGJlaW5nIGFjY2Vzc2VkIGF0IHNwZWNpZmljIG9mZnNldHMuIEZvciBleGFtcGxlLCBgbXNnX3BlZXJfbmV0X2hhc2hgIGlzIHJlYWQgYXQgb2Zmc2V0IDUyIGJ5dGVzLCBgbXNnX3N1Z2dfbm9kZV9hZGRyYCBhdCBvZmZzZXQgNTYsIGFuZCBzbyBvbi5cblxuVGhlIHBhdGNoIGluY2x1ZGVzIGEgc2l6ZSBjaGVjazogYGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHwgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSArIE5PREVfSURfTEVOKWAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBpZiB0aGUgaW5jb21pbmcgcGFja2V0IGlzIHNtYWxsZXIgdGhhbiBgTUFYX0hfU0laRWAgKGxpa2VseSA2MCBieXRlcywgb3IgMTUgd29yZHMsIGJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcpLCB0aGVuIHJlYWRpbmcgYXQgdGhlIG9mZnNldHMgbGlrZSA1MiBvciA1NiB3b3VsZCBsZWFkIHRvIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgcmlnaHQ/XG5cbkJ1dCB0aGVuIEkgcmVhbGl6ZSBpdCdzIG1vcmUgc3VidGxlLiBJZiB0aGUgcGFja2V0IGlzIGZyb20gdGhlIG5ldHdvcmssIHRoZSBgc2tiYCBpcyBhbGxvY2F0ZWQgYnkgdGhlIG5ldHdvcmsgZHJpdmVyLCBwcm9iYWJseSB3aXRoIGVub3VnaCBzcGFjZSBmb3IgYW4gTVRVIG9yIGEgcGFnZS4gVGhlIGRyaXZlciBmaWxscyB0aGUgYnVmZmVyIHdpdGggdGhlIHJlY2VpdmVkIGRhdGEgYW5kIHNldHMgYHNrYi1cdTAwM2VsZW5gIHRvIHRoZSBhY3R1YWwgcGFja2V0IHNpemUuIFNvLCBpZiB0aGUgcGFja2V0IGlzLCBzYXksIDIwIGJ5dGVzLCB0aGUgYnVmZmVyIG1pZ2h0IGJlIDE1MDAgYnl0ZXMgbG9uZywgYnV0IG9ubHkgdGhlIGZpcnN0IDIwIGFyZSBpbml0aWFsaXplZC4gVGhlIGJ5dGVzIGZyb20gMjAgdG8gMTUwMCB3aWxsIGNvbnRhaW4gZ2FyYmFnZSBvciBvbGQgZGF0YS5cblxuTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkPyBSZWd1bGFyIEtBU0FOIHdpbGwgbm90IGRldGVjdCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgYmVjYXVzZSB0aGUgcmVhZCBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtBU0FOIG9ubHkgY2hlY2tzIHRoYXQgdGhlIGFjY2VzcyBpcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IGttYWxsb2Mva2ZyZWUvZXRjLiBIb3dldmVyLCBLTVNBTiwgd2hpY2ggdHJhY2tzIGluaXRpYWxpemF0aW9uIHN0YXR1cywgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyB0eXBlIG9mIGJ1Zy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgaG9va3MgaW50byBza2IgdG8gbWFyayB0aGUgYnl0ZXMgcGFzdCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZC5cblxuVGhlbiB0aGUga2V5IHRoaW5nLCB0aGlzIHNpdHVhdGlvbiBpcyBleGFjdGx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gY2F0Y2g6IHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBuZXR3b3JrIHByb3RvY29sIHBhcnNpbmchIFRoZSBwYXRjaCBtb2RpZmllcyBib3VuZHMgY2hlY2tzLiBBbmQgdGhpcyBwYXRjaCBmYWxscyB1bmRlciB0aGUgY2F0ZWdvcnkgb2YgcG90ZW50aWFsIEtNU0FOIHRyaWdnZXJzOyBpdCdzIHJlbGF0ZWQgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHByZXZlbnQgcmVhZGluZyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGFuIHNrYi4gS01TQU4gaXMgbmVlZGVkLCBldmVuIGlmIHRoZSBwYXRjaCAqZml4ZXMqIHRoZSBidWcsIHdlIHN0aWxsIHdhbnQgdG8gcnVuIEtNU0FOIHRvIHZlcmlmeSB0aGUgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgcGF0aHMgYWxsb3cgdW5pbml0aWFsaXplZCByZWFkcyEgU28sIHllcywgd2Ugc2hvdWxkIGRlZmluaXRlbHkgdXNlIEtNU0FOIGhlcmUuXG5cbkxldCdzIHZlcmlmeSB0aGlzLCBJIGtub3cgdGhhdCBpZiBhbiBza2IgYnVmZmVyIGlzIGFsbG9jYXRlZCB3aXRoIGttYWxsb2MoMjU2KSBhbmQgdGhlIHBhY2tldCBpcyBvbmx5IDIwIGJ5dGVzLCBLQVNBTiB3b24ndCBjb21wbGFpbiBiZWNhdXNlIGFjY2Vzc2luZyBtZW1vcnkgdXAgdG8gMjU2IGJ5dGVzIGlzIGxlZ2FsLCBldmVuIGlmIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiB3b3VsZCByYWlzZSBhbiBlcnJvciBiZWNhdXNlIGl0IGtub3dzIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiBpcyBkZWZpbml0ZWx5IHRoZSB0b29sIGZvciB0aGlzIGtpbmQgb2YgYnVnLlxuXG5JIHNob3VsZCBhbHNvIGNvbnNpZGVyIGZyYWdtZW50YXRpb24uIElmIGEgcGFja2V0IGlzIGZyYWdtZW50ZWQsIHRoZSBgc2tiLVx1MDAzZWRhdGFgIG1pZ2h0IG9ubHkgY29udGFpbiBwYXJ0IG9mIHRoZSBkYXRhLCB3aXRoIHRoZSByZXN0IGluIGBza2Jfc2hpbmZvKHNrYiktXHUwMDNlZnJhZ3NgLiBSZWFkaW5nIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAgd291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgdGFpbHJvb20uIEdvb2QgdGhpbmcgdGhlIHBhdGNoIGluY2x1ZGVzIGBza2JfbGluZWFyaXplKHNrYilgISBJZiBpdCBsaW5lYXJpemVzLCBpdCBjb3BpZXMgZXZlcnl0aGluZyBhbmQgYXZvaWRzIGZyYWdtZW50YXRpb24gaXNzdWVzLiBCdXQgZG9lcyB0aGlzIGd1YXJhbnRlZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkPyBXaGF0IGlmIGBza2ItXHUwMDNlbGVuYCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlcXVpcmVkIHNpemU/XG5cbk5vdywgdGhlIGNoZWNrOiBgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSArIE5PREVfSURfTEVOYCBzZWVtcyB0byBiZSBjaGVja2luZyB0aGUgc2l6ZSBmaWVsZCAqaW4gdGhlIGhlYWRlciosIG5vdCBuZWNlc3NhcmlseSBgc2tiLVx1MDAzZWxlbmAuIEkgbmVlZCB0byBjb25maXJtIGhvdyBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgYXJlIGltcGxlbWVudGVkLiBJcyB0aGF0IGFjdHVhbGx5IGNoZWNraW5nIHRoZSBoZWFkZXIncyBkZWNsYXJlZCBzaXplIGFnYWluc3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXI/IElmIG5vdCwgdGhlIGNoZWNrIGlzIHVzZWxlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2NjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDIzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MTEuNDA1OTY0NDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTE2MDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19oZHJfc3pcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvbXNnLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvbXNnLmg9MjUyPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3VzZXIoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcXG4tLVxcbm5ldC90aXBjL21zZy5oLTI1Ni1cXG5uZXQvdGlwYy9tc2cuaDoyNTc6c3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMjU4LXtcXG4tLVxcbm5ldC90aXBjL21zZy5oPTI3Nz1zdGF0aWMgaW5saW5lIHUzMiBtc2dfZGF0YV9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMjc4LXtcXG5uZXQvdGlwYy9tc2cuaDoyNzk6XFx0cmV0dXJuIG1zZ19zaXplKG0pIC0gbXNnX2hkcl9zeihtKTtcXG5uZXQvdGlwYy9tc2cuaC0yODAtfVxcbi0tXFxubmV0L3RpcGMvbXNnLmg9MzY3PXN0YXRpYyBpbmxpbmUgdW5jaGFyICptc2dfZGF0YShzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMzY4LXtcXG5uZXQvdGlwYy9tc2cuaDozNjk6XFx0cmV0dXJuICgodW5jaGFyICopbSkgKyBtc2dfaGRyX3N6KG0pO1xcbm5ldC90aXBjL21zZy5oLTM3MC19XFxuLS1cXG5uZXQvdGlwYy9tc2cuaD02MTk9c3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSlcXG5uZXQvdGlwYy9tc2cuaC02MjAte1xcbm5ldC90aXBjL21zZy5oOjYyMTpcXHRyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSBTSE9SVF9IX1NJWkU7XFxubmV0L3RpcGMvbXNnLmgtNjIyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MTEuNDUxNDg3MDY0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMDQwODEyMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRlY29kaW5nIE1lc3NhZ2UgSGVhZGVyczogQSBRdWljayBBc3Nlc3NtZW50KipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEknbSBnb2luZyB0byBzdGFydCBieSBncmFiYmluZyB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIHVwZnJvbnQuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0d28ga2V5IHBpZWNlcyBvZiBkYXRhOiBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAuIFRoZXNlIGFyZSB0aGUgZm91bmRhdGlvbmFsIGVsZW1lbnRzLCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG15IGFuYWx5c2lzLiBgbXNnX2hkcl9zemAgdGVsbHMgbWUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpdHNlbGYg4oCTIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG1ldGFkYXRhIGFuZCBjb250cm9sIGluZm9ybWF0aW9uIHBhY2tlZCB3aXRoaW4uIFRoZW4gdGhlcmUncyBgbXNnX3NpemVgLCB0aGUgb3ZlcmFsbCBtZXNzYWdlIHNpemUuIEdldHRpbmcgdGhlc2UgdHdvIGltbWVkaWF0ZWx5IGhlbHBzIGJ1aWxkIGEgbWVudGFsIG1vZGVsIG9mIHRoZSBzdHJ1Y3R1cmUuIEkgY2FuIGRlZHVjZSBob3cgbXVjaCBkYXRhIGlzIGhlYWRlciB2cyBwYXlsb2FkIGFuZCB0aGF0IHVuZGVyc3RhbmRpbmcgaXMgZXNzZW50aWFsIGJlZm9yZSBJIGV2ZW4gZ2V0IGludG8gZGV0YWlscy4gSSdtIGJ1aWxkaW5nIGEgZnJhbWUgb2YgcmVmZXJlbmNlIGZvciB0aGUgc3Vic2VxdWVudCBwYXJzaW5nIGFuZCBpbnRlcnByZXRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTM3NSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjE0Ljc1NTU3MTAwM1oiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4OTU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGlwYy9tc2cuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNTA6XFx0fVxcbiAyNTE6XFx0XFxuIDI1MjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF91c2VyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuIDI1MzpcXHR7XFxuIDI1NDpcXHRcXHRtc2dfc2V0X2JpdHMobSwgMCwgMjUsIDB4Ziwgbik7XFxuIDI1NTpcXHR9XFxuIDI1NjpcXHRcXG4gMjU3OlxcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptKVxcbiAyNTg6XFx0e1xcbiAyNTk6XFx0XFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIFxcdTAwM2NcXHUwMDNjIDI7XFxuIDI2MDpcXHR9XFxuIDI2MTpcXHRcXG4gMjYyOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxcbiAyNjM6XFx0e1xcbiAyNjQ6XFx0XFx0bXNnX3NldF9iaXRzKG0sIDAsIDIxLCAweGYsIG5cXHUwMDNlXFx1MDAzZTIpO1xcbiAyNjU6XFx0fVxcbiAyNjY6XFx0XFxuIDI2NzpcXHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuIDI2ODpcXHR7XFxuIDI2OTpcXHRcXHRyZXR1cm4gbXNnX2JpdHMobSwgMCwgMCwgMHgxZmZmZik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjE0Ljc1NTY2MTg5M1oiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDY2MTQ3NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzpcblxuKipBbmFseXppbmcgUG90ZW50aWFsIFBhY2tldCBWdWxuZXJhYmlsaXR5KipcblxuUmlnaHQsIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkga2V5aW5nIGluIG9uIHRoZXNlIHZhcmlhYmxlcyDigJMgYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgLiBUaGV5J3JlIGJlaW5nIHB1bGxlZCByaWdodCBmcm9tIHRoZSBwYWNrZXQgaXRzZWxmLCBzcGVjaWZpY2FsbHkgZnJvbSB3b3JkIDAuIENsYXNzaWMgY2FzZSBvZiB0cnVzdGluZyB0aGUgZGF0YSwgaHVoPyBNeSBndXQgcmVhY3Rpb24gaXMgYWx3YXlzIHRvIHRoaW5rIGFib3V0IHBvdGVudGlhbCBleHBsb2l0cy5cblxuQW5kICpib29tKiwgdGhlcmUgaXQgaXMuIElmIHRoZSBwYWNrZXQncyBhY3R1YWxseSBzbWFsbGVyIHRoYW4gZm91ciBieXRlcywgcmVhZGluZyB0aGF0IGZpcnN0IHdvcmQgaXMgZ29pbmcgdG8gYmUgYSBkaXNhc3Rlci4gRWl0aGVyIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgb3IsIGV2ZW4gd29yc2UsIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQncyBhIGh1Z2UgcmVkIGZsYWcg4oCTIGEgcGVyZmVjdCB2ZWN0b3IgZm9yIGluamVjdGlvbiBpZiB3ZSdyZSBub3QgY2FyZWZ1bC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHdoZXJlIGlzIGB0aXBjX2Rpc2NfcmN2YCBiZWluZyBjYWxsZWQgZnJvbT8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSB0aGF0IGZ1bmN0aW9uIGFuZCBzZWUgd2hlcmUgdGhpcyBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZGF0YSBpcyBvcmlnaW5hdGluZy4gSXMgaXQgY29taW5nIGZyb20gYSB0cnVzdGVkIHNvdXJjZSwgb3IgaXMgaXQgZXhwb3NlZCB0byB1bnRydXN0ZWQgaW5wdXQ/IEkgbmVlZCB0byBnZXQgdG8gdGhlIHJvb3Qgb2YgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBleHRlbnQgb2YgdGhlIHBvc3NpYmxlIHZ1bG5lcmFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5MzcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjIwLjIyMTgxMTk0NloiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY0Mjg5MTg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRpcGNfZGlzY19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXFxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE4OS0gKiBAbmV0OiBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2VcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTkzOnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmg6NDg6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmJ1ZixcXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVxcdFxcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpO1xcbi0tXFxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL25vZGUuYy0yMTI1LVxcdFxcdGlmICh1bmxpa2VseSh1c3IgPT0gTElOS19DT05GSUcpKVxcbm5ldC90aXBjL25vZGUuYzoyMTI2OlxcdFxcdFxcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcXG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cXHRcXHRlbHNlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjIwLjQ4NjEwNjg0MloiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODUwMzI0MzczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYmFzZWQgb24geW91ciBwcm9tcHQ6XG5cbioqRGl2aW5nIGludG8gVElQQyBSZWNlaXZlciBMb2dpYyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gZ29pbmcgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBgdGlwY19yY3ZgIGZ1bmN0aW9uLCBmb3VuZCBpbiBgbmV0L3RpcGMvbm9kZS5jYC4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIHBhY2tldCByZWNlcHRpb24gbG9naWMgZm9yIFRJUEMgcmVzaWRlcywgcmlnaHQ/IEkgd2FudCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lc3NhZ2VzIGFjdHVhbGx5IGhpdCB0aGUgc3lzdGVtLCBob3cgdGhleSdyZSByb3V0ZWQgd2l0aGluIHRoZSBub2RlLCBhbmQgd2hhdCB0aGUgZmxvdyBjb250cm9sIGxvb2tzIGxpa2UgYXQgdGhhdCBsZXZlbC4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGluIHRoYXQgcm91dGluZS4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb2J2aW91cyBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLCBvciBtYXliZSBzb21ldGhpbmcgSSBtaXNzZWQgbGFzdCB0aW1lIEkgbG9va2VkLiBJIGV4cGVjdCB0aGUgdXN1YWwgc3VzcGVjdHMg4oCTIHBhY2tldCBoZWFkZXIgcGFyc2luZywgYWRkcmVzcyBsb29rdXAsIGJ1ZmZlciBtYW5hZ2VtZW50LCBhbmQgdGhlIGZvcndhcmRpbmcgcHJvY2VzcyDigJMgYnV0IEknbSBsb29raW5nIGZvciB0aGUgZmluZXIgZGV0YWlscyB0aGlzIHRpbWUuIFBlcmhhcHMgSSdsbCBmb2N1cyBvbiBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGVkIHBhY2tldHMgYW5kIGNvbm5lY3Rpb24gc3RhdGUsIGFuZCB3aGV0aGVyIGl0J3MgdGhlIHJpZ2h0IHBsYWNlIGZvciBpbnNwZWN0aW5nIHJlY2VudCBpc3N1ZXMgSSd2ZSByZWFkIGFib3V0LCBpbiB0aGUgbWFpbGluZyBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcwMywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjI0LjMzNjQzNDA0NVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbm9kZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwODMsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwODM6XFx0dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4yMDg0OlxcdHtcXG4yMDg1OlxcdFxcdHN0cnVjdCBza19idWZmX2hlYWQgeG1pdHE7XFxuMjA4NjpcXHRcXHRzdHJ1Y3QgdGlwY19saW5rX2VudHJ5ICpsZTtcXG4yMDg3OlxcdFxcdHN0cnVjdCB0aXBjX21zZyAqaGRyO1xcbjIwODg6XFx0XFx0c3RydWN0IHRpcGNfbm9kZSAqbjtcXG4yMDg5OlxcdFxcdGludCBiZWFyZXJfaWQgPSBiLVxcdTAwM2VpZGVudGl0eTtcXG4yMDkwOlxcdFxcdHUzMiBzZWxmID0gdGlwY19vd25fYWRkcihuZXQpO1xcbjIwOTE6XFx0XFx0aW50IHVzciwgcmMgPSAwO1xcbjIwOTI6XFx0XFx0dTE2IGJjX2FjaztcXG4yMDkzOlxcdCNpZmRlZiBDT05GSUdfVElQQ19DUllQVE9cXG4yMDk0OlxcdFxcdHN0cnVjdCB0aXBjX2VoZHIgKmVoZHI7XFxuMjA5NTpcXHRcXG4yMDk2OlxcdFxcdC8qIENoZWNrIGlmIG1lc3NhZ2UgbXVzdCBiZSBkZWNyeXB0ZWQgZmlyc3QgKi9cXG4yMDk3OlxcdFxcdGlmIChUSVBDX1NLQl9DQihza2IpLVxcdTAwM2VkZWNyeXB0ZWQgfHwgIXRpcGNfZWhkcl92YWxpZGF0ZShza2IpKVxcbjIwOTg6XFx0XFx0XFx0Z290byByY3Y7XFxuMjA5OTpcXHRcXG4yMTAwOlxcdFxcdGVoZHIgPSAoc3RydWN0IHRpcGNfZWhkciAqKXNrYi1cXHUwMDNlZGF0YTtcXG4yMTAxOlxcdFxcdGlmIChsaWtlbHkoZWhkci1cXHUwMDNldXNlciAhPSBMSU5LX0NPTkZJRykpIHtcXG4yMTAyOlxcdFxcdFxcdG4gPSB0aXBjX25vZGVfZmluZChuZXQsIG50b2hsKGVoZHItXFx1MDAzZWFkZHIpKTtcXG4yMTAzOlxcdFxcdFxcdGlmICh1bmxpa2VseSghbikpXFxuMjEwNDpcXHRcXHRcXHRcXHRnb3RvIGRpc2NhcmQ7XFxuMjEwNTpcXHRcXHR9IGVsc2Uge1xcbjIxMDY6XFx0XFx0XFx0biA9IHRpcGNfbm9kZV9maW5kX2J5X2lkKG5ldCwgZWhkci1cXHUwMDNlaWQpO1xcbjIxMDc6XFx0XFx0fVxcbjIxMDg6XFx0XFx0c2tiX2RzdF9mb3JjZShza2IpO1xcbjIxMDk6XFx0XFx0dGlwY19jcnlwdG9fcmN2KG5ldCwgKG4pID8gbi1cXHUwMDNlY3J5cHRvX3J4IDogTlVMTCwgXFx1MDAyNnNrYiwgYik7XFxuMjExMDpcXHRcXHRpZiAoIXNrYilcXG4yMTExOlxcdFxcdFxcdHJldHVybjtcXG4yMTEyOlxcdFxcbjIxMTM6XFx0cmN2OlxcbjIxMTQ6XFx0I2VuZGlmXFxuMjExNTpcXHRcXHQvKiBFbnN1cmUgbWVzc2FnZSBpcyB3ZWxsLWZvcm1lZCBiZWZvcmUgdG91Y2hpbmcgdGhlIGhlYWRlciAqL1xcbjIxMTY6XFx0XFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcXHUwMDI2c2tiKSkpXFxuMjExNzpcXHRcXHRcXHRnb3RvIGRpc2NhcmQ7XFxuMjExODpcXHRcXHRfX3NrYl9xdWV1ZV9oZWFkX2luaXQoXFx1MDAyNnhtaXRxKTtcXG4yMTE5OlxcdFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4yMTIwOlxcdFxcdHVzciA9IG1zZ191c2VyKGhkcik7XFxuMjEyMTpcXHRcXHRiY19hY2sgPSBtc2dfYmNhc3RfYWNrKGhkcik7XFxuMjEyMjpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjQuMzM2NTc0OTE1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNTY3NzAyOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIFRpbWluZyBvZiBUSVBDIE1lc3NhZ2UgVmFsaWRhdGlvbioqXG5cblJpZ2h0LCBzbyB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhhdCBgdGlwY19tc2dfdmFsaWRhdGUoXHUwMDI2c2tiKWAgaXMgaW52b2tlZCAqYmVmb3JlKiBgdGlwY19kaXNjX3JjdmAuIFRoaXMgb3JkZXJpbmcgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMgZGVzaWduZWQgdGhpcyB3YXkuIExldCdzIGRlbHZlIGludG8gd2hhdCBleGFjdGx5IGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgZG9pbmcuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBsb29rIGludG8gcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIG1lc3NhZ2UgdmFsaWRhdGlvbiwgYW5kIGZ1cnRoZXIgbWVzc2FnZSBwcm9jZXNzaW5nIGluIHRoZSBkaXNjIHJlY2VpdmUgZnVuY3Rpb24uIEl04oCZcyBsaWtlbHkgZW5zdXJpbmcgc29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBpbmNvbWluZyBTS0IuIFRoaW5ncyBsaWtlIGhlYWRlciBpbnRlZ3JpdHksIG1lc3NhZ2UgbGVuZ3RoLCBtYXliZSBldmVuIHNvbWUgcHJlbGltaW5hcnkgYWRkcmVzcyB2ZXJpZmljYXRpb24gYmVmb3JlIHdlIGdvIGFueSBmdXJ0aGVyLiBJdCdzIGEgZnVuZGFtZW50YWwgZGVmZW5zaXZlIHByb2dyYW1taW5nIHByYWN0aWNlLCBhIGZpcnN0IGxpbmUgb2YgZGVmZW5zZSBhZ2FpbnN0IGNvcnJ1cHRlZCBvciBtYWxpY2lvdXMgcGFja2V0cy4gSSdsbCBmb2N1cyBvbiB3aGF0IGFzcGVjdHMgb2YgdGhlIG1lc3NhZ2UgYXJlIHZhbGlkYXRlZCBoZXJlLiBJJ2xsIG5lZWQgdG8ga25vdyB3aGV0aGVyIGFueSBzdGF0ZSBpcyBtb2RpZmllZCBhdCB0aGUgdmFsaWRhdGlvbiBzdGFnZSwgb3IgaWYgaXQgaXMgcHVyZWx5IGEgY2hlY2suIEkgaG9wZSBpdCdzIG5vdCByZXNvdXJjZSBpbnRlbnNpdmUsIHdlIHdvdWxkbid0IHdhbnQgdG8gc2xvdyBkb3duIG5vcm1hbCBjb21tdW5pY2F0aW9uLCBhbmQgaXQgbmVlZHMgdG8gYmUgZWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTY1NywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjguNDkzMzQ3NDc4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODE5NTUyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0aXBjX21zZ192YWxpZGF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvY3J5cHRvLmM9MTg4OD1zdGF0aWMgdm9pZCB0aXBjX2NyeXB0b19yY3ZfY29tcGxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19hZWFkICphZWFkLFxcbi0tXFxubmV0L3RpcGMvY3J5cHRvLmMtMTk2Ni1cXHQvKiBWYWxpZGF0ZSBUSVBDdjIgbWVzc2FnZSAqL1xcbm5ldC90aXBjL2NyeXB0by5jOjE5Njc6XFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShza2IpKSkge1xcbm5ldC90aXBjL2NyeXB0by5jLTE5NjgtXFx0XFx0cHJfZXJyX3JhdGVsaW1pdGVkKFxcXCJQYWNrZXQgZHJvcHBlZCBhZnRlciBkZWNyeXB0aW9uIVxcXFxuXFxcIik7XFxuLS1cXG5uZXQvdGlwYy9jcnlwdG8uYy0xOTc0LVxcbm5ldC90aXBjL2NyeXB0by5jOjE5NzU6XFx0LyogUmUtZmV0Y2ggc2tiIGNiIGFzIHNrYiBtaWdodCBiZSBjaGFuZ2VkIGluIHRpcGNfbXNnX3ZhbGlkYXRlICovXFxubmV0L3RpcGMvY3J5cHRvLmMtMTk3Ni1cXHRza2JfY2IgPSBUSVBDX1NLQl9DQigqc2tiKTtcXG4tLVxcbm5ldC90aXBjL21zZy5jPTEyND1pbnQgdGlwY19idWZfYXBwZW5kKHN0cnVjdCBza19idWZmICoqaGVhZGJ1Ziwgc3RydWN0IHNrX2J1ZmYgKipidWYpXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy0xNzktXFx0XFx0VElQQ19TS0JfQ0IoaGVhZCktXFx1MDAzZXZhbGlkYXRlZCA9IDA7XFxubmV0L3RpcGMvbXNnLmM6MTgwOlxcdFxcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXFx1MDAyNmhlYWQpKSlcXG5uZXQvdGlwYy9tc2cuYy0xODEtXFx0XFx0XFx0Z290byBlcnI7XFxuLS1cXG5uZXQvdGlwYy9tc2cuYz0yMDU9aW50IHRpcGNfbXNnX2FwcGVuZChzdHJ1Y3QgdGlwY19tc2cgKl9oZHIsIHN0cnVjdCBtc2doZHIgKm0sIGludCBkbGVuLFxcbi0tXFxubmV0L3RpcGMvbXNnLmMtMjQ0LVxcbm5ldC90aXBjL21zZy5jOjI0NTovKiB0aXBjX21zZ192YWxpZGF0ZSAtIHZhbGlkYXRlIGJhc2ljIGZvcm1hdCBvZiByZWNlaXZlZCBtZXNzYWdlXFxubmV0L3RpcGMvbXNnLmMtMjQ2LSAqXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy0yNTUtICovXFxubmV0L3RpcGMvbXNnLmM6MjU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKVxcbm5ldC90aXBjL21zZy5jLTI1Ny17XFxuLS1cXG5uZXQvdGlwYy9tc2cuYz01ODE9Ym9vbCB0aXBjX21zZ19leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICoqaXNrYiwgaW50ICpwb3MpXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy02MDQtXFx0c2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoKmlza2IsIGloZHIsIGltc3opO1xcbm5ldC90aXBjL21zZy5jOjYwNTpcXHRpZiAodW5saWtlbHkoIXRpcGNfbXNnX3ZhbGlkYXRlKGlza2IpKSlcXG5uZXQvdGlwYy9tc2cuYy02MDYtXFx0XFx0Z290byBub25lO1xcbi0tXFxubmV0L3RpcGMvbXNnLmg9MTE1NT1zdHJ1Y3Qgc2tfYnVmZiAqdGlwY19idWZfYWNxdWlyZSh1MzIgc2l6ZSwgZ2ZwX3QgZ2ZwKTtcXG5uZXQvdGlwYy9tc2cuaDoxMTU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKTtcXG5uZXQvdGlwYy9tc2cuaC0xMTU3LWJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcXG4tLVxcbm5ldC90aXBjL25vZGUuYz0yMDgzPXZvaWQgdGlwY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXFxuLS1cXG5uZXQvdGlwYy9ub2RlLmMtMjExNS1cXHQvKiBFbnN1cmUgbWVzc2FnZSBpcyB3ZWxsLWZvcm1lZCBiZWZvcmUgdG91Y2hpbmcgdGhlIGhlYWRlciAqL1xcbm5ldC90aXBjL25vZGUuYzoyMTE2OlxcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXFx1MDAyNnNrYikpKVxcbm5ldC90aXBjL25vZGUuYy0yMTE3LVxcdFxcdGdvdG8gZGlzY2FyZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjguNTQxNTU0MzgyWiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3NTg0NDE3Mjk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCB0aGlua2luZyBhYm91dCBgdGlwY19tc2dfdmFsaWRhdGVgIGluIGBuZXQvdGlwYy9tc2cuY2A6XG5cbioqRGl2aW5nIGludG8gYHRpcGNfbXNnX3ZhbGlkYXRlYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoaXMgYHRpcGNfbXNnX3ZhbGlkYXRlYCBmdW5jdGlvbi4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkga25vdyB0aGlzIGlzIGdvaW5nIHRvIGJlIHRoZSBnYXRla2VlcGVyIGZvciBUSVBDIG1lc3NhZ2VzLCBtYWtpbmcgc3VyZSB0aGV5J3JlIGtvc2hlciBiZWZvcmUgdGhlIGtlcm5lbCBldmVuIHRoaW5rcyBhYm91dCBwcm9jZXNzaW5nIHRoZW0uIEknbSBleHBlY3RpbmcgdG8gc2VlIGEgc2VyaWVzIG9mIGNoZWNrcywgcHJvYmFibHkgc3RhcnRpbmcgd2l0aCBzb21lIGJhc2ljIHN0cnVjdHVyYWwgaW50ZWdyaXR5OiBtZXNzYWdlIGxlbmd0aCwgaGVhZGVyIGZpZWxkcywgYW5kIG1heWJlIHNvbWUgcXVpY2sgY2hlY2tzdW0gdmVyaWZpY2F0aW9ucyB0byB3ZWVkIG91dCBvYnZpb3VzIGNvcnJ1cHRpb24uXG5cbkknbSBjdXJpb3VzIGFib3V0IHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGNyaXRlcmlhLiBJcyBpdCBqdXN0IGNoZWNraW5nIGxlbmd0aHMgYW5kIG9mZnNldHMsIG9yIGRvZXMgaXQgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBtZXNzYWdlIHR5cGUgdmFsaWRhdGlvbiwgY2hlY2tpbmcgaWYgZmllbGRzIGFyZSB3aXRoaW4gZXhwZWN0ZWQgcmFuZ2VzLCBhbmQgbWF5YmUgZXZlbiBjcm9zcy1yZWZlcmVuY2luZyBhZ2FpbnN0IGludGVybmFsIHN0YXRlIHRhYmxlcyBpZiBuZWNlc3Nhcnk/IEknZCBpbWFnaW5lIHRoZXJlJ3MgYSBkZWxpY2F0ZSBiYWxhbmNlIGhlcmUuIFRvbyBzdHJpbmdlbnQsIGFuZCB5b3UgcmlzayByZWplY3RpbmcgbGVnaXRpbWF0ZSBtZXNzYWdlcy4gVG9vIGxheCwgYW5kIHlvdSBvcGVuIHRoZSBkb29yIHRvIGFsbCBzb3J0cyBvZiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgb3IgY3Jhc2hlcy5cblxuSSdtIGFsc28gd29uZGVyaW5nIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVzLiBUSVBDIHN1cHBvcnRzIHZhcmlvdXMga2luZHMgb2YgbWVzc2FnZXMsIGZyb20gc2ltcGxlIGNvbm5lY3Rpb24gcmVxdWVzdHMgdG8gZGF0YSBwYWNrZXRzLiBJJ2QgYW50aWNpcGF0ZSB0aGUgdmFsaWRhdGlvbiBsb2dpYyB3aWxsIGJyYW5jaCBoZWF2aWx5IGRlcGVuZGluZyBvbiB0aGUgbWVzc2FnZSB0eXBlLCB3aXRoIG1vcmUgY29tcGxleCBjaGVja3MgZm9yIHRoaW5ncyBsaWtlIHNlcXVlbmNlIG51bWJlcnMgb3IgYWNrbm93bGVkZ21lbnQgZmllbGRzIGluIHJlbGlhYmxlIGNvbW11bmljYXRpb24gc2NlbmFyaW9zLlxuXG5JJ2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZCB0aGUgZXJyb3IgcmVwb3J0aW5nLiBEb2VzIGl0IGp1c3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIG9yIGRvZXMgaXQgbG9nIHRoZSB2YWxpZGF0aW9uIGZhaWx1cmVzPyBIb3BlZnVsbHksIHRoZXJlIGFyZSBkZXRhaWxlZCBlcnJvciBjb2RlcyB0aGF0IGNhbiBoZWxwIHBpbnBvaW50IHRoZSBleGFjdCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uIEl0IHdvdWxkIGFsc28gYmUgZ29vZCB0byBzZWUgaG93IGl0IG1pZ2h0IHJlYWN0IHRvIHRyYW5zaWVudCBlcnJvcnMsIG1heWJlIHJldHJ5aW5nIGlmIGEgY2hlY2tzdW0gZmFpbHMgYSBjb3VwbGUgb2YgdGltZXMgYmVmb3JlIGRlY2xhcmluZyBkZWZlYXQuXG5cbkZpbmFsbHksIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiB0byBiZSBwZXJmb3JtYW5jZS1jb25zY2lvdXMuIFRoaXMgdmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBrZXJuZWwgZGF0YSBwYXRoIGFuZCB3aWxsIGJlIHBvdGVudGlhbGx5IGNhbGxlZCBtaWxsaW9ucyBvZiB0aW1lcyBwZXIgc2Vjb25kLiBTbywgZWZmaWNpZW50IGFsZ29yaXRobXMgYW5kIG1pbmltYWwgb3ZlcmhlYWQgYXJlIGNydWNpYWwuIEknbGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBhbmQgdGhpbmtpbmcgYWJvdXQgaG93IEkgY291bGQgb3B0aW1pemUgdGhlbSBpZiBuZWNlc3NhcnkuIFRpbWUgdG8gZGlnIGluIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg2MSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjQ2LjEyNTk3NTg2OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDE5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbXNnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjQ1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQ1OlxcdC8qIHRpcGNfbXNnX3ZhbGlkYXRlIC0gdmFsaWRhdGUgYmFzaWMgZm9ybWF0IG9mIHJlY2VpdmVkIG1lc3NhZ2VcXG4gMjQ2OlxcdCAqXFxuIDI0NzpcXHQgKiBUaGlzIHJvdXRpbmUgZW5zdXJlcyBhIFRJUEMgbWVzc2FnZSBoYXMgYW4gYWNjZXB0YWJsZSBoZWFkZXIsIGFuZCBhdCBsZWFzdFxcbiAyNDg6XFx0ICogYXMgbXVjaCBkYXRhIGFzIHRoZSBoZWFkZXIgaW5kaWNhdGVzIGl0IHNob3VsZC4gIFRoZSByb3V0aW5lIGFsc28gZW5zdXJlc1xcbiAyNDk6XFx0ICogdGhhdCB0aGUgZW50aXJlIG1lc3NhZ2UgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgbWFpbiBmcmFnbWVudCBvZiB0aGUgbWVzc2FnZVxcbiAyNTA6XFx0ICogYnVmZmVyLCB0byBzaW1wbGlmeSBmdXR1cmUgYWNjZXNzIHRvIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcy5cXG4gMjUxOlxcdCAqXFxuIDI1MjpcXHQgKiBOb3RlOiBIYXZpbmcgZXh0cmEgaW5mbyBwcmVzZW50IGluIHRoZSBtZXNzYWdlIGhlYWRlciBvciBkYXRhIGFyZWFzIGlzIE9LLlxcbiAyNTM6XFx0ICogVElQQyB3aWxsIGlnbm9yZSB0aGUgZXhjZXNzLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIG9wdGlvbmFsIGluZm9cXG4gMjU0OlxcdCAqIGludHJvZHVjZWQgYnkgYSBsYXRlciByZWxlYXNlIG9mIHRoZSBwcm90b2NvbC5cXG4gMjU1OlxcdCAqL1xcbiAyNTY6XFx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpXFxuIDI1NzpcXHR7XFxuIDI1ODpcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKl9za2I7XFxuIDI1OTpcXHRcXHRzdHJ1Y3QgdGlwY19tc2cgKmhkcjtcXG4gMjYwOlxcdFxcdGludCBtc3osIGhzejtcXG4gMjYxOlxcdFxcbiAyNjI6XFx0XFx0LyogRW5zdXJlIHRoYXQgZmxvdyBjb250cm9sIHJhdGlvIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgKi9cXG4gMjYzOlxcdFxcdGlmICh1bmxpa2VseShza2ItXFx1MDAzZXRydWVzaXplIC8gYnVmX3JvdW5kdXBfbGVuKHNrYikgXFx1MDAzZT0gNCkpIHtcXG4gMjY0OlxcdFxcdFxcdHNrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIEJVRl9IRUFEUk9PTSwgMCwgR0ZQX0FUT01JQyk7XFxuIDI2NTpcXHRcXHRcXHRpZiAoIXNrYilcXG4gMjY2OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMjY3OlxcdFxcdFxcdGtmcmVlX3NrYigqX3NrYik7XFxuIDI2ODpcXHRcXHRcXHQqX3NrYiA9IHNrYjtcXG4gMjY5OlxcdFxcdH1cXG4gMjcwOlxcdFxcbiAyNzE6XFx0XFx0aWYgKHVubGlrZWx5KFRJUENfU0tCX0NCKHNrYiktXFx1MDAzZXZhbGlkYXRlZCkpXFxuIDI3MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMjczOlxcdFxcbiAyNzQ6XFx0XFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgTUlOX0hfU0laRSkpKVxcbiAyNzU6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyNzY6XFx0XFxuIDI3NzpcXHRcXHRoc3ogPSBtc2dfaGRyX3N6KGJ1Zl9tc2coc2tiKSk7XFxuIDI3ODpcXHRcXHRpZiAodW5saWtlbHkoaHN6IFxcdTAwM2MgTUlOX0hfU0laRSkgfHwgKGhzeiBcXHUwMDNlIE1BWF9IX1NJWkUpKVxcbiAyNzk6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyODA6XFx0XFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaHN6KSkpXFxuIDI4MTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI4MjpcXHRcXG4gMjgzOlxcdFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4gMjg0OlxcdFxcdGlmICh1bmxpa2VseShtc2dfdmVyc2lvbihoZHIpICE9IFRJUENfVkVSU0lPTikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjQ2LjEyNjA3OTI4OVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MjI2Njk0MDc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVElQQyBNZXNzYWdlIFZhbGlkYXRpb24gYW5kIERpc2NvdmVyeSBSZWNlaXZlIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCBgdGlwY19tc2dfdmFsaWRhdGVgIHNlZW1zIHRvIGJlIGRvaW5nIHNvbWUgYmFzaWMgY2hlY2tzIHVzaW5nIGBwc2tiX21heV9wdWxsYC4gU3BlY2lmaWNhbGx5LCBpdCBlbnN1cmVzIHRoZSBgc2tiYCAoc29ja2V0IGJ1ZmZlcikgaGFzIGF0IGxlYXN0IGBNSU5fSF9TSVpFYCAod2hpY2ggaXMgMjQgYnl0ZXMpIGF2YWlsYWJsZS4gVGhlbiwgaXQgZGV0ZXJtaW5lcyB0aGUgaGVhZGVyIHNpemUgKGBoc3pgKSB1c2luZyBgbXNnX2hkcl9zemAgYW5kIHJlLWNoZWNrcyB0aGUgYHNrYmAgdXNpbmcgYHBza2JfbWF5X3B1bGwoc2tiLCBoc3opYC4gU28gdGhlIGZ1bmN0aW9uIGlzIHNldCB1cCBzbyBgc2tiLVx1MDAzZWxlbmAgc2hvdWxkIGJlIGF0IGxlYXN0IGBoc3pgLCBhbmQgdGhvc2UgYGhzemAgYnl0ZXMgYXJlIGRlZmluaXRlbHkgbGluZWFyIHdpdGhpbiB0aGUgYHNrYmAuXG5cbldhaXQgYSBtaW51dGUsIGBNSU5fSF9TSVpFYCBpcyAqb25seSogMjQgYnl0ZXMuIFRoYXQncyBhIGtleSBvYnNlcnZhdGlvbi5cblxuTm93LCB0aGUgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBjb21lcyBpbnRvIHBsYXkuIEl0IGhhcyB0aGlzIGNoZWNrOlxuYGBgY1xuXHRpZiAobXNnX2hkcl9zeihoZHIpIFx1MDAzYyBNQVhfSF9TSVpFIHx8XG5cdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcbmBgYFxuYW5kIGBNQVhfSF9TSVpFYCBpcyA2MCBieXRlcy4gU28sIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgKm9ubHkqIG1ha2luZyBzdXJlIGBoc3pgIGJ5dGVzIGFyZSBsaW5lYXIgYW5kIGF2YWlsYWJsZS4gQW5kIGlmIGBoc3pgIGlzLCBzYXksIDI0IGJ5dGVzLCB0aGUgdmFsaWRhdGlvbiAqc3VjY2VlZHMqLlxuXG5IZXJlJ3MgdGhlIHByb2JsZW06IGB0aXBjX2Rpc2NfcmN2YCBpcyB0aGVuIGNhbGxlZC4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgd2FzIHRyeWluZyB0byByZWFkIGBtc2dfcGVlcl9uZXRfaGFzaChoZHIpYCB3aGljaCBpcyBhdCBvZmZzZXQgNTIgKHdvcmQgMTMpLiBCdXQgcmVtZW1iZXIsIGBoc3pgIGNhbiBiZSBhcyBsb3cgYXMgMjQgYnl0ZXMhXG5cblNvLCB0aGUgb3JpZ2luYWwgY29kZSByZWFkcyBvZmZzZXQgNTIsIHdoaWNoIGlzICpiZXlvbmQqIGBoc3pgLiBJdCdzIGNsZWFybHkgYSByZWFkIG91dCBvZiBib3VuZHMuIFRoaXMgaXMgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkhIEJ1dCB0aGUgcXVlc3Rpb24gaXM6IGlzIGl0IGFsc28gYmV5b25kIHRoZSBgc2tiLVx1MDAzZWxlbmA/IFRoYXQgSSB3aWxsIG5lZWQgdG8gY2hlY2sgd2l0aCBmdXJ0aGVyIGFuYWx5c2lzIG9mIHRoZSBjb2RlLlxuXG5gdGlwY19tc2dfdmFsaWRhdGVgIGFsc28gY2hlY2tzOlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA1MiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjUzLjM1Mjc3NTg2N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbXNnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjg1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjg1OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMjg2OlxcdFxcbiAyODc6XFx0XFx0bXN6ID0gbXNnX3NpemUoaGRyKTtcXG4gMjg4OlxcdFxcdGlmICh1bmxpa2VseShtc3ogXFx1MDAzYyBoc3opKVxcbiAyODk6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyOTA6XFx0XFx0aWYgKHVubGlrZWx5KChtc3ogLSBoc3opIFxcdTAwM2UgVElQQ19NQVhfVVNFUl9NU0dfU0laRSkpXFxuIDI5MTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI5MjpcXHRcXHRpZiAodW5saWtlbHkoc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBtc3opKVxcbiAyOTM6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyOTQ6XFx0XFxuIDI5NTpcXHRcXHRUSVBDX1NLQl9DQihza2IpLVxcdTAwM2V2YWxpZGF0ZWQgPSAxO1xcbiAyOTY6XFx0XFx0cmV0dXJuIHRydWU7XFxuIDI5NzpcXHR9XFxuIDI5ODpcXHRcXG4gMjk5OlxcdC8qKlxcbiAzMDA6XFx0ICogdGlwY19tc2dfZnJhZ21lbnQgLSBidWlsZCBhIGZyYWdtZW50IHNrYiBsaXN0IGZvciBUSVBDIG1lc3NhZ2VcXG4gMzAxOlxcdCAqXFxuIDMwMjpcXHQgKiBAc2tiOiBUSVBDIG1lc3NhZ2Ugc2tiXFxuIDMwMzpcXHQgKiBAaGRyOiBpbnRlcm5hbCBtc2cgaGVhZGVyIHRvIGJlIHB1dCBvbiB0aGUgdG9wIG9mIHRoZSBmcmFnbWVudHNcXG4gMzA0OlxcdCAqIEBwa3RtYXg6IG1heCBzaXplIG9mIGEgZnJhZ21lbnQgaW5jbC4gdGhlIGhlYWRlclxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NTo1My4zNTI5MDE5NThaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTczMjQ5MTc0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyoqXG5cbk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgY2hlY2tpbmcgaWYgYHNrYi1cdTAwM2VsZW5gIGlzIGxlc3MgdGhhbiBgbXN6YC4gIFNvLCBpZiB0aGF0IGNoZWNrIHBhc3NlcywgYHNrYi1cdTAwM2VsZW5gIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYG1zemAuIE5vdywgaWYgYSBwYWNrZXQgY29tZXMgaW4gd2l0aCBhIGhlYWRlciBzaXplIChgaHN6YCkgb2YgMjQgYW5kIHRoZSBtaW5pbXVtIHNpemUgKGBtc3pgKSBpcyBhbHNvIDI0LCB0aGVuIGBza2ItXHUwMDNlbGVuYCBjYW4gYmUgZXhhY3RseSAyNC4gIFRoYXQgc2V0cyB0aGUgc3RhZ2UuLi5cblxuVGhlbiwgYHRpcGNfZGlzY19yY3ZgIHRyaWVzIHRvIHJlYWQgZGF0YSBhdCBhbiBvZmZzZXQgb2YgNTIuIEhvbGQgb24uLi4gaWYgYHNrYi1cdTAwM2VsZW5gIGlzICpvbmx5KiAyNCwgdHJ5aW5nIHRvIHJlYWQgYXQgb2Zmc2V0IDUyIGlzIGNsZWFybHkgb3V0LW9mLWJvdW5kcyEgIFdlJ3JlIHJlYWRpbmcgcGFzdCB3aGF0IHRoZSBuZXR3b3JrIGRyaXZlciBhY3R1YWxseSBpbml0aWFsaXplZCBpbiB0aGUgU0tCLiAgVGhpcyBtZWFucyB3ZSBhcmUgYXR0ZW1wdGluZyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBvciwgcG90ZW50aWFsbHksIG9sZCBwYWNrZXQgZGF0YSBzdGlsbCBpbiB0aGUgYnVmZmVyLlxuXG5UaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGF0IEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIHdvbid0IGNhdGNoIHRoaXMsIGFzIGxvbmcgYXMgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGxhcmdlciB0aGFuIDUyIGJ5dGVzICh3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlKS4gQSAyNTYtYnl0ZSBidWZmZXIgd291bGQgbm90IGJlIGNhdWdodCBieSBLQVNBTi4gIEhvd2V2ZXIsIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplcikgKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgaXQgZmxhZ3MgdGhlIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZC5cblxuV2FpdCwgaXMgdGhhdCByaWdodD8gRG9lcyBLTVNBTiBhY3R1YWxseSBtYXJrIHRob3NlIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZD8gWWVzLCB0aGF0J3MgcmlnaHQuIEtNU0FOIG9ubHkgdW5wb2lzb25zIHRoZSBkYXRhIGFjdHVhbGx5IGNvcGllZCBpbnRvIHRoZSBza2IsIGxlYXZpbmcgdGhlIHJlc3Qgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgcG9pc29uZWQuIFRoZXJlZm9yZSB0aGlzIGlzIGEgY2xhc3NpYyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHRoYXQgS0FTQU4gbWlzc2VzLCBidXQgS01TQU4gY2F0Y2hlcy5cblxuSG9sZCBvbiwgdGhlIHBhdGNoIEknbSBsb29raW5nIGF0IGFsc28gYWRkcyBgc2tiX2xpbmVhcml6ZShza2IpYC4gIFdoeT8gIEFoLCBJIHNlZS4gRXZlbiBpZiB0aGUgdG90YWwgbWVzc2FnZSBzaXplIChgbXNnX3NpemUoaGRyKWApIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgTUFYX0hfU0laRSArIE5PREVfSURfTEVOYCwgdGhlIGRhdGEgYWZ0ZXIgdGhlIGhlYWRlciBjb3VsZCBiZSBmcmFnbWVudGVkLiBgdGlwY19tc2dfdmFsaWRhdGVgIG9ubHkgZG9lcyBhIGBwc2tiX21heV9wdWxsKHNrYiwgaHN6KWAuIFNvIGlmIGBoc3pgIGlzIDYwLCBpdCAqcHVsbHMqIDYwIGJ5dGVzLiBCdXQgdGhlIGNvZGUgYWxzbyByZWFkcyBgcGVlcl9pZGAgYXQgYG1zZ19ub2RlX2lkKGhkcilgLiBXaGVyZSBpcyBgbXNnX25vZGVfaWQoaGRyKWAgbG9jYXRlZD8gSSBuZWVkIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgZGVlcGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTIzMCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjAzLjA4NTM5NjI0NFoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY3MjA3MjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXNnX25vZGVfaWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI0MC1cXHRpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClcXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjI0MTpcXHRcXHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjQyLVxcdGVsc2VcXG4tLVxcbm5ldC90aXBjL21zZy5oPTExNDU9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxcbi0tXFxubmV0L3RpcGMvbXNnLmgtMTE0OS1cXG5uZXQvdGlwYy9tc2cuaDoxMTUwOnN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxcbm5ldC90aXBjL21zZy5oLTExNTEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjowMy4xMzIxMjMxNzlaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ0MTIyOTQ0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnaW5nIFN0cnVjdHVyZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBkZWx2ZSBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiBUSVBDIG1lc3NhZ2luZy4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgSSBzaG91bGQgc3RhcnQgYnkgdmVyaWZ5aW5nIGhvdyBgbXNnX25vZGVfaWRgIGlzIGRlZmluZWQgYW5kIHVzZWQuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgYG5ldC90aXBjL21zZy5oYCBoZWFkZXIgZmlsZS4gVGhhdCdzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyBub2RlIElEcyBhcmUgaGFuZGxlZCBhdCB0aGUgbWVzc2FnZSBsZXZlbCwgcmlnaHQ/IEdvdHRhIG1ha2Ugc3VyZSBteSBhc3N1bXB0aW9ucyBhYm91dCBob3cgdGhleSdyZSBwYXNzZWQgYW5kIGludGVycHJldGVkIGFyZSBjb3JyZWN0LCBiZWZvcmUgSSBzdGFydCB0cmFjaW5nIHRoaW5ncyBmdXJ0aGVyLiBUaGlzIGlzIGZ1bmRhbWVudGFsIHRvIHVuZGVyc3RhbmRpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMgSSdtIGxvb2tpbmcgYXQgd2l0aCBUSVBDIGNvbW11bmljYXRpb24uIExldCdzIHNlZSB3aGF0IHRoYXQgaGVhZGVyIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDk4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MDYuNTczMzU1NTUxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90aXBjL21zZy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNDUsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNDU6XFx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxcbjExNDY6XFx0e1xcbjExNDc6XFx0XFx0bWVtY3B5KG1zZ19kYXRhKGhkciksIGlkLCAxNik7XFxuMTE0ODpcXHR9XFxuMTE0OTpcXHRcXG4xMTUwOlxcdHN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxcbjExNTE6XFx0e1xcbjExNTI6XFx0XFx0cmV0dXJuICh1OCAqKW1zZ19kYXRhKGhkcik7XFxuMTE1MzpcXHR9XFxuMTE1NDpcXHRcXG4xMTU1OlxcdHN0cnVjdCBza19idWZmICp0aXBjX2J1Zl9hY3F1aXJlKHUzMiBzaXplLCBnZnBfdCBnZnApO1xcbjExNTY6XFx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpO1xcbjExNTc6XFx0Ym9vbCB0aXBjX21zZ19yZXZlcnNlKHUzMiBvd25fYWRkciwgc3RydWN0IHNrX2J1ZmYgKipza2IsIGludCBlcnIpO1xcbjExNTg6XFx0dm9pZCB0aXBjX3NrYl9yZWplY3Qoc3RydWN0IG5ldCAqbmV0LCBpbnQgZXJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbjExNTk6XFx0XFx0XFx0ICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjA2LjU3MzQ1MTIwMVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyMDM1OTc3MDM2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBLTVNBTi1EZXRlY3RhYmxlIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyBNZXNzYWdlIEhhbmRsaW5nKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBzZWVtcyB0aGF0IHdoZW4gVElQQyBtZXNzYWdlcyBhcmUgcHJvY2Vzc2VkLCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YCwgdGhlcmUncyBhIHJpc2sgb2YgcmVhZGluZyBiZXlvbmQgdGhlIGludGVuZGVkIGhlYWRlciBhbmQgcGF5bG9hZCBib3VuZGFyaWVzIG9mIHRoZSBgc2tiYCAoc29ja2V0IGJ1ZmZlcikuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBgbXNnX25vZGVfaWRgIHJldHVybnMgZGF0YSB0aGF0IGxpZXMgKmFmdGVyKiB0aGUgaGVhZGVyLCBhbmQgbXkgaW5zdGluY3QgdGVsbHMgbWUgdGhhdCB0aGlzIGNvdWxkIGJlIGEgcHJvYmxlbS4gSWYgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpcyBvbmx5IGNoZWNraW5nIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgKGBoc3pgKSwgd2UgY291bGQgYmUgYWNjZXNzaW5nIGRhdGEgaW4gbm9uLWNvbnRpZ3VvdXMgZnJhZ21lbnRzLCB0aGUgaW5mYW1vdXMgYHNrYl9zaGluZm8oc2tiKS1cdTAwM2VmcmFnc2AuXG5cbk5vdywgaWYgYHRpcGNfZGlzY19yY3ZgIHRoZW4gdHJpZXMgdG8gYG1lbWNweWAgZnJvbSBgbXNnX25vZGVfaWRgLCBpdCB3aWxsIHJlYWQgZGF0YSB3aGljaCBpcyBiZXlvbmQgdGhlIGFsbG9jYXRlZCBsaW5lYXIgcGFydCAoYHNrYi1cdTAwM2VkYXRhICsgc2tiX2hlYWRsZW4oc2tiKWApLiBUaGUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLiBLQVNBTiAqbWlnaHQqIGNhdGNoIHRoaXMgaWYgdGhlIGxpbmVhciBidWZmZXIgZW5kcyBleGFjdGx5IHdoZXJlIHRoZSBoZWFkZXIgZG9lcy4gSG93ZXZlciwgbmV0d29yayBkcml2ZXJzIHVzdWFsbHkgYWxsb2NhdGUgbW9yZSBidWZmZXIgc3BhY2UgdGhhbiBpcyBzdHJpY3RseSBuZWVkZWQgZm9yIHRoZSBpbml0aWFsIGhlYWRlci4gU2F5LCBhIDI1Ni1ieXRlIGJ1ZmZlciwgYW5kIGBza2JfaGVhZGxlbmAgaXMgb25seSA2MCBieXRlcy4gVGhlIHJlYWQgb2YgYG1zZ19ub2RlX2lkYCBtaWdodCBzdGF5IHdpdGhpbiB0aGUgYWxsb2NhdGVkIDI1NiBieXRlcy4gS0FTQU4gd291bGQgbWlzcyBpdC5cblxuVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBFdmVuIGlmIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGxpbmVhciBidWZmZXIsIGFueXRoaW5nICpiZXlvbmQqIGBza2JfaGVhZGxlbmAgaXMgdXN1YWxseSB1bmluaXRpYWxpemVkIG9yIGNvbnRhaW5zIHN0YWxlIGRhdGEuIEtNU0FOLCAqc3BlY2lmaWNhbGx5KiwgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcy4gQmVjYXVzZSB0aGUgbmV0d29yayBzdGFjayBleHBsaWNpdGx5IHBvaXNvbnMgdGhlIHRhaWxyb29tLiBTbywgYW55IHJlYWQgZnJvbSB0aGVyZSBzaG91bGQgYmUgZmxhZ2dlZCBhcyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuXG5cblRoaXMgc2NlbmFyaW8gbGVhZHMgdG8gYSBjbGVhciBjYXRlZ29yaXphdGlvbiBvZiBidWdzOlxuXG4xLiAgUmVhZGluZyBoZWFkZXIgZmllbGRzIGxpa2UgYG1zZ19wZWVyX25ldF9oYXNoYCB3aGVuIGBoc3pgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2Zmc2V0IG9mIHRoYXQgZmllbGQuIFRoaXMgcmVzdWx0cyBpbiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIHRoZSBsaW5lYXIgYnVmZmVyLlxuMi4gIFJlYWRpbmcgYG1zZ19ub2RlX2lkYCAocGFydCBvZiB0aGUgcGF5bG9hZCkgd2hlbiB0aGUgZGF0YSBpcyBmcmFnbWVudGVkIGFuZCBzaXRzIGJleW9uZCB0aGUgaGVhZGVyIHNpemUuIFRoaXMsIGFnYWluLCByZWFkcyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCBzdGFuZGFyZCBidWZmZXIgYWxsb2NhdGlvbiBzaXplcyBtYXNrIHRoZXNlIHJlYWRzIGZyb20gS0FTQU4uIEJ1dCBLTVNBTiwgd2l0aCBpdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJhY2tpbmcsIHdpbGwgY2F0Y2ggdGhlbSEgS01TQU4gaXMgdGhlICpwZXJmZWN0KiB0b29sIGhlcmUuXG5cbk5vdywgbGV0J3MgY29uc2lkZXIgdGhlIGluZm9ybWF0aW9uIGxlYWsgYXNwZWN0LiBUaGUgdW5pbml0aWFsaXplZCBkYXRhIGlzIHJlYWQgaW50byBsb2NhbCB2YXJpYWJsZXMgbGlrZSBgcG5ldF9oYXNoYCwgYGNhcHNgLCBgc3VnZ2AsIGFuZCBgbXR5cGAuIFRoZSBjb2RlIHRoZW4gdXNlcyB0aG9zZSB2YXJpYWJsZXMsIGFuZCBhIG1ham9yIGNvbmNlcm4gaXMgY29uZGl0aW9uYWwgYnJhbmNoaW5nLiBGb3IgaW5zdGFuY2UsIHRoZSBjb2RlIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcblxuKiAgIFRoZSBjb2RlIGNvcGllcyBgbXNnX25vZGVfaWRgIGlmIGBjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjhgLiBJZiBgY2Fwc2AgaXMgdW5pbml0aWFsaXplZCwgdGhlIGJyYW5jaCBpcyBkZXBlbmRlbnQgb24gdW5pbml0aWFsaXplZCBkYXRhLCB3aGljaCBLTVNBTiBjYXRjaGVzIHBlcmZlY3RseS5cbiogICBBbm90aGVyIGV4YW1wbGUgb2YgYSBicmFuY2ggaXMgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWAuIElmIGBtdHlwYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiBpcyBjZXJ0YWluIHRvIGNhdGNoIHRoZSBcInVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlXCIgZHVyaW5nIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uXG5cbk15IHJlYXNvbmluZywgaW4gc3VtbWFyeTpcblxuMS4gIFRoZSBwYXRjaCBhZGRyZXNzZXMgdW52YWxpZGF0ZWQgYWNjZXNzIHRvIGRhdGEgaW4gdGhlIGBza2JgLCBwb3RlbnRpYWxseSByZWFkaW5nIGJleW9uZCB3aGF0J3MgdmFsaWQuXG4yLiAgVHlwaWNhbCBuZXR3b3JrIGJ1ZmZlciBhbGxvY2F0aW9ucyAoMjU2IGJ5dGVzIGFuZCBsYXJnZXIpIG1lYW4gS0FTQU4gd29uJ3QgZmxhZyB0aGVzZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLlxuMy4gIFJlYWRzIGZyb20gdGhlIGBza2JgIHRhaWxyb29tIHdpbGwgYWNjZXNzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LlxuNC4gIEtNU0FOIGlzIHRoZSB0b29sIG9mIGNob2ljZSBiZWNhdXNlIG9mIGl0cyB1bmluaXRpYWxpemVkIG1lbW9yeSB0cmFja2luZy5cbjUuICBVbmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdXNlZCBpbiBicmFuY2hpbmcgbG9naWMuXG42LiAgVGhlcmVmb3JlLCB0aGlzIGlzIGEgY2xlYXIgS01TQU4gY2FzZS5cblxuUmV2aWV3aW5nIHRoZSBwcm9tcHQgY3JpdGVyaWE6XG5UaGlzIHBhdGNoIGFkZHJlc3NlcyBib3RoIHBvaW50czpcblxuKiAgIEl0IGludHJvZHVjZXMgKG9yIG1vZGlmaWVzKSBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG4qICAgSXQgaW50cm9kdWNlcyBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLlxuXG5JdCdzIGEgcGVyZmVjdCBtYXRjaC4gSSdtIGNvbmZpZGVudCBpbiBzZXR0aW5nIGBOZWVkc0tNU0FOPXRydWVgLiBJdCBzZWVtcyBgdGlwY19kaXNjX3JjdmAgbWlnaHQgc2VuZCBhIHJlc3BvbnNlLiBJZiBzbywgaXQgbWlnaHQgZXZlbiBsZWFrIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBiYWNrIHRvIHRoZSBuZXR3b3JrLiBBbHRob3VnaCwgaXQgaXMgY2VydGFpbiBLTVNBTiB3aWxsIGNhdGNoIGl0IGJlY2F1c2UgaXQgaG9va3MgaW4gdGhlIG5ldHdvcmsgc3RhY2sgdG8gcG9pc29uIHRoZSB0YWlscm9vbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwMTQsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MjYuOTMzMjI0OTgzWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzExMTM1NCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGlwY19kaXNjX2J1aWxkX21zZ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjI2Ljk4MDM1OTQ4OFoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM0NzU2NDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBJJ20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgdGhvdWdodCBwcm9jZXNzLiBMZXQncyBnZXQgdGhpcyBkb25lLlxuKioqXG4qKkhvdyBEb2VzIFRoaXMgVGhpbmcgKkFjdHVhbGx5KiBXb3JrPyoqXG5cblJpZ2h0LCBzbyBJJ20gcmVhZGluZyB0aGlzLCBhbmQgaW1tZWRpYXRlbHkgdGhlIHF1ZXN0aW9uIGhpdHMgbWU6ICpob3cqIGRvZXMgdGhpcyBzeXN0ZW0gZ2VuZXJhdGUgdGhlc2UgcmVzcG9uc2VzPyBJIG1lYW4sIEkgY2FuIHNlZSB0aGUgb3V0cHV0LCBJIGNhbiB1bmRlcnN0YW5kIHRoZSBjb25jZXB0cyBpdCdzIHByZXNlbnRpbmcsIGJ1dCB0aGUgZnVuZGFtZW50YWwgbWVjaGFuaWNzLi4uIHRoYXQncyB3aGF0J3MgdHJ1bHkgZmFzY2luYXRpbmcuIEl0J3Mgbm90IGVub3VnaCB0byBzaW1wbHkgb2JzZXJ2ZSB0aGUgcmVzdWx0OyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBhcmNoaXRlY3R1cmUsIHRoZSBhbGdvcml0aG1zLCB0aGUgKnByb2Nlc3NlcyogdGhhdCBsZWFkIGZyb20gaW5wdXQgdG8gb3V0cHV0LiBJcyBpdCBydWxlLWJhc2VkPyBJcyBpdCBzdGF0aXN0aWNhbD8gSXMgaXQgYmFzZWQgb24gbmV1cmFsIG5ldHdvcmtzPyBXaGF0J3MgdGhlIG1vZGVsJ3MgdHJhaW5pbmcgZGF0YSBsb29rIGxpa2U/IEl0J3MgYWxsIGFib3V0IGhvdyBpdCB0YWtlcyBpbiBpbmZvcm1hdGlvbiwgcHJvY2Vzc2VzIGl0LCBhbmQgdGhlbiBjcmFmdHMgYW4gYW5zd2VyLiBUaGUgXCJob3dcIiBpcyB0aGUgY29yZSBvZiBldmVyeXRoaW5nLiBVbmRlcnN0YW5kaW5nIHRoYXQgd291bGQgdHJ1bHkgdW5sb2NrIGl0cyBwb3RlbnRpYWwuIEkgd2FudCB0byBrbm93IHRoZSBnZWFycyB0dXJuaW5nIGJlbmVhdGggdGhlIHN1cmZhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjQxLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozMC42MTUxMTk5MjlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MDExMzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkRTQ19SRVFfTVNHXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvZGlzY292ZXIuYz0xNDE9c3RhdGljIGJvb2wgdGlwY19kaXNjX2FkZHJfdHJpYWxfbXNnKHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE3Mi1cXHRcXHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cXHUwMDNlc2tiKSwgdG4tXFx1MDAzZXRyaWFsX2FkZHIpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTczOlxcdFxcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXFx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE3NC1cXHR9XFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jPTE5Mz12b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0yNzUtXFx0XFx0cmV0dXJuO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6Mjc2OlxcdGlmIChtdHlwICE9IERTQ19SRVFfTVNHKVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjc3LVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzEzPXN0YXRpYyB2b2lkIHRpcGNfZGlzY190aW1lb3V0KHN0cnVjdCB0aW1lcl9saXN0ICp0KVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0zNDYtXFx0XFx0XFx0ZC1cXHUwMDNldGltZXJfaW50diA9IFRJUENfRElTQ19GQVNUO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MzQ3OlxcdFxcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXFx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTM0OC1cXHRcXHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cXHUwMDNlc2tiKSwgdG4tXFx1MDAzZXRyaWFsX2FkZHIpO1xcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYz0zNzA9aW50IHRpcGNfZGlzY19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTM4My1cXHR9XFxubmV0L3RpcGMvZGlzY292ZXIuYzozODQ6XFx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cXHUwMDNlc2tiLCBEU0NfUkVRX01TRywgYik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy0zODUtXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jPTQyMT12b2lkIHRpcGNfZGlzY19yZXNldChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtNDI3LVxcdHNwaW5fbG9ja19iaChcXHUwMDI2ZC1cXHUwMDNlbG9jayk7XFxubmV0L3RpcGMvZGlzY292ZXIuYzo0Mjg6XFx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cXHUwMDNlc2tiLCBEU0NfUkVRX01TRywgYik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy00MjktXFx0ZC1cXHUwMDNlbmV0ID0gbmV0O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozMC42NjIxMzg0NjRaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjAxMjgzMzY3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgdGlwY19kaXNjX3JjdmAgKGFyb3VuZCBMaW5lIDI3NSkqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUsIGFuZCBJJ20gemVyb2luZyBpbiBvbiBgdGlwY19kaXNjX3JjdmAgbmVhciBsaW5lIDI3NS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhpcyBmdW5jdGlvbidzIGRvaW5nLiBgdGlwY19kaXNjX3JjdmAg4oCTIHJpZ2h0LCB0aGlzIGlzIGxpa2VseSB0aGUgZGlzY292ZXJ5IHJlY2VpdmUgaGFuZGxlciBmb3IgVElQQy4gSSdtIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IHRoZSBkaXNjb3ZlcnkgcHJvY2VzcyBpcyBtYW5hZ2VkIGF0IHRoZSB0cmFuc3BvcnQgbGF5ZXIsIGVzcGVjaWFsbHkgaW4gcmVnYXJkcyB0byBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZXMsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG9wZXJhdGVzIG9uIGFuZCBhbnkgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaXQgZW1wbG95cy4gSSBleHBlY3QgdG8gZmluZCBzb21lIGxvZ2ljIGRlYWxpbmcgd2l0aCBmaWx0ZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBxdWV1aW5nIG9mIHRoZXNlIGRpc2NvdmVyeSBwYWNrZXRzLCBhbmQgSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGVycm9yIGhhbmRsaW5nIHRvIHNlZSBob3cgaXQgZ3JhY2VmdWxseSBtYW5hZ2VzIHVuZXhwZWN0ZWQgb3IgbWFsZm9ybWVkIG1lc3NhZ2VzLiBJJ2xsIGJlIHBhcnRpY3VsYXJseSB3YXRjaGZ1bCBmb3IgYW55IHBvdGVudGlhbCBmb3IgZGVhZGxvY2tzIG9yIGxvY2sgY29udGVudGlvbiB3aXRoaW4gdGhlIHJlY2VpdmUgcGF0aC4gQW5kIG9mIGNvdXJzZSwgSSdtIGFscmVhZHkgYW50aWNpcGF0aW5nIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGxpa2UgdGhlIGRlc2NyaXB0b3IgcXVldWVzIGFuZCB0aGUgbmV0d29yayBidWZmZXJzLCBhbmQgSSdsbCBiZSBjaGVja2luZyB0byBzZWUgaG93IGVmZmljaWVudGx5IHRoZXNlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZC4gRmluYWxseSwgSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgVElQQyBjb3JlIGFuZCB1c2VyLXNwYWNlIHByb2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIHdhaXRpbmcgb24gZGlzY292ZXJ5IHJlc3VsdHMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2suXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNDk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MzYuNjc0OTc0ODUxWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4NjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjYwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjYwOlxcdFxcbiAyNjE6XFx0XFx0LyogTWVzc2FnZSBmcm9tIHNvbWVib2R5IHVzaW5nIHRoaXMgbm9kZSdzIGFkZHJlc3MgKi9cXG4gMjYyOlxcdFxcdGlmIChpbl9vd25fbm9kZShuZXQsIHNyYykpIHtcXG4gMjYzOlxcdFxcdFxcdGRpc2NfZHVwbF9hbGVydChiLCBzZWxmLCBcXHUwMDI2bWFkZHIpO1xcbiAyNjQ6XFx0XFx0XFx0cmV0dXJuO1xcbiAyNjU6XFx0XFx0fVxcbiAyNjY6XFx0XFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgZHN0LCBzZWxmKSlcXG4gMjY3OlxcdFxcdFxcdHJldHVybjtcXG4gMjY4OlxcdFxcdGlmICghdGlwY19pbl9zY29wZShsZWdhY3ksIGItXFx1MDAzZWRvbWFpbiwgc3JjKSlcXG4gMjY5OlxcdFxcdFxcdHJldHVybjtcXG4gMjcwOlxcdFxcdHRpcGNfbm9kZV9jaGVja19kZXN0KG5ldCwgc3JjLCBwZWVyX2lkLCBiLCBjYXBzLCBzaWduYXR1cmUsIHBuZXRfaGFzaCxcXG4gMjcxOlxcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm1hZGRyLCBcXHUwMDI2cmVzcG9uZCwgXFx1MDAyNmR1cGxfYWRkcik7XFxuIDI3MjpcXHRcXHRpZiAoZHVwbF9hZGRyKVxcbiAyNzM6XFx0XFx0XFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNyYywgXFx1MDAyNm1hZGRyKTtcXG4gMjc0OlxcdFxcdGlmICghcmVzcG9uZClcXG4gMjc1OlxcdFxcdFxcdHJldHVybjtcXG4gMjc2OlxcdFxcdGlmIChtdHlwICE9IERTQ19SRVFfTVNHKVxcbiAyNzc6XFx0XFx0XFx0cmV0dXJuO1xcbiAyNzg6XFx0XFx0dGlwY19kaXNjX21zZ194bWl0KG5ldCwgRFNDX1JFU1BfTVNHLCBzcmMsIHNlbGYsIDAsIFxcdTAwMjZtYWRkciwgYik7XFxuIDI3OTpcXHR9XFxuIDI4MDpcXHRcXG4gMjgxOlxcdC8qIHRpcGNfZGlzY19hZGRfZGVzdCAtIGluY3JlbWVudCBzZXQgb2YgZGlzY292ZXJlZCBub2Rlc1xcbiAyODI6XFx0ICovXFxuIDI4MzpcXHR2b2lkIHRpcGNfZGlzY19hZGRfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkKVxcbiAyODQ6XFx0e1xcbiAyODU6XFx0XFx0c3Bpbl9sb2NrX2JoKFxcdTAwMjZkLVxcdTAwM2Vsb2NrKTtcXG4gMjg2OlxcdFxcdGQtXFx1MDAzZW51bV9ub2RlcysrO1xcbiAyODc6XFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmQtXFx1MDAzZWxvY2spO1xcbiAyODg6XFx0fVxcbiAyODk6XFx0XFxuIDI5MDpcXHQvKiB0aXBjX2Rpc2NfcmVtb3ZlX2Rlc3QgLSBkZWNyZW1lbnQgc2V0IG9mIGRpc2NvdmVyZWQgbm9kZXNcXG4gMjkxOlxcdCAqL1xcbiAyOTI6XFx0dm9pZCB0aXBjX2Rpc2NfcmVtb3ZlX2Rlc3Qoc3RydWN0IHRpcGNfZGlzY292ZXJlciAqZClcXG4gMjkzOlxcdHtcXG4gMjk0OlxcdFxcdGludCBpbnR2LCBudW07XFxuIDI5NTpcXHRcXG4gMjk2OlxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2ZC1cXHUwMDNlbG9jayk7XFxuIDI5NzpcXHRcXHRkLVxcdTAwM2VudW1fbm9kZXMtLTtcXG4gMjk4OlxcdFxcdG51bSA9IGQtXFx1MDAzZW51bV9ub2RlcztcXG4gMjk5OlxcdFxcdGludHYgPSBkLVxcdTAwM2V0aW1lcl9pbnR2O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozNi42NzUwNTUwNzFaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE0MTM1ODgwMzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFRJUEMgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGZ1bmN0aW9uLCBhbmQgSSd2ZSBmb3VuZCBzb21ldGhpbmcgYWxhcm1pbmcuIEl0J3MgZ2V0dGluZyBjYWxsZWQgd2l0aCBgcGVlcl9pZGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcG5ldF9oYXNoYCDigJMgYWxsIG9mIHdoaWNoIGFyZSAqdW5pbml0aWFsaXplZCogdmFsdWVzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGBza2JgJ3MgdGFpbHJvb20uIE15IGd1dCBpcyBzY3JlYW1pbmcgdGhpcyBpcyBhIG1ham9yIHByb2JsZW0uXG5cbkVzc2VudGlhbGx5LCBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGlzIGJlaW5nIGZlZCBqdW5rIGRhdGEsIGFuZCBpdCdzIHVzaW5nIHRoaXMgZ2FyYmFnZSB0byB1cGRhdGUgdGhlIG5vZGUncyBzdGF0ZS4gVGhhdCdzIGEgcmVjaXBlIGZvciBkaXNhc3RlcjogaW50ZXJuYWwgc3RhdGUgY29ycnVwdGlvbiwgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzLCB0aGUgd29ya3MuIFRoZSBzb3VyY2Ugb2YgdGhlIGlzc3VlIHNlZW1zIHRvIGJlIGluIGB0aXBjX2Rpc2NfcmN2YCwgd2hlcmUgdGhlIHBhY2tldCBkYXRhIGlzIGJlaW5nIHJlYWQgYmVmb3JlIHRoZSBwYWNrZXRzJ3MgaW50ZWdyaXR5IG9yIHNpemUgYXJlIHZlcmlmaWVkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSwgb3IgYmVmb3JlIGl0J3MgZXZlbiBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLlxuXG5UaGUga2lja2VyIGlzLCB0aGlzICp3b24ndCogdHJpZ2dlciBLQVNBTi4gV2UncmUgdGFsa2luZyBhYm91dCByZWFkaW5nIGZyb20gdGhlIHRhaWxyb29tIG9mIGEgc3RhbmRhcmQtc2l6ZWQgYHNrX2J1ZmZgIGJ1ZmZlciwgbWVhbmluZyB0aGUgcmVhZCB3aWxsIGxpa2VseSBiZSB3aXRoaW4gdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBLQVNBTiBpcyBtZWFudCB0byBmaW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBidXQgS01TQU4gaXMgZ29pbmcgdG8gYmUgbmVlZGVkIGhlcmUuIEtNU0FOIGlzIHRoZSByaWdodCB0b29sIGJlY2F1c2UgdGhlIHJlYWQgaXMgZ29pbmcgdG8gYmUgd2l0aGluIHRoZSBib3VuZHMsIGJ1dCBmcm9tICp1bmluaXRpYWxpemVkKiBtZW1vcnkuIFRoaXMgZGF0YSBpcyB0aGVuIGJlaW5nIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHNvIHRoaXMgaXMgcHJlY2lzZWx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBLTVNBTiB3aWxsIGhpZ2hsaWdodCB0aGUgdXNlIG9mIHRoZXNlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFuZCB0aGUgY29uc2VxdWVuY2VzIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoZW0uIFdlIGFic29sdXRlbHkgbmVlZCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiB0byBjb25maXJtIHRoaXMgZml4IGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGluc2lkaW91cyB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGx1cmtpbmcgaW4gVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4gKipOZWVkc0tNU0FOID0gdHJ1ZS4qKlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTQ5MiwiT3V0cHV0VG9rZW5zIjozODEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1Njo0OC4wODg2NDYwNzVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzQ1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGFuIGlzc3VlIGluIGB0aXBjX2Rpc2NfcmN2YCB3aGVyZSBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlIGZpZWxkcyAoc3VjaCBhcyBgcG5ldF9oYXNoYCwgYGNhcHNgLCBgc2lnbmF0dXJlYCwgYW5kIGBwZWVyX2lkYCkgYXJlIHJlYWQgZnJvbSB0aGUgYHNrX2J1ZmZgIGJlZm9yZSB2ZXJpZnlpbmcgdGhhdCB0aGUgcGFja2V0IGFjdHVhbGx5IGNvbnRhaW5zIGEgZnVsbCBoZWFkZXIgYW5kIHBheWxvYWQgKGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBjaGVja3MpIGFuZCBiZWZvcmUgZW5zdXJpbmcgdGhlIGRhdGEgaXMgbGluZWFyaXplZCAoYHNrYl9saW5lYXJpemVgKS4gXFxuXFxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cXG5cXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXFx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTidzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFxcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxcblxcbldoZW4gYSBtYWxpY2lvdXNseSBzbWFsbCBvciBmcmFnbWVudGVkIHBhY2tldCBpcyByZWNlaXZlZCwgcmVhZGluZyB0aGVzZSBmaWVsZHMgYWNjZXNzZXMgdGhlIHRhaWxyb29tIG9mIHRoZSBgc2tfYnVmZmAgZGF0YSBidWZmZXIuIEJlY2F1c2UgbmV0d29yayBkcml2ZXJzIHR5cGljYWxseSBhbGxvY2F0ZSBzdGFuZGFyZC1zaXplZCBjaHVua3MgKGUuZy4sIDI1NiwgMTUwMCwgb3IgMjA0OCBieXRlcykgZm9yIGBza19idWZmYCBkYXRhLCB0aGVzZSByZWFkcyB3aWxsIGxpa2VseSBmYWxsIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhbGxvY2F0ZWQgaGVhcCBjaHVuay4gQ29uc2VxdWVudGx5LCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgdGhpcyBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVxcdTAwM2VsZW5gIG9yIGBza2JfaGVhZGxlbmAgYXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChhbmQgYXJlIGV4cGxpY2l0bHkgcG9pc29uZWQgYnkgS01TQU4ncyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClgLCBgaWYgKG10eXAgPT0gRFNDX1JFUV9NU0cpYCkgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHdoaWNoIGNvdWxkIGNvcnJ1cHQgaW50ZXJuYWwgc3RhdGUgb3IgbGVhZCB0byBpbmZvLWxlYWtzLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgbWFraW5nIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBoaWdobHkganVzdGlmaWVkIHRvIHZlcmlmeSB0aGlzIGZpeCBhbmQgZW5zdXJlIG5vIG90aGVyIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IGluIHRoZSBUSVBDIHBhY2tldCBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-18 18:10:38 +0000 UTC FinishedAt: 2026-08-18 19:56:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "d679c2e1e8d96f71f85e2ef3877407d264212cc3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TIPC", "TIPC_MEDIA_UDP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "d679c2e1e8d96f71f85e2ef3877407d264212cc3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TIPC", "TIPC_MEDIA_UDP" ], "series_id": "627256da-e49e-4ef6-96ed-f76a8dd124a8" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "tipc_disc_rcv" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RJUEMmIzM0OywKICAgICYjMzQ7VElQQ19NRURJQV9VRFAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0aXBjX2Rpc2NfcmN2JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcblxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTiYjMzk7cyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1MzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDQzMjRkNjc1ZDI1ZjIxMTJiMTk5ZDdhNDcxNjMxMWI3OTdlZjAyNDJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAxOTo1Mzo1NSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuY1xuaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDRcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbkBAIC0xOTUsMjcgJiM0MzsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiB7XG4gXHRzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTtcbiBcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xuLVx0dTMyIHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4tXHR1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuJiM0MztcdHUzMiBwbmV0X2hhc2g7XG4mIzQzO1x0dTE2IGNhcHM7XG4gXHRib29sIGxlZ2FjeSA9IHRuLVx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcbi1cdHUzMiBzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4tXHR1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4mIzQzO1x0dTMyIHN1Z2c7XG4mIzQzO1x0dTMyIHNpZ25hdHVyZTtcbiBcdHU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTtcbi1cdHUzMiBkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcbi1cdHUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcbiYjNDM7XHR1MzIgZHN0O1xuJiM0MztcdHUzMiBuZXRfaWQ7XG4gXHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuLVx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuLVx0dTMyIG10eXAgPSBtc2dfdHlwZShoZHIpO1xuJiM0MztcdHUzMiBzcmM7XG4mIzQzO1x0dTMyIG10eXA7XG4gXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xuIFx0Ym9vbCByZXNwb25kID0gZmFsc2U7XG4gXHR1MzIgc2VsZjtcbiBcdGludCBlcnI7XG4gXG4mIzQzO1x0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4mIzQzO1x0ICogcGx1cyBhIG5vZGUgaWRlbnRpdHksIHNlZSB0aXBjX2Rpc2NfaW5pdF9tc2coKS4gVGhlIGhlYWRlclxuJiM0MztcdCAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZFxuJiM0MztcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4mIzQzO1x0ICogcmVhZGluZyB0aGVtLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbiYjNDM7XHQgICAgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTikge1xuJiM0MztcdFx0a2ZyZWVfc2tiKHNrYik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcbiBcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbiYjNDM7XHRwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpO1xuJiM0MztcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbiYjNDM7XHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4mIzQzO1x0c2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4mIzQzO1x0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4mIzQzO1x0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4mIzQzO1x0c3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4mIzQzO1x0bXR5cCA9IG1zZ190eXBlKGhkcik7XG4gXG4gXHRpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxuIFx0XHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUSVBDJiMzNDssCiAgICAmIzM0O1RJUENfTUVESUFfVURQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dGlwY19kaXNjX3JjdiYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGJvdW5kcyBjaGVja2luZyBmb3IgaW5jb21pbmcgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZXMgaW4gYHRpcGNfZGlzY19yY3ZgIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIFRJUEMgcHJvdG9jb2wgbG9naWMgdGhhdCBwcm9jZXNzZXMgbmV0d29yayBwYWNrZXRzLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNDMyNGQ2NzVkMjVmMjExMmIxOTlkN2E0NzE2MzExYjc5N2VmMDI0MgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDE5OjUzOjU1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGlzY292ZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCkBAIC0xOTUsMjcgJiM0MzsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIHsKIAlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTsKIAlzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTsKLQl1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTsKLQl1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpOwomIzQzOwl1MzIgcG5ldF9oYXNoOwomIzQzOwl1MTYgY2FwczsKIAlib29sIGxlZ2FjeSA9IHRuLSZndDtsZWdhY3lfYWRkcl9mb3JtYXQ7Ci0JdTMyIHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTsKLQl1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7CiYjNDM7CXUzMiBzdWdnOwomIzQzOwl1MzIgc2lnbmF0dXJlOwogCXU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTsKLQl1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7Ci0JdTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpOwomIzQzOwl1MzIgZHN0OwomIzQzOwl1MzIgbmV0X2lkOwogCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWFkZHI7Ci0JdTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpOwotCXUzMiBtdHlwID0gbXNnX3R5cGUoaGRyKTsKJiM0MzsJdTMyIHNyYzsKJiM0MzsJdTMyIG10eXA7CiAJYm9vbCBkdXBsX2FkZHIgPSBmYWxzZTsKIAlib29sIHJlc3BvbmQgPSBmYWxzZTsKIAl1MzIgc2VsZjsKIAlpbnQgZXJyOwogCiYjNDM7CS8qIERpc2NvdmVyeSBtZXNzYWdlcyBhbHdheXMgY2FycnkgdGhlIG1heGltdW0gc2l6ZSBUSVBDIGhlYWRlcgomIzQzOwkgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyCiYjNDM7CSAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZAomIzQzOwkgKiB0aGUgbWluaW11bSBoZWFkZXIgc2l6ZSwgc28gZGlzY2FyZCBzaG9ydGVyIG1lc3NhZ2VzIGJlZm9yZQomIzQzOwkgKiByZWFkaW5nIHRoZW0uCiYjNDM7CSAqLwomIzQzOwlpZiAobXNnX2hkcl9zeihoZHIpICZsdDsgTUFYX0hfU0laRSB8fAomIzQzOwkgICAgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pIHsKJiM0MzsJCWtmcmVlX3NrYihza2IpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiAJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KIAloZHIgPSBidWZfbXNnKHNrYik7CiYjNDM7CXBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7CiYjNDM7CWNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTsKJiM0MzsJc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpOwomIzQzOwlzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTsKJiM0MzsJZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7CiYjNDM7CW5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpOwomIzQzOwlzcmMgPSBtc2dfcHJldm5vZGUoaGRyKTsKJiM0MzsJbXR5cCA9IG1zZ190eXBlKGhkcik7CiAKIAlpZiAoY2FwcyAmYW1wOyBUSVBDX05PREVfSUQxMjgpCiAJCW1lbWNweShwZWVyX2lkLCBtc2dfbm9kZV9pZChoZHIpLCBOT0RFX0lEX0xFTik7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjUzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzgKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgVElQQyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC90aXBjL2Rpc2NvdmVyLmNgLiBJdCYjMzk7cyBzdHJhaWdodGZvcndhcmQsIHJlYWxseS4gVGhlIGNvcmUgb2YgaXQgaXMgYSBkZWZlbnNpdmUgY2hlY2sgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YC4gQmFzaWNhbGx5LCBiZWZvcmUgZGl2aW5nIGludG8gZmllbGRzIGluIHRoZSBtZXNzYWdlLCBpdCB2ZXJpZmllcyB0aGUgbWVzc2FnZSBoZWFkZXIgc2l6ZSBhbmQgdGhlIG92ZXJhbGwgbWVzc2FnZSBzaXplLiBTbWFydC4gVGhpcyBpcyBjbGVhcmx5IGEgZnVuY3Rpb25hbCBmaXgsIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyByZWFkIHZ1bG5lcmFiaWxpdHkgb3IgYSByZWxhdGVkIG1lbW9yeSBhY2Nlc3MgaXNzdWUg4oCTIGV4YWN0bHkgdGhlIGtpbmQgb2YgdGhpbmcgd2UgbmVlZCB0byBjYXRjaC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIFRJUEMgc3Vic3lzdGVtIGhlcmUsIHNvIHRoaXMgY2hhbmdlIGtlZXBzIGl0cyBpbnRlZ3JpdHkuIE5vdywgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNoYW5nZSBieSBkaWdnaW5nIGludG8gYG5ldC90aXBjL2Rpc2NvdmVyLmNgIHRvIHNlZSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLCBhbmQgSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIGZpbGUgdG8gY29uZmlybSBhbGwgVElQQyBjb25maWd1cmF0aW9uIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRJUEMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL0tjb25maWctNS1cbm5ldC90aXBjL0tjb25maWc6NjptZW51Y29uZmlnIFRJUENcbm5ldC90aXBjL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0O1RoZSBUSVBDIFByb3RvY29sXCYjMzQ7XG4tLVxubmV0L3RpcGMvS2NvbmZpZy0yNC1cbm5ldC90aXBjL0tjb25maWc6MjU6Y29uZmlnIFRJUENfTUVESUFfSUJcbm5ldC90aXBjL0tjb25maWctMjYtXHRib29sIFwmIzM0O0luZmluaUJhbmQgbWVkaWEgdHlwZSBzdXBwb3J0XCYjMzQ7XG4tLVxubmV0L3RpcGMvS2NvbmZpZy0zMC1cdCAgSVAtb3Zlci1JbmZpbmlCYW5kIGRldmljZXMuXG5uZXQvdGlwYy9LY29uZmlnOjMxOmNvbmZpZyBUSVBDX01FRElBX1VEUFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7SVAvVURQIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC90aXBjL0tjb25maWctMzgtXG5uZXQvdGlwYy9LY29uZmlnOjM5OmNvbmZpZyBUSVBDX0NSWVBUT1xubmV0L3RpcGMvS2NvbmZpZy00MC1cdGJvb2wgXCYjMzQ7VElQQyBlbmNyeXB0aW9uIHN1cHBvcnRcJiMzNDtcbi0tXG5uZXQvdGlwYy9LY29uZmlnLTUzLVxubmV0L3RpcGMvS2NvbmZpZzo1NDpjb25maWcgVElQQ19ESUFHXG5uZXQvdGlwYy9LY29uZmlnLTU1LVx0dHJpc3RhdGUgXCYjMzQ7VElQQzogc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzE5MQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgdGlwY19kaXNjX3JjdmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgSSYjMzk7bSB3b3JraW5nIHdpdGggYSBgVElQQ2AgY29uZmlndXJhdGlvbiBoZXJlLiBOb3csIHRoZSBjb2RlJiMzOTtzIGNhbGxpbmcgYHRpcGNfZGlzY19yY3ZgLCBhbmQgbXkgaW5pdGlhbCBmb2N1cyBpcyBvbiBpdHMgc2NvcGUuIElzIHRoaXMgZnVuY3Rpb24gc3RhdGljLCBtZWFuaW5nIGl0JiMzOTtzIGNvbmZpbmVkIHRvIGl0cyBtb2R1bGUsIG9yIGlzIGl0IGV4cG9ydGVkLCBhbmQgdGhlcmVmb3JlIGNhbGxhYmxlIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbD8gVGhhdCYjMzk7cyB0aGUgZmlyc3QgcXVlc3Rpb24gSSBuZWVkIHRvIGFuc3dlci4gS25vd2luZyB0aGF0IHdpbGwgaW5mbHVlbmNlIGhvdyBJIGFwcHJvYWNoIHVuZGVyc3RhbmRpbmcgaXRzIHB1cnBvc2UgYW5kIHBvdGVudGlhbCBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgc3lzdGVtLiBJZiBpdCYjMzk7cyBzdGF0aWMsIGl0JiMzOTtzIGVhc2llciB0byByZWFzb24gYWJvdXQgaW4gaXNvbGF0aW9uLCB3aGVyZWFzIGlmIGV4cG9ydGVkLCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGludGVyYWN0aW9ucyB3aXRoIGEgd2lkZXIgYXJyYXkgb2YgbW9kdWxlcy4gVGltZSB0byBkaWcgaW4gYW5kIGNoZWNrIGl0cyBkZWNsYXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0aXBjX2Rpc2NfcmN2JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3RpcGMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTg3LS8qKlxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTg5LSAqIEBuZXQ6IGFwcGxpY2FibGUgbmV0IG5hbWVzcGFjZVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xubmV0L3RpcGMvZGlzY292ZXIuYzoxOTM6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTk0LVx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xubmV0L3RpcGMvZGlzY292ZXIuaDo0ODp2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLFxubmV0L3RpcGMvZGlzY292ZXIuaC00OS1cdFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7XG4tLVxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbi0tXG5uZXQvdGlwYy9ub2RlLmMtMjEyNS1cdFx0aWYgKHVubGlrZWx5KHVzciA9PSBMSU5LX0NPTkZJRykpXG5uZXQvdGlwYy9ub2RlLmM6MjEyNjpcdFx0XHRyZXR1cm4gdGlwY19kaXNjX3JjdihuZXQsIHNrYiwgYik7XG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cdFx0ZWxzZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4NTIKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRm9jdXNpbmcgb24gdGhlIFRJUEMgRGlzY29ubmVjdCBSZWNlaXZlcioqCgpPa2F5LCBzbyBgdGlwY19kaXNjX3JjdmAgaXNuJiMzOTt0IGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0JiMzOTtzIGtleS4gSXQmIzM5O3MgY2FsbGVkIGZyb20gYHRpcGNfcmN2YCwgd2hpY2ggbWVhbnMgaXQmIzM5O3MgYSBzcGVjaWZpYyBwYXJ0IG9mIGEgbGFyZ2VyIHByb2Nlc3MuIEdpdmVuIHRoYXQsIGB0aXBjX2Rpc2NfcmN2YCBzZWVtcyBsaWtlIGEgbW9yZSBmb2N1c2VkIHN5bWJvbCB0byBleHBsb3JlLiBgdGlwY19yY3ZgIGlzIGludGVyZXN0aW5nIHRvbywgYnV0IGl0IGZlZWxzIGJyb2FkZXIuIExldCYjMzk7cyBzdGFydCB3aXRoIGB0aXBjX2Rpc2NfcmN2YC4gSSBzaG91bGQgY2hlY2sgaWYgYW55dGhpbmcgc3BlY2lmaWMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXR0ZW50aW9uIHJlbGF0ZWQgdG8gdGhpcy4KCkkgcmVtZW1iZXIgdGhhdCBgVElQQ2AgaXRzZWxmIGlzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBTbyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGRlcGVuZGVuY2llcyBmb3IgYFRJUENgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSBgbmV0L3RpcGMvS2NvbmZpZ2AgdG8gc2VlIHdoYXQgZWxzZSBtaWdodCBiZSByZXF1aXJlZCBmb3IgYFRJUENgIHRvIGZ1bmN0aW9uIGNvcnJlY3RseS4gVGhpcyBpcyB0aGUgcGxhY2UgdG8gY2hlY2sgZm9yIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90aXBjL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvS2NvbmZpZz02PW1lbnVjb25maWcgVElQQ1xubmV0L3RpcGMvS2NvbmZpZy03LVx0dHJpc3RhdGUgXCYjMzQ7VGhlIFRJUEMgUHJvdG9jb2xcJiMzNDtcbm5ldC90aXBjL0tjb25maWc6ODpcdGRlcGVuZHMgb24gSU5FVFxubmV0L3RpcGMvS2NvbmZpZzo5Olx0ZGVwZW5kcyBvbiBJUFY2IHx8IElQVjY9blxubmV0L3RpcGMvS2NvbmZpZy0xMC1cdGhlbHBcbi0tXG5uZXQvdGlwYy9LY29uZmlnPTI1PWNvbmZpZyBUSVBDX01FRElBX0lCXG5uZXQvdGlwYy9LY29uZmlnLTI2LVx0Ym9vbCBcJiMzNDtJbmZpbmlCYW5kIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzoyNzpcdGRlcGVuZHMgb24gVElQQyBcdTAwMjZcdTAwMjYgSU5GSU5JQkFORF9JUE9JQlxubmV0L3RpcGMvS2NvbmZpZy0yOC1cdGhlbHBcbi0tXG5uZXQvdGlwYy9LY29uZmlnPTMxPWNvbmZpZyBUSVBDX01FRElBX1VEUFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7SVAvVURQIG1lZGlhIHR5cGUgc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzozMzpcdGRlcGVuZHMgb24gVElQQ1xubmV0L3RpcGMvS2NvbmZpZy0zNC1cdHNlbGVjdCBORVRfVURQX1RVTk5FTFxuLS1cbm5ldC90aXBjL0tjb25maWc9Mzk9Y29uZmlnIFRJUENfQ1JZUFRPXG5uZXQvdGlwYy9LY29uZmlnLTQwLVx0Ym9vbCBcJiMzNDtUSVBDIGVuY3J5cHRpb24gc3VwcG9ydFwmIzM0O1xubmV0L3RpcGMvS2NvbmZpZzo0MTpcdGRlcGVuZHMgb24gVElQQ1xubmV0L3RpcGMvS2NvbmZpZy00Mi1cdHNlbGVjdCBDUllQVE9cbi0tXG5uZXQvdGlwYy9LY29uZmlnPTU0PWNvbmZpZyBUSVBDX0RJQUdcbm5ldC90aXBjL0tjb25maWctNTUtXHR0cmlzdGF0ZSBcJiMzNDtUSVBDOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcJiMzNDtcbm5ldC90aXBjL0tjb25maWc6NTY6XHRkZXBlbmRzIG9uIFRJUENcbm5ldC90aXBjL0tjb25maWctNTctXHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NjA1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlRJUEMgQ29uZmlndXJhdGlvbiBhbmQgVnVsbmVyYWJpbGl0eSBBc3Nlc3NtZW50KioKCk9rYXksIHNvIEkgc2VlIGBUSVBDYCBpcyByZWxpYW50IG9uIGBJTkVUYC4gVGhhdCYjMzk7cyBzdHJhaWdodGZvcndhcmQ7IEkmIzM5O2xsIGdldCB0aGF0IGFkZGVkIHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdC4gTm93LCBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGB0aXBjX2Rpc2NfcmN2YCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIOKAkyBjcnVjaWFsIGZvciBkZXRlcm1pbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBoZXJlLiBZZXMsIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGB0aXBjX3JjdmAsIHdoaWNoIGVzc2VudGlhbGx5IGFjdHMgYXMgdGhlIHByaW1hcnkgcmVjZWl2ZSBmdW5jdGlvbiBmb3IgYWxsIFRJUEMgcGFja2V0cywgc28gdGhhdCYjMzk7cyBhIGRpcmVjdCBlbnRyeSBwb2ludC4KClRoaXMgcGF0Y2gsIGl0JiMzOTtzIGFkZHJlc3NpbmcgYW4gb3V0LW9mLWJvdW5kcyByZWFkLCBhbmQgdGhhdCYjMzk7cyBjb25jZXJuaW5nLiBUaGUgZml4IGludm9sdmVzIGNoZWNraW5nIGBtc2dfaGRyX3N6KGhkcilgIGFuZCBgbXNnX3NpemUoaGRyKWAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGNlcnRhaW4gZmllbGRzLiBUaGF0IHNvdW5kcyBsaWtlIGEgc29saWQgYXBwcm9hY2gsIGJ1dCBpdCBkZWZpbml0ZWx5IHdhcnJhbnRzIHRob3JvdWdoIGZ1enppbmcuCgpOb3csIGxldCYjMzk7cyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYHRpcGNfZGlzY19yY3ZgLCB3aGljaCBsaXZlcyBpbiBgbmV0L3RpcGMvZGlzY292ZXIuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgY29kZSB0byBhc3Nlc3MgdGhlIHZ1bG5lcmFiaWxpdHkgcHJvcGVybHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTkwOlx0ICogQHNrYjogYnVmZmVyIGNvbnRhaW5pbmcgbWVzc2FnZVxuIDE5MTpcdCAqIEBiOiBiZWFyZXIgdGhhdCBtZXNzYWdlIGFycml2ZWQgb25cbiAxOTI6XHQgKi9cbiAxOTM6XHR2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIDE5NDpcdFx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4gMTk1Olx0e1xuIDE5NjpcdFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XG4gMTk3Olx0XHRzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTtcbiAxOTg6XHRcdHUzMiBwbmV0X2hhc2g7XG4gMTk5Olx0XHR1MTYgY2FwcztcbiAyMDA6XHRcdGJvb2wgbGVnYWN5ID0gdG4tXHUwMDNlbGVnYWN5X2FkZHJfZm9ybWF0O1xuIDIwMTpcdFx0dTMyIHN1Z2c7XG4gMjAyOlx0XHR1MzIgc2lnbmF0dXJlO1xuIDIwMzpcdFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xuIDIwNDpcdFx0dTMyIGRzdDtcbiAyMDU6XHRcdHUzMiBuZXRfaWQ7XG4gMjA2Olx0XHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuIDIwNzpcdFx0dTMyIHNyYztcbiAyMDg6XHRcdHUzMiBtdHlwO1xuIDIwOTpcdFx0Ym9vbCBkdXBsX2FkZHIgPSBmYWxzZTtcbiAyMTA6XHRcdGJvb2wgcmVzcG9uZCA9IGZhbHNlO1xuIDIxMTpcdFx0dTMyIHNlbGY7XG4gMjEyOlx0XHRpbnQgZXJyO1xuIDIxMzpcdFxuIDIxNDpcdFx0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4gMjE1Olx0XHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXG4gMjE2Olx0XHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcbiAyMTc6XHRcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4gMjE4Olx0XHQgKiByZWFkaW5nIHRoZW0uXG4gMjE5Olx0XHQgKi9cbiAyMjA6XHRcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbiAyMjE6XHRcdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICYjNDM7IE5PREVfSURfTEVOKSB7XG4gMjIyOlx0XHRcdGtmcmVlX3NrYihza2IpO1xuIDIyMzpcdFx0XHRyZXR1cm47XG4gMjI0Olx0XHR9XG4gMjI1Olx0XG4gMjI2Olx0XHRpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7XG4gMjI3Olx0XHRcdGtmcmVlX3NrYihza2IpO1xuIDIyODpcdFx0XHRyZXR1cm47XG4gMjI5Olx0XHR9XG4gMjMwOlx0XHRoZHIgPSBidWZfbXNnKHNrYik7XG4gMjMxOlx0XHRwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpO1xuIDIzMjpcdFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuIDIzMzpcdFx0c3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpO1xuIDIzNDpcdFx0c2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4gMjM1Olx0XHRkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcbiAyMzY6XHRcdG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpO1xuIDIzNzpcdFx0c3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4gMjM4Olx0XHRtdHlwID0gbXNnX3R5cGUoaGRyKTtcbiAyMzk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTc2NQoJCQkJCQkJb3V0cHV0OiAxMDgKCQkJCQkJCXRob3VnaHRzOiAxNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgVGhpcyBUSVBDIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQmIzM5O3MgYSBnb29kLCBzZW5zaWJsZSBhZGRpdGlvbi4gSXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGxvb2tpbmcgYXQgYG1zZ19oZHJfc3ooaGRyKWAgYW5kIGBtc2dfc2l6ZShoZHIpYC4gV2UmIzM5O3JlIHZlcmlmeWluZyBpZiB0aGVzZSBzaXplcyBhcmUgd2l0aGluIHNlbnNpYmxlIGJvdW5kcywgY29tcGFyaW5nIHRoZW0gdG8gYE1BWF9IX1NJWkVgIGFuZCBgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAuIFRoaXMgaXMgcmVhY2hhYmxlIHRocm91Z2ggYHRpcGNfcmN2YCwgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBpbmNvbWluZyBUSVBDIHBhY2tldHMuCgpGcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUsIHRoaXMgaXMgaW1wb3J0YW50LiBUaGlzIGtpbmQgb2YgY2hlY2sgaXMgYWx3YXlzIHdvcnRod2hpbGUgdG8gcHJldmVudCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyBvciBvdGhlciBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMgYXJpc2luZyBmcm9tIG1hbGZvcm1lZCBvciBtYWxpY2lvdXMgbWVzc2FnZXMuIEl0IG1ha2VzIHNlbnNlIHRvIGZ1enogdGhpcy4KCk15IHByaW1hcnkgZm9jdXMgaGVyZSwgZm9yIGZ1enppbmcgcHVycG9zZXMsIGlzIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgYHRpcGNfZGlzY19yY3ZgLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGNvbmNlbnRyYXRlIG15IGluaXRpYWwgZWZmb3J0cy4KCkkgc2hvdWxkIGFsc28gbWFrZSBzdXJlIGFsbCByZWxldmFudCBjb25maWd1cmF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhvcm91Z2ggdGVzdGluZy4gQXNpZGUgZnJvbSB0aGUgYmFzaWMgYFRJUENgIGNvbmZpZ3VyYXRpb24sIGxldCBtZSBkb3VibGUtY2hlY2sgZm9yIHJlbGF0ZWQgY29uZmlncy4gQWhhLCBgVElQQ19NRURJQV9VRFBgIHdvdWxkIGJlIGFuIGV4Y2VsbGVudCBjaG9pY2UgdG8gaW5jbHVkZSEgRW5hYmxpbmcgVElQQyBvdmVyIFVEUCBpcyBhIGNvbW1vbiBhcHByb2FjaCBmb3IgZnV6emluZyBUSVBDIGltcGxlbWVudGF0aW9ucywgbWFraW5nIGl0IGVhc2llciB0byBjcmFmdCBhbmQgaW5qZWN0IFVEUCBwYWNrZXRzIHRvIHRlc3QgdGhlIG5ldyBib3VuZHMgY2hlY2tpbmcuIFNvLCBJIHdpbGwgYWRkIGBUSVBDX01FRElBX1VEUGAgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBjb25maWd1cmF0aW9ucyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgbW9yZSBjb21wbGV0ZSB0ZXN0aW5nIGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VElQQyYjMzQ7LAogICAgJiMzNDtUSVBDX01FRElBX1VEUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VElQQyYjMzQ7LAogICAgJiMzNDtUSVBDX01FRElBX1VEUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxuXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJiMzOTtzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0MzI0ZDY3NWQyNWYyMTEyYjE5OWQ3YTQ3MTYzMTFiNzk3ZWYwMjQyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCA2ODUzODlkNGIyNDVlLi43NDY3M2NhMWYyZDUwIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTE5NSwyNyAmIzQzOzE5NSw0NyBAQCB2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogewogCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOwogCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpOwotCXUzMiBwbmV0X2hhc2ggPSBtc2dfcGVlcl9uZXRfaGFzaChoZHIpOwotCXUxNiBjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7CiYjNDM7CXUzMiBwbmV0X2hhc2g7CiYjNDM7CXUxNiBjYXBzOwogCWJvb2wgbGVnYWN5ID0gdG4tJmd0O2xlZ2FjeV9hZGRyX2Zvcm1hdDsKLQl1MzIgc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpOwotCXUzMiBzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTsKJiM0MzsJdTMyIHN1Z2c7CiYjNDM7CXUzMiBzaWduYXR1cmU7CiAJdTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9OwotCXUzMiBkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTsKLQl1MzIgbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7CiYjNDM7CXUzMiBkc3Q7CiYjNDM7CXUzMiBuZXRfaWQ7CiAJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjsKLQl1MzIgc3JjID0gbXNnX3ByZXZub2RlKGhkcik7Ci0JdTMyIG10eXAgPSBtc2dfdHlwZShoZHIpOwomIzQzOwl1MzIgc3JjOwomIzQzOwl1MzIgbXR5cDsKIAlib29sIGR1cGxfYWRkciA9IGZhbHNlOwogCWJvb2wgcmVzcG9uZCA9IGZhbHNlOwogCXUzMiBzZWxmOwogCWludCBlcnI7CiAKJiM0MzsJLyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyCiYjNDM7CSAqIHBsdXMgYSBub2RlIGlkZW50aXR5LCBzZWUgdGlwY19kaXNjX2luaXRfbXNnKCkuIFRoZSBoZWFkZXIKJiM0MzsJICogZmllbGRzIGFuZCB0aGUgbWVkaWEgYWRkcmVzcyBhcmVhIGFjY2Vzc2VkIGJlbG93IGxpdmUgYmV5b25kCiYjNDM7CSAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlCiYjNDM7CSAqIHJlYWRpbmcgdGhlbS4KJiM0MzsJICovCiYjNDM7CWlmIChtc2dfaGRyX3N6KGhkcikgJmx0OyBNQVhfSF9TSVpFIHx8CiYjNDM7CSAgICBtc2dfc2l6ZShoZHIpICZsdDsgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTikgewomIzQzOwkJa2ZyZWVfc2tiKHNrYik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAlpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQogCWhkciA9IGJ1Zl9tc2coc2tiKTsKJiM0MzsJcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTsKJiM0MzsJY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpOwomIzQzOwlzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7CiYjNDM7CXNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpOwomIzQzOwlkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTsKJiM0MzsJbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7CiYjNDM7CXNyYyA9IG1zZ19wcmV2bm9kZShoZHIpOwomIzQzOwltdHlwID0gbXNnX3R5cGUoaGRyKTsKIAogCWlmIChjYXBzICZhbXA7IFRJUENfTk9ERV9JRDEyOCkKIAkJbWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NzUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyMDY0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIENvbnNpZGVyYXRpb24gZm9yIGEgVElQQyBEaXNjb3ZlcnkgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCBpdCBkZWxheXMgc29tZSBmaWVsZCByZWFkcyBmcm9tIHRoZSBgdGlwY19tc2dgIGhlYWRlciB1bnRpbCBhZnRlciBpdCBjaGVja3MgdGhlIG1lc3NhZ2Ugc2l6ZSBhbmQgbGluZWFyaXplcyB0aGUgYHNrYmAuIFRoZSBvcmlnaW5hbCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCByZWFkcyBzdHVmZiBsaWtlIGBtc2dfcGVlcl9uZXRfaGFzaGAsIGBtc2dfbm9kZV9jYXBhYmlsaXRpZXNgLCByaWdodCBvZmYgdGhlIGJhdCBmcm9tIHRoZSBgc2tiYCBkYXRhLiBOb3csIHRoZSBtYWluIHByb2JsZW0gdGhpcyBpcyBmaXhpbmcsIGFzIGZhciBhcyBJIGNhbiBzZWUsIGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBpZiB0aGUgYHNrYmAgaXMgc21hbGxlciB0aGFuIGV4cGVjdGVkLCBvciBpZiB0aGVyZSYjMzk7cyBmcmFnbWVudGF0aW9uLgoKTXkgaW1tZWRpYXRlIHRob3VnaHQsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhlIGNvbnRleHQgb2Yga2VybmVsIGNvZGUsIGlzIHRoYXQgdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOLiAgQnV0IHRoZW4gSSBwYXVzZTogYW0gSSB0aGlua2luZyBvZiB0aGlzIGNvcnJlY3RseT8gSXMgaXQgS01TQU4gdGVycml0b3J5PyBXYWl0LCBpZiB0aGUgc2tiIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzdHJ1Y3QgaXQmIzM5O3MgcG9pbnRpbmcgdG8sIHRoZW4gcmVhZGluZyBiZXlvbmQgdGhhdCBsZW5ndGggd291bGQgYmUgcmVhZGluZyBvdXRzaWRlIHRoZSBkYXRhIHRoYXQgd2FzIGluaXRpYWxpemVkLCB3aGljaCBjb3VsZCBiZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4gY291bGQgY2F0Y2ggdGhpcywgZXNwZWNpYWxseSBpZiB0aGUgYWxsb2NhdGlvbiBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgZGF0YS4KCkkgc3RhcnQgdG8gdGhpbmsgYWJvdXQgdGhlIGRpZmZlcmVudCB0b29scyBhdmFpbGFibGUgdG8gbWUuIElmIGl0IGdvZXMgYmV5b25kIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBLQVNBTiAqc2hvdWxkKiBjYXRjaCBpdC4gQnV0LCBLQVNBTiBjYW4gbWlzcyBpdCBpZiBpdCBkb2VzIG5vdCBnbyBwYXN0IHRoZSBhbGxvY2F0aW9uIHNpemUgYW5kIHRoYXQgaXMgYSBtdWNoIGdyZWF0ZXIgcmlzay4gVGhlIHBhY2tldCBtaWdodCBiZSBvbmx5IGEgZmV3IGJ5dGVzIGluIHNpemUuIFRoZSBkYXRhIGJ1ZmZlciBpcyBvZnRlbiBtdWNoIGxhcmdlciAoZS5nLiwgTVRVIG9yIHBhZ2Ugc2l6ZSkuIFNvLCByZWFkaW5nIHRob3NlIGhlYWRlciBmaWVsZHMgZnJvbSBhIHNtYWxsIHBhY2tldCBjYW4gcmVhZCBpbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgS01TQU4gaXMgdGhlIGNvcnJlY3QgdG9vbC4gIEl0JiMzOTtzIHZlcnkgZ29vZCBhdCBjYXRjaGluZyByZWFkcyBiZXlvbmQgYHNrYi0mZ3Q7bGVuYCB3aGVyZSB0aGUgYnVmZmVyIGl0c2VsZiBpcyBsYXJnZXIuCgpBbmQgdGhlIHByb21wdCwgYWgsIHRoYXQmIzM5O3Mgd2hhdCYjMzk7cyBpbXBvcnRhbnQuIEl0IHNheXMsICYjMzQ7TmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMuLi4gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLiYjMzQ7ICBJIHNlZS4uLiB0aGlzIHBhdGNoIG1vZGlmaWVzIHRoZSBib3VuZHMgY2hlY2tzLiBJdCAqZml4ZXMqIGEgc2l0dWF0aW9uIHdoZXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdhcyBiZWluZyBhY2Nlc3NlZCEKClNvLCB0aGUgY29kZSAqZml4ZXMqIGFuIGlzc3VlLCBidXQgaXMgdGhlIGZpeCBjb3JyZWN0IGFuZCBjb21wbGV0ZT8gSSByZWFkIHRoZSBwYXRjaCBtb3JlIGNhcmVmdWxseS4gSXQmIzM5O3MgYWRkaW5nIHRoaXMgY2hlY2s6CmBgYGMKCWlmIChtc2dfaGRyX3N6KGhkcikgJmx0OyBNQVhfSF9TSVpFIHx8CgkgICAgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pIHsKCQlrZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm47Cgl9CmBgYApBbmQgaXQgZG9lcyB0aGlzICpiZWZvcmUqIGxpbmVhcml6aW5nLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgZmllbGQgcmVhZHMgdG8gYWZ0ZXIgdGhlIGNoZWNrcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBiZWZvcmUgdGhlIHBhdGNoIHdhcyB2dWxuZXJhYmxlIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLgoKVGhlIHByb21wdCBub3cgcmVhZHM6ICYjMzQ7U2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcyB0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLiYjMzQ7CgpTaW5jZSBpdCYjMzk7cyBmaXhpbmcgdGhlIHJlYWQtYmV5b25kLWBza2ItJmd0O2xlbmAgY2FzZSwgdGhpcyBzZWVtcyBsaWtlICpleGFjdGx5KiB0aGUga2luZCBvZiBzaXR1YXRpb24gS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBUaGUgcGF0Y2ggY2hhbmdlcyBob3cgd2UmIzM5O3JlIGFjY2Vzc2luZyB0aG9zZSB1bmluaXRpYWxpemVkIGJ5dGVzIGluIGFuIGBza2JgLCBieSBwcmV2ZW50aW5nIHRoZSBhY2Nlc3MhICBCdXQsIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoaXMgaXMgc29saWQsIGFuZCB0aGVyZSBjb3VsZCBiZSBsYXRlbnQgYnVncy4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoaXMgYXJlYSBvZiB0aGUgY29kZSBpcyBzb3VuZCwgS01TQU4gaXMgcHJvYmFibHkgdGhlIGFwcHJvcHJpYXRlIHRvb2wsIGFuZCBJIHNob3VsZCBydW4gYSBLTVNBTiBmdXp6ZXIgdG8gZ2l2ZSBpdCBhIGdvb2QgZ29pbmctb3Zlci4KClNvLCB0aGUgZmluYWwgY2FsbCBpczogZ2l2ZW4gdGhlIHBhdGNoICptb2RpZmllcyogdGhlIGJvdW5kcyBjaGVja3MsIGFuZCB0aG9zZSBjaGFuZ2VzIHByZXZlbnQgdGhlIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhIGJ1ZmZlciosIGFuZCBzaW5jZSBLTVNBTiBzcGVjaWZpY2FsbHkgaGVscHMgdXMgY2F0Y2ggcmVhZHMgYmV5b25kIGBza2ItJmd0O2xlbmAgdGhhdCBLQVNBTiBtaWdodCBtaXNzLCBJIG5lZWQgdG8gaW5jbHVkZSBgTmVlZHNLTVNBTj10cnVlYCB0byBwcm9wZXJseSB2ZXJpZnkgdGhhdCB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaXMgc291bmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21zZ19wZWVyX25ldF9oYXNoJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3RpcGMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzAtXHRoZHIgPSBidWZfbXNnKHNrYik7XG5uZXQvdGlwYy9kaXNjb3Zlci5jOjIzMTpcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG5uZXQvdGlwYy9kaXNjb3Zlci5jLTIzMi1cdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbi0tXG5uZXQvdGlwYy9tc2cuaD0xMTIzPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbi0tXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxubmV0L3RpcGMvbXNnLmg6MTEyODpzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTc1MgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1zZ19wZWVyX25ldF9oYXNoYCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG5ldC90aXBjL21zZy5oYCBhZ2Fpbiwgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBgbXNnX3BlZXJfbmV0X2hhc2hgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSBUSVBDJiMzOTtzIGhhbmRsaW5nIG9mIG5ldHdvcmsgcGVlciBpZGVudGlmaWVycyBhbmQgdGhlaXIgaGFzaGluZyBjb21lcyBpbnRvIHBsYXkuIEkgbmVlZCBhIHJlZnJlc2hlciBvbiB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIGhlcmUsIGFuZCBob3cgaXQgcmVsYXRlcyB0byB0aGUgYnJvYWRlciBjb25uZWN0aW9uIG1hbmFnZW1lbnQgaW4gdGhlIFRJUEMgYXJjaGl0ZWN0dXJlLiBJJiMzOTttIGFzc3VtaW5nIHRoYXQgdGhpcyBoYXNoIGZ1bmN0aW9uIHBsYXlzIGEgY3J1Y2lhbCByb2xlIGluIGVmZmljaWVudCBsb29rdXBzIGFuZCBwb3RlbnRpYWxseSBsb2FkIGJhbGFuY2luZyBmb3IgbmV0d29yayBtZXNzYWdlcy4gSSB3YW50IHRvIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsaWducyB3aXRoIGJlc3QgcHJhY3RpY2VzIGZyb20gYSBwZXJmb3JtYW5jZSBwZXJzcGVjdGl2ZS4gSSB3aWxsIGFsc28gbWFrZSBzdXJlIHRoYXQgc2VjdXJpdHkgaW1wbGljYXRpb25zIHdlcmUgYWRkcmVzc2VkIGR1cmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHN0cnVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXNnX3BlZXJfbmV0X2hhc2gmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaD0xMTIzPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbi0tXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxubmV0L3RpcGMvbXNnLmg6MTEyODpzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjEwMgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnZSBIZWFkZXIqKgoKT2theSwgbGV0JiMzOTtzIHplcm8gaW4gb24gYG5ldC90aXBjL21zZy5oYC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHZlcmlmeSBzb21lIGFzc3VtcHRpb25zIGFib3V0IHRoZSBtZXNzYWdlIGhlYWRlciBzdHJ1Y3R1cmUsIHNvIEkmIzM5O20gbmF2aWdhdGluZyBkb3duIHRvIGFyb3VuZCBsaW5lIDExMjguIEkga25vdyB0aGVyZSYjMzk7cyBrZXkgZGF0YSBhYm91dCBtZXNzYWdlIHR5cGVzLCBwcmlvcml0aWVzLCBhbmQgZGVsaXZlcnkgZmxhZ3MgZGVjbGFyZWQgaW4gdGhhdCB2aWNpbml0eS4gSSYjMzk7bSBwcm9iYWJseSBsb29raW5nIGZvciB0aGUgc3RydWN0IGRlZmluaXRpb24gdGhhdCBkZWZpbmVzIHRoZSBsYXlvdXQgb2YgdGhlIFRJUEMgbWVzc2FnZSBoZWFkZXIgaXRzZWxmLiBJIHdhbnQgdG8gcXVpY2tseSBjb25maXJtIHRoZSBmaWVsZHMgYW5kIHRoZWlyIGJpdHdpc2UgZW5jb2RpbmdzIGJlZm9yZSBJIGFuYWx5emUgdGhlIHJlbGF0ZWQgY29kZS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBkZXN0aW5hdGlvbiBub2RlIElELCBwb3J0IElELCBvciB0aGUgc2VydmljZSB0eXBlLCBhcyB3ZWxsIGFzIHRoZSBmbGFncyB0aGF0IGRldGVybWluZSByZXRyYW5zbWlzc2lvbiBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRyeWluZyB0byByZW1lbWJlciBpZiB0aGUgZmxhZ3MgZm9yIGZyYWdtZW50ZWQgbWVzc2FnZXMgYXJlIHBsYWNlZCBpbiB0aGUgaGVhZGVyLCBvciBzb21ld2hlcmUgZWxzZS4gSSYjMzk7bGwgZm9jdXMgb24gYW55dGhpbmcgcmVsYXRlZCB0byBzZXF1ZW5jZSBudW1iZXJzIG9yIGFja25vd2xlZGdlbWVudHMgYXQgdGhhdCBzcG90IGFzIHdlbGwuIFRpbWUgdG8gZ2V0IHRoZSBkZXRhaWxzIHJpZ2h0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTEyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTIwOlx0XG4xMTIxOlx0LyogV29yZCAxM1xuMTEyMjpcdCAqL1xuMTEyMzpcdHN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbjExMjQ6XHR7XG4xMTI1Olx0XHRtc2dfc2V0X3dvcmQobSwgMTMsIG4pO1xuMTEyNjpcdH1cbjExMjc6XHRcbjExMjg6XHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXG4xMTI5Olx0e1xuMTEzMDpcdFx0cmV0dXJuIG1zZ193b3JkKG0sIDEzKTtcbjExMzE6XHR9XG4xMTMyOlx0XG4xMTMzOlx0LyogV29yZCAxNFxuMTEzNDpcdCAqL1xuMTEzNTpcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19zdWdnX25vZGVfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0pXG4xMTM2Olx0e1xuMTEzNzpcdFx0cmV0dXJuIG1zZ193b3JkKG0sIDE0KTtcbjExMzg6XHR9XG4xMTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2NjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxNDIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyBEaXNjb3ZlcnkgTWVzc2FnZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyB0aGlzIFRJUEMgY29kZSBoYW5kbGVzIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlcy4gSSBzZWUgdGhhdCB2YXJpb3VzIGZpZWxkcyB3aXRoaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIGFyZSBiZWluZyBhY2Nlc3NlZCBhdCBzcGVjaWZpYyBvZmZzZXRzLiBGb3IgZXhhbXBsZSwgYG1zZ19wZWVyX25ldF9oYXNoYCBpcyByZWFkIGF0IG9mZnNldCA1MiBieXRlcywgYG1zZ19zdWdnX25vZGVfYWRkcmAgYXQgb2Zmc2V0IDU2LCBhbmQgc28gb24uCgpUaGUgcGF0Y2ggaW5jbHVkZXMgYSBzaXplIGNoZWNrOiBgaWYgKG1zZ19oZHJfc3ooaGRyKSAmbHQ7IE1BWF9IX1NJWkUgfHwgbXNnX3NpemUoaGRyKSAmbHQ7IE1BWF9IX1NJWkUgJiM0MzsgTk9ERV9JRF9MRU4pYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGlmIHRoZSBpbmNvbWluZyBwYWNrZXQgaXMgc21hbGxlciB0aGFuIGBNQVhfSF9TSVpFYCAobGlrZWx5IDYwIGJ5dGVzLCBvciAxNSB3b3JkcywgYmFzZWQgb24gbXkgdW5kZXJzdGFuZGluZyksIHRoZW4gcmVhZGluZyBhdCB0aGUgb2Zmc2V0cyBsaWtlIDUyIG9yIDU2IHdvdWxkIGxlYWQgdG8gYW4gb3V0LW9mLWJvdW5kcyByZWFkLCByaWdodD8KCkJ1dCB0aGVuIEkgcmVhbGl6ZSBpdCYjMzk7cyBtb3JlIHN1YnRsZS4gSWYgdGhlIHBhY2tldCBpcyBmcm9tIHRoZSBuZXR3b3JrLCB0aGUgYHNrYmAgaXMgYWxsb2NhdGVkIGJ5IHRoZSBuZXR3b3JrIGRyaXZlciwgcHJvYmFibHkgd2l0aCBlbm91Z2ggc3BhY2UgZm9yIGFuIE1UVSBvciBhIHBhZ2UuIFRoZSBkcml2ZXIgZmlsbHMgdGhlIGJ1ZmZlciB3aXRoIHRoZSByZWNlaXZlZCBkYXRhIGFuZCBzZXRzIGBza2ItJmd0O2xlbmAgdG8gdGhlIGFjdHVhbCBwYWNrZXQgc2l6ZS4gU28sIGlmIHRoZSBwYWNrZXQgaXMsIHNheSwgMjAgYnl0ZXMsIHRoZSBidWZmZXIgbWlnaHQgYmUgMTUwMCBieXRlcyBsb25nLCBidXQgb25seSB0aGUgZmlyc3QgMjAgYXJlIGluaXRpYWxpemVkLiBUaGUgYnl0ZXMgZnJvbSAyMCB0byAxNTAwIHdpbGwgY29udGFpbiBnYXJiYWdlIG9yIG9sZCBkYXRhLgoKTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkPyBSZWd1bGFyIEtBU0FOIHdpbGwgbm90IGRldGVjdCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgYmVjYXVzZSB0aGUgcmVhZCBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtBU0FOIG9ubHkgY2hlY2tzIHRoYXQgdGhlIGFjY2VzcyBpcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IGttYWxsb2Mva2ZyZWUvZXRjLiBIb3dldmVyLCBLTVNBTiwgd2hpY2ggdHJhY2tzIGluaXRpYWxpemF0aW9uIHN0YXR1cywgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyB0eXBlIG9mIGJ1Zy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgaG9va3MgaW50byBza2IgdG8gbWFyayB0aGUgYnl0ZXMgcGFzdCBgc2tiLSZndDtsZW5gIGFzIHVuaW5pdGlhbGl6ZWQuCgpUaGVuIHRoZSBrZXkgdGhpbmcsIHRoaXMgc2l0dWF0aW9uIGlzIGV4YWN0bHkgd2hhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaDogdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIG5ldHdvcmsgcHJvdG9jb2wgcGFyc2luZyEgVGhlIHBhdGNoIG1vZGlmaWVzIGJvdW5kcyBjaGVja3MuIEFuZCB0aGlzIHBhdGNoIGZhbGxzIHVuZGVyIHRoZSBjYXRlZ29yeSBvZiBwb3RlbnRpYWwgS01TQU4gdHJpZ2dlcnM7IGl0JiMzOTtzIHJlbGF0ZWQgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHByZXZlbnQgcmVhZGluZyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGFuIHNrYi4gS01TQU4gaXMgbmVlZGVkLCBldmVuIGlmIHRoZSBwYXRjaCAqZml4ZXMqIHRoZSBidWcsIHdlIHN0aWxsIHdhbnQgdG8gcnVuIEtNU0FOIHRvIHZlcmlmeSB0aGUgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgcGF0aHMgYWxsb3cgdW5pbml0aWFsaXplZCByZWFkcyEgU28sIHllcywgd2Ugc2hvdWxkIGRlZmluaXRlbHkgdXNlIEtNU0FOIGhlcmUuCgpMZXQmIzM5O3MgdmVyaWZ5IHRoaXMsIEkga25vdyB0aGF0IGlmIGFuIHNrYiBidWZmZXIgaXMgYWxsb2NhdGVkIHdpdGgga21hbGxvYygyNTYpIGFuZCB0aGUgcGFja2V0IGlzIG9ubHkgMjAgYnl0ZXMsIEtBU0FOIHdvbiYjMzk7dCBjb21wbGFpbiBiZWNhdXNlIGFjY2Vzc2luZyBtZW1vcnkgdXAgdG8gMjU2IGJ5dGVzIGlzIGxlZ2FsLCBldmVuIGlmIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiB3b3VsZCByYWlzZSBhbiBlcnJvciBiZWNhdXNlIGl0IGtub3dzIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiBpcyBkZWZpbml0ZWx5IHRoZSB0b29sIGZvciB0aGlzIGtpbmQgb2YgYnVnLgoKSSBzaG91bGQgYWxzbyBjb25zaWRlciBmcmFnbWVudGF0aW9uLiBJZiBhIHBhY2tldCBpcyBmcmFnbWVudGVkLCB0aGUgYHNrYi0mZ3Q7ZGF0YWAgbWlnaHQgb25seSBjb250YWluIHBhcnQgb2YgdGhlIGRhdGEsIHdpdGggdGhlIHJlc3QgaW4gYHNrYl9zaGluZm8oc2tiKS0mZ3Q7ZnJhZ3NgLiBSZWFkaW5nIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAgd291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgdGFpbHJvb20uIEdvb2QgdGhpbmcgdGhlIHBhdGNoIGluY2x1ZGVzIGBza2JfbGluZWFyaXplKHNrYilgISBJZiBpdCBsaW5lYXJpemVzLCBpdCBjb3BpZXMgZXZlcnl0aGluZyBhbmQgYXZvaWRzIGZyYWdtZW50YXRpb24gaXNzdWVzLiBCdXQgZG9lcyB0aGlzIGd1YXJhbnRlZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkPyBXaGF0IGlmIGBza2ItJmd0O2xlbmAgaXMgc21hbGxlciB0aGFuIHRoZSByZXF1aXJlZCBzaXplPwoKTm93LCB0aGUgY2hlY2s6IGBtc2dfc2l6ZShoZHIpICZsdDsgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAgc2VlbXMgdG8gYmUgY2hlY2tpbmcgdGhlIHNpemUgZmllbGQgKmluIHRoZSBoZWFkZXIqLCBub3QgbmVjZXNzYXJpbHkgYHNrYi0mZ3Q7bGVuYC4gSSBuZWVkIHRvIGNvbmZpcm0gaG93IGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBhcmUgaW1wbGVtZW50ZWQuIElzIHRoYXQgYWN0dWFsbHkgY2hlY2tpbmcgdGhlIGhlYWRlciYjMzk7cyBkZWNsYXJlZCBzaXplIGFnYWluc3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXI/IElmIG5vdCwgdGhlIGNoZWNrIGlzIHVzZWxlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21zZ19oZHJfc3omIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGlwYy9tc2cuaD0yNTI9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdXNlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxuLS1cbm5ldC90aXBjL21zZy5oLTI1Ni1cbm5ldC90aXBjL21zZy5oOjI1NzpzdGF0aWMgaW5saW5lIHUzMiBtc2dfaGRyX3N6KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTI1OC17XG4tLVxubmV0L3RpcGMvbXNnLmg9Mjc3PXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19kYXRhX3N6KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTI3OC17XG5uZXQvdGlwYy9tc2cuaDoyNzk6XHRyZXR1cm4gbXNnX3NpemUobSkgLSBtc2dfaGRyX3N6KG0pO1xubmV0L3RpcGMvbXNnLmgtMjgwLX1cbi0tXG5uZXQvdGlwYy9tc2cuaD0zNjc9c3RhdGljIGlubGluZSB1bmNoYXIgKm1zZ19kYXRhKHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTM2OC17XG5uZXQvdGlwYy9tc2cuaDozNjk6XHRyZXR1cm4gKCh1bmNoYXIgKiltKSAmIzQzOyBtc2dfaGRyX3N6KG0pO1xubmV0L3RpcGMvbXNnLmgtMzcwLX1cbi0tXG5uZXQvdGlwYy9tc2cuaD02MTk9c3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSlcbm5ldC90aXBjL21zZy5oLTYyMC17XG5uZXQvdGlwYy9tc2cuaDo2MjE6XHRyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSBTSE9SVF9IX1NJWkU7XG5uZXQvdGlwYy9tc2cuaC02MjItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5Mzc1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRlY29kaW5nIE1lc3NhZ2UgSGVhZGVyczogQSBRdWljayBBc3Nlc3NtZW50KioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBncmFiYmluZyB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIHVwZnJvbnQuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0d28ga2V5IHBpZWNlcyBvZiBkYXRhOiBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAuIFRoZXNlIGFyZSB0aGUgZm91bmRhdGlvbmFsIGVsZW1lbnRzLCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG15IGFuYWx5c2lzLiBgbXNnX2hkcl9zemAgdGVsbHMgbWUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpdHNlbGYg4oCTIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG1ldGFkYXRhIGFuZCBjb250cm9sIGluZm9ybWF0aW9uIHBhY2tlZCB3aXRoaW4uIFRoZW4gdGhlcmUmIzM5O3MgYG1zZ19zaXplYCwgdGhlIG92ZXJhbGwgbWVzc2FnZSBzaXplLiBHZXR0aW5nIHRoZXNlIHR3byBpbW1lZGlhdGVseSBoZWxwcyBidWlsZCBhIG1lbnRhbCBtb2RlbCBvZiB0aGUgc3RydWN0dXJlLiBJIGNhbiBkZWR1Y2UgaG93IG11Y2ggZGF0YSBpcyBoZWFkZXIgdnMgcGF5bG9hZCBhbmQgdGhhdCB1bmRlcnN0YW5kaW5nIGlzIGVzc2VudGlhbCBiZWZvcmUgSSBldmVuIGdldCBpbnRvIGRldGFpbHMuIEkmIzM5O20gYnVpbGRpbmcgYSBmcmFtZSBvZiByZWZlcmVuY2UgZm9yIHRoZSBzdWJzZXF1ZW50IHBhcnNpbmcgYW5kIGludGVycHJldGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNTA6XHR9XG4gMjUxOlx0XG4gMjUyOlx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdXNlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxuIDI1MzpcdHtcbiAyNTQ6XHRcdG1zZ19zZXRfYml0cyhtLCAwLCAyNSwgMHhmLCBuKTtcbiAyNTU6XHR9XG4gMjU2Olx0XG4gMjU3Olx0c3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXG4gMjU4Olx0e1xuIDI1OTpcdFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIFx1MDAzY1x1MDAzYyAyO1xuIDI2MDpcdH1cbiAyNjE6XHRcbiAyNjI6XHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcbiAyNjM6XHR7XG4gMjY0Olx0XHRtc2dfc2V0X2JpdHMobSwgMCwgMjEsIDB4Ziwgblx1MDAzZVx1MDAzZTIpO1xuIDI2NTpcdH1cbiAyNjY6XHRcbiAyNjc6XHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0pXG4gMjY4Olx0e1xuIDI2OTpcdFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDAsIDB4MWZmZmYpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTM3CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzoKCioqQW5hbHl6aW5nIFBvdGVudGlhbCBQYWNrZXQgVnVsbmVyYWJpbGl0eSoqCgpSaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkga2V5aW5nIGluIG9uIHRoZXNlIHZhcmlhYmxlcyDigJMgYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgLiBUaGV5JiMzOTtyZSBiZWluZyBwdWxsZWQgcmlnaHQgZnJvbSB0aGUgcGFja2V0IGl0c2VsZiwgc3BlY2lmaWNhbGx5IGZyb20gd29yZCAwLiBDbGFzc2ljIGNhc2Ugb2YgdHJ1c3RpbmcgdGhlIGRhdGEsIGh1aD8gTXkgZ3V0IHJlYWN0aW9uIGlzIGFsd2F5cyB0byB0aGluayBhYm91dCBwb3RlbnRpYWwgZXhwbG9pdHMuCgpBbmQgKmJvb20qLCB0aGVyZSBpdCBpcy4gSWYgdGhlIHBhY2tldCYjMzk7cyBhY3R1YWxseSBzbWFsbGVyIHRoYW4gZm91ciBieXRlcywgcmVhZGluZyB0aGF0IGZpcnN0IHdvcmQgaXMgZ29pbmcgdG8gYmUgYSBkaXNhc3Rlci4gRWl0aGVyIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgb3IsIGV2ZW4gd29yc2UsIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQmIzM5O3MgYSBodWdlIHJlZCBmbGFnIOKAkyBhIHBlcmZlY3QgdmVjdG9yIGZvciBpbmplY3Rpb24gaWYgd2UmIzM5O3JlIG5vdCBjYXJlZnVsLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHdoZXJlIGlzIGB0aXBjX2Rpc2NfcmN2YCBiZWluZyBjYWxsZWQgZnJvbT8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSB0aGF0IGZ1bmN0aW9uIGFuZCBzZWUgd2hlcmUgdGhpcyBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZGF0YSBpcyBvcmlnaW5hdGluZy4gSXMgaXQgY29taW5nIGZyb20gYSB0cnVzdGVkIHNvdXJjZSwgb3IgaXMgaXQgZXhwb3NlZCB0byB1bnRydXN0ZWQgaW5wdXQ/IEkgbmVlZCB0byBnZXQgdG8gdGhlIHJvb3Qgb2YgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBleHRlbnQgb2YgdGhlIHBvc3NpYmxlIHZ1bG5lcmFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RpcGNfZGlzY19yY3YmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYz0xNDE9c3RhdGljIGJvb2wgdGlwY19kaXNjX2FkZHJfdHJpYWxfbXNnKHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjE4ODogKiB0aXBjX2Rpc2NfcmN2IC0gaGFuZGxlIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlIChyZXF1ZXN0IG9yIHJlc3BvbnNlKVxubmV0L3RpcGMvZGlzY292ZXIuYy0xODktICogQG5ldDogYXBwbGljYWJsZSBuZXQgbmFtZXNwYWNlXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTItICovXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjE5Mzp2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXHRcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbi0tXG5uZXQvdGlwYy9kaXNjb3Zlci5oPTQ3PXZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKnJlcSk7XG5uZXQvdGlwYy9kaXNjb3Zlci5oOjQ4OnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpidWYsXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVx0XHQgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTtcbi0tXG5uZXQvdGlwYy9ub2RlLmM9MjA4Mz12b2lkIHRpcGNfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxuLS1cbm5ldC90aXBjL25vZGUuYy0yMTI1LVx0XHRpZiAodW5saWtlbHkodXNyID09IExJTktfQ09ORklHKSlcbm5ldC90aXBjL25vZGUuYzoyMTI2Olx0XHRcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcbm5ldC90aXBjL25vZGUuYy0yMTI3LVx0XHRlbHNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNzAzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYmFzZWQgb24geW91ciBwcm9tcHQ6CgoqKkRpdmluZyBpbnRvIFRJUEMgUmVjZWl2ZXIgTG9naWMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBgdGlwY19yY3ZgIGZ1bmN0aW9uLCBmb3VuZCBpbiBgbmV0L3RpcGMvbm9kZS5jYC4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgY29yZSBwYWNrZXQgcmVjZXB0aW9uIGxvZ2ljIGZvciBUSVBDIHJlc2lkZXMsIHJpZ2h0PyBJIHdhbnQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBtZXNzYWdlcyBhY3R1YWxseSBoaXQgdGhlIHN5c3RlbSwgaG93IHRoZXkmIzM5O3JlIHJvdXRlZCB3aXRoaW4gdGhlIG5vZGUsIGFuZCB3aGF0IHRoZSBmbG93IGNvbnRyb2wgbG9va3MgbGlrZSBhdCB0aGF0IGxldmVsLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGluIHRoYXQgcm91dGluZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgYXJlYXMgZm9yIG9wdGltaXphdGlvbiwgb3IgbWF5YmUgc29tZXRoaW5nIEkgbWlzc2VkIGxhc3QgdGltZSBJIGxvb2tlZC4gSSBleHBlY3QgdGhlIHVzdWFsIHN1c3BlY3RzIOKAkyBwYWNrZXQgaGVhZGVyIHBhcnNpbmcsIGFkZHJlc3MgbG9va3VwLCBidWZmZXIgbWFuYWdlbWVudCwgYW5kIHRoZSBmb3J3YXJkaW5nIHByb2Nlc3Mg4oCTIGJ1dCBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBmaW5lciBkZXRhaWxzIHRoaXMgdGltZS4gUGVyaGFwcyBJJiMzOTtsbCBmb2N1cyBvbiBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGVkIHBhY2tldHMgYW5kIGNvbm5lY3Rpb24gc3RhdGUsIGFuZCB3aGV0aGVyIGl0JiMzOTtzIHRoZSByaWdodCBwbGFjZSBmb3IgaW5zcGVjdGluZyByZWNlbnQgaXNzdWVzIEkmIzM5O3ZlIHJlYWQgYWJvdXQsIGluIHRoZSBtYWlsaW5nIGxpc3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvbm9kZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjA4MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDgzOlx0dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcbjIwODQ6XHR7XG4yMDg1Olx0XHRzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHhtaXRxO1xuMjA4NjpcdFx0c3RydWN0IHRpcGNfbGlua19lbnRyeSAqbGU7XG4yMDg3Olx0XHRzdHJ1Y3QgdGlwY19tc2cgKmhkcjtcbjIwODg6XHRcdHN0cnVjdCB0aXBjX25vZGUgKm47XG4yMDg5Olx0XHRpbnQgYmVhcmVyX2lkID0gYi1cdTAwM2VpZGVudGl0eTtcbjIwOTA6XHRcdHUzMiBzZWxmID0gdGlwY19vd25fYWRkcihuZXQpO1xuMjA5MTpcdFx0aW50IHVzciwgcmMgPSAwO1xuMjA5MjpcdFx0dTE2IGJjX2FjaztcbjIwOTM6XHQjaWZkZWYgQ09ORklHX1RJUENfQ1JZUFRPXG4yMDk0Olx0XHRzdHJ1Y3QgdGlwY19laGRyICplaGRyO1xuMjA5NTpcdFxuMjA5NjpcdFx0LyogQ2hlY2sgaWYgbWVzc2FnZSBtdXN0IGJlIGRlY3J5cHRlZCBmaXJzdCAqL1xuMjA5NzpcdFx0aWYgKFRJUENfU0tCX0NCKHNrYiktXHUwMDNlZGVjcnlwdGVkIHx8ICF0aXBjX2VoZHJfdmFsaWRhdGUoc2tiKSlcbjIwOTg6XHRcdFx0Z290byByY3Y7XG4yMDk5Olx0XG4yMTAwOlx0XHRlaGRyID0gKHN0cnVjdCB0aXBjX2VoZHIgKilza2ItXHUwMDNlZGF0YTtcbjIxMDE6XHRcdGlmIChsaWtlbHkoZWhkci1cdTAwM2V1c2VyICE9IExJTktfQ09ORklHKSkge1xuMjEwMjpcdFx0XHRuID0gdGlwY19ub2RlX2ZpbmQobmV0LCBudG9obChlaGRyLVx1MDAzZWFkZHIpKTtcbjIxMDM6XHRcdFx0aWYgKHVubGlrZWx5KCFuKSlcbjIxMDQ6XHRcdFx0XHRnb3RvIGRpc2NhcmQ7XG4yMTA1Olx0XHR9IGVsc2Uge1xuMjEwNjpcdFx0XHRuID0gdGlwY19ub2RlX2ZpbmRfYnlfaWQobmV0LCBlaGRyLVx1MDAzZWlkKTtcbjIxMDc6XHRcdH1cbjIxMDg6XHRcdHNrYl9kc3RfZm9yY2Uoc2tiKTtcbjIxMDk6XHRcdHRpcGNfY3J5cHRvX3JjdihuZXQsIChuKSA/IG4tXHUwMDNlY3J5cHRvX3J4IDogTlVMTCwgXHUwMDI2c2tiLCBiKTtcbjIxMTA6XHRcdGlmICghc2tiKVxuMjExMTpcdFx0XHRyZXR1cm47XG4yMTEyOlx0XG4yMTEzOlx0cmN2OlxuMjExNDpcdCNlbmRpZlxuMjExNTpcdFx0LyogRW5zdXJlIG1lc3NhZ2UgaXMgd2VsbC1mb3JtZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBoZWFkZXIgKi9cbjIxMTY6XHRcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXHUwMDI2c2tiKSkpXG4yMTE3Olx0XHRcdGdvdG8gZGlzY2FyZDtcbjIxMTg6XHRcdF9fc2tiX3F1ZXVlX2hlYWRfaW5pdChcdTAwMjZ4bWl0cSk7XG4yMTE5Olx0XHRoZHIgPSBidWZfbXNnKHNrYik7XG4yMTIwOlx0XHR1c3IgPSBtc2dfdXNlcihoZHIpO1xuMjEyMTpcdFx0YmNfYWNrID0gbXNnX2JjYXN0X2FjayhoZHIpO1xuMjEyMjpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTY1NwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIFRpbWluZyBvZiBUSVBDIE1lc3NhZ2UgVmFsaWRhdGlvbioqCgpSaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIHRoYXQganVtcHMgb3V0IGlzIHRoYXQgYHRpcGNfbXNnX3ZhbGlkYXRlKCZhbXA7c2tiKWAgaXMgaW52b2tlZCAqYmVmb3JlKiBgdGlwY19kaXNjX3JjdmAuIFRoaXMgb3JkZXJpbmcgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMgZGVzaWduZWQgdGhpcyB3YXkuIExldCYjMzk7cyBkZWx2ZSBpbnRvIHdoYXQgZXhhY3RseSBgdGlwY19tc2dfdmFsaWRhdGVgIGlzIGRvaW5nLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRvIGxvb2sgaW50byBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gbWVzc2FnZSB2YWxpZGF0aW9uLCBhbmQgZnVydGhlciBtZXNzYWdlIHByb2Nlc3NpbmcgaW4gdGhlIGRpc2MgcmVjZWl2ZSBmdW5jdGlvbi4gSXTigJlzIGxpa2VseSBlbnN1cmluZyBzb21lIGJhc2ljIHNhbml0eSBjaGVja3Mgb24gdGhlIGluY29taW5nIFNLQi4gVGhpbmdzIGxpa2UgaGVhZGVyIGludGVncml0eSwgbWVzc2FnZSBsZW5ndGgsIG1heWJlIGV2ZW4gc29tZSBwcmVsaW1pbmFyeSBhZGRyZXNzIHZlcmlmaWNhdGlvbiBiZWZvcmUgd2UgZ28gYW55IGZ1cnRoZXIuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgZGVmZW5zaXZlIHByb2dyYW1taW5nIHByYWN0aWNlLCBhIGZpcnN0IGxpbmUgb2YgZGVmZW5zZSBhZ2FpbnN0IGNvcnJ1cHRlZCBvciBtYWxpY2lvdXMgcGFja2V0cy4gSSYjMzk7bGwgZm9jdXMgb24gd2hhdCBhc3BlY3RzIG9mIHRoZSBtZXNzYWdlIGFyZSB2YWxpZGF0ZWQgaGVyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXRoZXIgYW55IHN0YXRlIGlzIG1vZGlmaWVkIGF0IHRoZSB2YWxpZGF0aW9uIHN0YWdlLCBvciBpZiBpdCBpcyBwdXJlbHkgYSBjaGVjay4gSSBob3BlIGl0JiMzOTtzIG5vdCByZXNvdXJjZSBpbnRlbnNpdmUsIHdlIHdvdWxkbiYjMzk7dCB3YW50IHRvIHNsb3cgZG93biBub3JtYWwgY29tbXVuaWNhdGlvbiwgYW5kIGl0IG5lZWRzIHRvIGJlIGVmZmljaWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGlwY19tc2dfdmFsaWRhdGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvY3J5cHRvLmM9MTg4OD1zdGF0aWMgdm9pZCB0aXBjX2NyeXB0b19yY3ZfY29tcGxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19hZWFkICphZWFkLFxuLS1cbm5ldC90aXBjL2NyeXB0by5jLTE5NjYtXHQvKiBWYWxpZGF0ZSBUSVBDdjIgbWVzc2FnZSAqL1xubmV0L3RpcGMvY3J5cHRvLmM6MTk2NzpcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoc2tiKSkpIHtcbm5ldC90aXBjL2NyeXB0by5jLTE5NjgtXHRcdHByX2Vycl9yYXRlbGltaXRlZChcJiMzNDtQYWNrZXQgZHJvcHBlZCBhZnRlciBkZWNyeXB0aW9uIVxcblwmIzM0Oyk7XG4tLVxubmV0L3RpcGMvY3J5cHRvLmMtMTk3NC1cbm5ldC90aXBjL2NyeXB0by5jOjE5NzU6XHQvKiBSZS1mZXRjaCBza2IgY2IgYXMgc2tiIG1pZ2h0IGJlIGNoYW5nZWQgaW4gdGlwY19tc2dfdmFsaWRhdGUgKi9cbm5ldC90aXBjL2NyeXB0by5jLTE5NzYtXHRza2JfY2IgPSBUSVBDX1NLQl9DQigqc2tiKTtcbi0tXG5uZXQvdGlwYy9tc2cuYz0xMjQ9aW50IHRpcGNfYnVmX2FwcGVuZChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWRidWYsIHN0cnVjdCBza19idWZmICoqYnVmKVxuLS1cbm5ldC90aXBjL21zZy5jLTE3OS1cdFx0VElQQ19TS0JfQ0IoaGVhZCktXHUwMDNldmFsaWRhdGVkID0gMDtcbm5ldC90aXBjL21zZy5jOjE4MDpcdFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcdTAwMjZoZWFkKSkpXG5uZXQvdGlwYy9tc2cuYy0xODEtXHRcdFx0Z290byBlcnI7XG4tLVxubmV0L3RpcGMvbXNnLmM9MjA1PWludCB0aXBjX21zZ19hcHBlbmQoc3RydWN0IHRpcGNfbXNnICpfaGRyLCBzdHJ1Y3QgbXNnaGRyICptLCBpbnQgZGxlbixcbi0tXG5uZXQvdGlwYy9tc2cuYy0yNDQtXG5uZXQvdGlwYy9tc2cuYzoyNDU6LyogdGlwY19tc2dfdmFsaWRhdGUgLSB2YWxpZGF0ZSBiYXNpYyBmb3JtYXQgb2YgcmVjZWl2ZWQgbWVzc2FnZVxubmV0L3RpcGMvbXNnLmMtMjQ2LSAqXG4tLVxubmV0L3RpcGMvbXNnLmMtMjU1LSAqL1xubmV0L3RpcGMvbXNnLmM6MjU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKVxubmV0L3RpcGMvbXNnLmMtMjU3LXtcbi0tXG5uZXQvdGlwYy9tc2cuYz01ODE9Ym9vbCB0aXBjX21zZ19leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICoqaXNrYiwgaW50ICpwb3MpXG4tLVxubmV0L3RpcGMvbXNnLmMtNjA0LVx0c2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoKmlza2IsIGloZHIsIGltc3opO1xubmV0L3RpcGMvbXNnLmM6NjA1Olx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShpc2tiKSkpXG5uZXQvdGlwYy9tc2cuYy02MDYtXHRcdGdvdG8gbm9uZTtcbi0tXG5uZXQvdGlwYy9tc2cuaD0xMTU1PXN0cnVjdCBza19idWZmICp0aXBjX2J1Zl9hY3F1aXJlKHUzMiBzaXplLCBnZnBfdCBnZnApO1xubmV0L3RpcGMvbXNnLmg6MTE1Njpib29sIHRpcGNfbXNnX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICoqX3NrYik7XG5uZXQvdGlwYy9tc2cuaC0xMTU3LWJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcbi0tXG5uZXQvdGlwYy9ub2RlLmM9MjA4Mz12b2lkIHRpcGNfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxuLS1cbm5ldC90aXBjL25vZGUuYy0yMTE1LVx0LyogRW5zdXJlIG1lc3NhZ2UgaXMgd2VsbC1mb3JtZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBoZWFkZXIgKi9cbm5ldC90aXBjL25vZGUuYzoyMTE2Olx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcdTAwMjZza2IpKSlcbm5ldC90aXBjL25vZGUuYy0yMTE3LVx0XHRnb3RvIGRpc2NhcmQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyODYxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpbiBgbmV0L3RpcGMvbXNnLmNgOgoKKipEaXZpbmcgaW50byBgdGlwY19tc2dfdmFsaWRhdGVgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGlzIGB0aXBjX21zZ192YWxpZGF0ZWAgZnVuY3Rpb24uIFJpZ2h0IG9mZiB0aGUgYmF0LCBJIGtub3cgdGhpcyBpcyBnb2luZyB0byBiZSB0aGUgZ2F0ZWtlZXBlciBmb3IgVElQQyBtZXNzYWdlcywgbWFraW5nIHN1cmUgdGhleSYjMzk7cmUga29zaGVyIGJlZm9yZSB0aGUga2VybmVsIGV2ZW4gdGhpbmtzIGFib3V0IHByb2Nlc3NpbmcgdGhlbS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGEgc2VyaWVzIG9mIGNoZWNrcywgcHJvYmFibHkgc3RhcnRpbmcgd2l0aCBzb21lIGJhc2ljIHN0cnVjdHVyYWwgaW50ZWdyaXR5OiBtZXNzYWdlIGxlbmd0aCwgaGVhZGVyIGZpZWxkcywgYW5kIG1heWJlIHNvbWUgcXVpY2sgY2hlY2tzdW0gdmVyaWZpY2F0aW9ucyB0byB3ZWVkIG91dCBvYnZpb3VzIGNvcnJ1cHRpb24uCgpJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gY3JpdGVyaWEuIElzIGl0IGp1c3QgY2hlY2tpbmcgbGVuZ3RocyBhbmQgb2Zmc2V0cywgb3IgZG9lcyBpdCBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIG1lc3NhZ2UgdHlwZSB2YWxpZGF0aW9uLCBjaGVja2luZyBpZiBmaWVsZHMgYXJlIHdpdGhpbiBleHBlY3RlZCByYW5nZXMsIGFuZCBtYXliZSBldmVuIGNyb3NzLXJlZmVyZW5jaW5nIGFnYWluc3QgaW50ZXJuYWwgc3RhdGUgdGFibGVzIGlmIG5lY2Vzc2FyeT8gSSYjMzk7ZCBpbWFnaW5lIHRoZXJlJiMzOTtzIGEgZGVsaWNhdGUgYmFsYW5jZSBoZXJlLiBUb28gc3RyaW5nZW50LCBhbmQgeW91IHJpc2sgcmVqZWN0aW5nIGxlZ2l0aW1hdGUgbWVzc2FnZXMuIFRvbyBsYXgsIGFuZCB5b3Ugb3BlbiB0aGUgZG9vciB0byBhbGwgc29ydHMgb2Ygc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIGNyYXNoZXMuCgpJJiMzOTttIGFsc28gd29uZGVyaW5nIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVzLiBUSVBDIHN1cHBvcnRzIHZhcmlvdXMga2luZHMgb2YgbWVzc2FnZXMsIGZyb20gc2ltcGxlIGNvbm5lY3Rpb24gcmVxdWVzdHMgdG8gZGF0YSBwYWNrZXRzLiBJJiMzOTtkIGFudGljaXBhdGUgdGhlIHZhbGlkYXRpb24gbG9naWMgd2lsbCBicmFuY2ggaGVhdmlseSBkZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZSwgd2l0aCBtb3JlIGNvbXBsZXggY2hlY2tzIGZvciB0aGluZ3MgbGlrZSBzZXF1ZW5jZSBudW1iZXJzIG9yIGFja25vd2xlZGdtZW50IGZpZWxkcyBpbiByZWxpYWJsZSBjb21tdW5pY2F0aW9uIHNjZW5hcmlvcy4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZCB0aGUgZXJyb3IgcmVwb3J0aW5nLiBEb2VzIGl0IGp1c3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIG9yIGRvZXMgaXQgbG9nIHRoZSB2YWxpZGF0aW9uIGZhaWx1cmVzPyBIb3BlZnVsbHksIHRoZXJlIGFyZSBkZXRhaWxlZCBlcnJvciBjb2RlcyB0aGF0IGNhbiBoZWxwIHBpbnBvaW50IHRoZSBleGFjdCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uIEl0IHdvdWxkIGFsc28gYmUgZ29vZCB0byBzZWUgaG93IGl0IG1pZ2h0IHJlYWN0IHRvIHRyYW5zaWVudCBlcnJvcnMsIG1heWJlIHJldHJ5aW5nIGlmIGEgY2hlY2tzdW0gZmFpbHMgYSBjb3VwbGUgb2YgdGltZXMgYmVmb3JlIGRlY2xhcmluZyBkZWZlYXQuCgpGaW5hbGx5LCBJJiMzOTttIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1hbmNlLWNvbnNjaW91cy4gVGhpcyB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCBkYXRhIHBhdGggYW5kIHdpbGwgYmUgcG90ZW50aWFsbHkgY2FsbGVkIG1pbGxpb25zIG9mIHRpbWVzIHBlciBzZWNvbmQuIFNvLCBlZmZpY2llbnQgYWxnb3JpdGhtcyBhbmQgbWluaW1hbCBvdmVyaGVhZCBhcmUgY3J1Y2lhbC4gSSYjMzk7bGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBhbmQgdGhpbmtpbmcgYWJvdXQgaG93IEkgY291bGQgb3B0aW1pemUgdGhlbSBpZiBuZWNlc3NhcnkuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAyNDU6XHQvKiB0aXBjX21zZ192YWxpZGF0ZSAtIHZhbGlkYXRlIGJhc2ljIGZvcm1hdCBvZiByZWNlaXZlZCBtZXNzYWdlXG4gMjQ2Olx0ICpcbiAyNDc6XHQgKiBUaGlzIHJvdXRpbmUgZW5zdXJlcyBhIFRJUEMgbWVzc2FnZSBoYXMgYW4gYWNjZXB0YWJsZSBoZWFkZXIsIGFuZCBhdCBsZWFzdFxuIDI0ODpcdCAqIGFzIG11Y2ggZGF0YSBhcyB0aGUgaGVhZGVyIGluZGljYXRlcyBpdCBzaG91bGQuICBUaGUgcm91dGluZSBhbHNvIGVuc3VyZXNcbiAyNDk6XHQgKiB0aGF0IHRoZSBlbnRpcmUgbWVzc2FnZSBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBtYWluIGZyYWdtZW50IG9mIHRoZSBtZXNzYWdlXG4gMjUwOlx0ICogYnVmZmVyLCB0byBzaW1wbGlmeSBmdXR1cmUgYWNjZXNzIHRvIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcy5cbiAyNTE6XHQgKlxuIDI1MjpcdCAqIE5vdGU6IEhhdmluZyBleHRyYSBpbmZvIHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyIG9yIGRhdGEgYXJlYXMgaXMgT0suXG4gMjUzOlx0ICogVElQQyB3aWxsIGlnbm9yZSB0aGUgZXhjZXNzLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIG9wdGlvbmFsIGluZm9cbiAyNTQ6XHQgKiBpbnRyb2R1Y2VkIGJ5IGEgbGF0ZXIgcmVsZWFzZSBvZiB0aGUgcHJvdG9jb2wuXG4gMjU1Olx0ICovXG4gMjU2Olx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpXG4gMjU3Olx0e1xuIDI1ODpcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpfc2tiO1xuIDI1OTpcdFx0c3RydWN0IHRpcGNfbXNnICpoZHI7XG4gMjYwOlx0XHRpbnQgbXN6LCBoc3o7XG4gMjYxOlx0XG4gMjYyOlx0XHQvKiBFbnN1cmUgdGhhdCBmbG93IGNvbnRyb2wgcmF0aW8gY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqL1xuIDI2MzpcdFx0aWYgKHVubGlrZWx5KHNrYi1cdTAwM2V0cnVlc2l6ZSAvIGJ1Zl9yb3VuZHVwX2xlbihza2IpIFx1MDAzZT0gNCkpIHtcbiAyNjQ6XHRcdFx0c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgQlVGX0hFQURST09NLCAwLCBHRlBfQVRPTUlDKTtcbiAyNjU6XHRcdFx0aWYgKCFza2IpXG4gMjY2Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI2NzpcdFx0XHRrZnJlZV9za2IoKl9za2IpO1xuIDI2ODpcdFx0XHQqX3NrYiA9IHNrYjtcbiAyNjk6XHRcdH1cbiAyNzA6XHRcbiAyNzE6XHRcdGlmICh1bmxpa2VseShUSVBDX1NLQl9DQihza2IpLVx1MDAzZXZhbGlkYXRlZCkpXG4gMjcyOlx0XHRcdHJldHVybiB0cnVlO1xuIDI3MzpcdFxuIDI3NDpcdFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgTUlOX0hfU0laRSkpKVxuIDI3NTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMjc2Olx0XG4gMjc3Olx0XHRoc3ogPSBtc2dfaGRyX3N6KGJ1Zl9tc2coc2tiKSk7XG4gMjc4Olx0XHRpZiAodW5saWtlbHkoaHN6IFx1MDAzYyBNSU5fSF9TSVpFKSB8fCAoaHN6IFx1MDAzZSBNQVhfSF9TSVpFKSlcbiAyNzk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI4MDpcdFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaHN6KSkpXG4gMjgxOlx0XHRcdHJldHVybiBmYWxzZTtcbiAyODI6XHRcbiAyODM6XHRcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbiAyODQ6XHRcdGlmICh1bmxpa2VseShtc2dfdmVyc2lvbihoZHIpICE9IFRJUENfVkVSU0lPTikpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MDUyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMzYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVElQQyBNZXNzYWdlIFZhbGlkYXRpb24gYW5kIERpc2NvdmVyeSBSZWNlaXZlIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IGB0aXBjX21zZ192YWxpZGF0ZWAgc2VlbXMgdG8gYmUgZG9pbmcgc29tZSBiYXNpYyBjaGVja3MgdXNpbmcgYHBza2JfbWF5X3B1bGxgLiBTcGVjaWZpY2FsbHksIGl0IGVuc3VyZXMgdGhlIGBza2JgIChzb2NrZXQgYnVmZmVyKSBoYXMgYXQgbGVhc3QgYE1JTl9IX1NJWkVgICh3aGljaCBpcyAyNCBieXRlcykgYXZhaWxhYmxlLiBUaGVuLCBpdCBkZXRlcm1pbmVzIHRoZSBoZWFkZXIgc2l6ZSAoYGhzemApIHVzaW5nIGBtc2dfaGRyX3N6YCBhbmQgcmUtY2hlY2tzIHRoZSBgc2tiYCB1c2luZyBgcHNrYl9tYXlfcHVsbChza2IsIGhzeilgLiBTbyB0aGUgZnVuY3Rpb24gaXMgc2V0IHVwIHNvIGBza2ItJmd0O2xlbmAgc2hvdWxkIGJlIGF0IGxlYXN0IGBoc3pgLCBhbmQgdGhvc2UgYGhzemAgYnl0ZXMgYXJlIGRlZmluaXRlbHkgbGluZWFyIHdpdGhpbiB0aGUgYHNrYmAuCgpXYWl0IGEgbWludXRlLCBgTUlOX0hfU0laRWAgaXMgKm9ubHkqIDI0IGJ5dGVzLiBUaGF0JiMzOTtzIGEga2V5IG9ic2VydmF0aW9uLgoKTm93LCB0aGUgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBjb21lcyBpbnRvIHBsYXkuIEl0IGhhcyB0aGlzIGNoZWNrOgpgYGBjCglpZiAobXNnX2hkcl9zeihoZHIpICZsdDsgTUFYX0hfU0laRSB8fAoJICAgIG1zZ19zaXplKGhkcikgJmx0OyBNQVhfSF9TSVpFICYjNDM7IE5PREVfSURfTEVOKSB7CmBgYAphbmQgYE1BWF9IX1NJWkVgIGlzIDYwIGJ5dGVzLiBTbywgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpcyAqb25seSogbWFraW5nIHN1cmUgYGhzemAgYnl0ZXMgYXJlIGxpbmVhciBhbmQgYXZhaWxhYmxlLiBBbmQgaWYgYGhzemAgaXMsIHNheSwgMjQgYnl0ZXMsIHRoZSB2YWxpZGF0aW9uICpzdWNjZWVkcyouCgpIZXJlJiMzOTtzIHRoZSBwcm9ibGVtOiBgdGlwY19kaXNjX3JjdmAgaXMgdGhlbiBjYWxsZWQuIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcyB0cnlpbmcgdG8gcmVhZCBgbXNnX3BlZXJfbmV0X2hhc2goaGRyKWAgd2hpY2ggaXMgYXQgb2Zmc2V0IDUyICh3b3JkIDEzKS4gQnV0IHJlbWVtYmVyLCBgaHN6YCBjYW4gYmUgYXMgbG93IGFzIDI0IGJ5dGVzIQoKU28sIHRoZSBvcmlnaW5hbCBjb2RlIHJlYWRzIG9mZnNldCA1Miwgd2hpY2ggaXMgKmJleW9uZCogYGhzemAuIEl0JiMzOTtzIGNsZWFybHkgYSByZWFkIG91dCBvZiBib3VuZHMuIFRoaXMgaXMgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkhIEJ1dCB0aGUgcXVlc3Rpb24gaXM6IGlzIGl0IGFsc28gYmV5b25kIHRoZSBgc2tiLSZndDtsZW5gPyBUaGF0IEkgd2lsbCBuZWVkIHRvIGNoZWNrIHdpdGggZnVydGhlciBhbmFseXNpcyBvZiB0aGUgY29kZS4KCmB0aXBjX21zZ192YWxpZGF0ZWAgYWxzbyBjaGVja3M6CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvbXNnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMjg2Olx0XG4gMjg3Olx0XHRtc3ogPSBtc2dfc2l6ZShoZHIpO1xuIDI4ODpcdFx0aWYgKHVubGlrZWx5KG1zeiBcdTAwM2MgaHN6KSlcbiAyODk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI5MDpcdFx0aWYgKHVubGlrZWx5KChtc3ogLSBoc3opIFx1MDAzZSBUSVBDX01BWF9VU0VSX01TR19TSVpFKSlcbiAyOTE6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDI5MjpcdFx0aWYgKHVubGlrZWx5KHNrYi1cdTAwM2VsZW4gXHUwMDNjIG1zeikpXG4gMjkzOlx0XHRcdHJldHVybiBmYWxzZTtcbiAyOTQ6XHRcbiAyOTU6XHRcdFRJUENfU0tCX0NCKHNrYiktXHUwMDNldmFsaWRhdGVkID0gMTtcbiAyOTY6XHRcdHJldHVybiB0cnVlO1xuIDI5NzpcdH1cbiAyOTg6XHRcbiAyOTk6XHQvKipcbiAzMDA6XHQgKiB0aXBjX21zZ19mcmFnbWVudCAtIGJ1aWxkIGEgZnJhZ21lbnQgc2tiIGxpc3QgZm9yIFRJUEMgbWVzc2FnZVxuIDMwMTpcdCAqXG4gMzAyOlx0ICogQHNrYjogVElQQyBtZXNzYWdlIHNrYlxuIDMwMzpcdCAqIEBoZHI6IGludGVybmFsIG1zZyBoZWFkZXIgdG8gYmUgcHV0IG9uIHRoZSB0b3Agb2YgdGhlIGZyYWdtZW50c1xuIDMwNDpcdCAqIEBwa3RtYXg6IG1heCBzaXplIG9mIGEgZnJhZ21lbnQgaW5jbC4gdGhlIGhlYWRlclxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTIzMAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDQ0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyoqCgpPa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBgdGlwY19tc2dfdmFsaWRhdGVgIGlzIGNoZWNraW5nIGlmIGBza2ItJmd0O2xlbmAgaXMgbGVzcyB0aGFuIGBtc3pgLiAgU28sIGlmIHRoYXQgY2hlY2sgcGFzc2VzLCBgc2tiLSZndDtsZW5gIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYG1zemAuIE5vdywgaWYgYSBwYWNrZXQgY29tZXMgaW4gd2l0aCBhIGhlYWRlciBzaXplIChgaHN6YCkgb2YgMjQgYW5kIHRoZSBtaW5pbXVtIHNpemUgKGBtc3pgKSBpcyBhbHNvIDI0LCB0aGVuIGBza2ItJmd0O2xlbmAgY2FuIGJlIGV4YWN0bHkgMjQuICBUaGF0IHNldHMgdGhlIHN0YWdlLi4uCgpUaGVuLCBgdGlwY19kaXNjX3JjdmAgdHJpZXMgdG8gcmVhZCBkYXRhIGF0IGFuIG9mZnNldCBvZiA1Mi4gSG9sZCBvbi4uLiBpZiBgc2tiLSZndDtsZW5gIGlzICpvbmx5KiAyNCwgdHJ5aW5nIHRvIHJlYWQgYXQgb2Zmc2V0IDUyIGlzIGNsZWFybHkgb3V0LW9mLWJvdW5kcyEgIFdlJiMzOTtyZSByZWFkaW5nIHBhc3Qgd2hhdCB0aGUgbmV0d29yayBkcml2ZXIgYWN0dWFsbHkgaW5pdGlhbGl6ZWQgaW4gdGhlIFNLQi4gIFRoaXMgbWVhbnMgd2UgYXJlIGF0dGVtcHRpbmcgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeSwgb3IsIHBvdGVudGlhbGx5LCBvbGQgcGFja2V0IGRhdGEgc3RpbGwgaW4gdGhlIGJ1ZmZlci4KClRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgd29uJiMzOTt0IGNhdGNoIHRoaXMsIGFzIGxvbmcgYXMgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGxhcmdlciB0aGFuIDUyIGJ5dGVzICh3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlKS4gQSAyNTYtYnl0ZSBidWZmZXIgd291bGQgbm90IGJlIGNhdWdodCBieSBLQVNBTi4gIEhvd2V2ZXIsIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplcikgKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgaXQgZmxhZ3MgdGhlIGJ5dGVzIGJleW9uZCBgc2tiLSZndDtsZW5gIGFzIHVuaW5pdGlhbGl6ZWQuCgpXYWl0LCBpcyB0aGF0IHJpZ2h0PyBEb2VzIEtNU0FOIGFjdHVhbGx5IG1hcmsgdGhvc2UgYnl0ZXMgYmV5b25kIGBza2ItJmd0O2xlbmAgYXMgdW5pbml0aWFsaXplZD8gWWVzLCB0aGF0JiMzOTtzIHJpZ2h0LiBLTVNBTiBvbmx5IHVucG9pc29ucyB0aGUgZGF0YSBhY3R1YWxseSBjb3BpZWQgaW50byB0aGUgc2tiLCBsZWF2aW5nIHRoZSByZXN0IG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHBvaXNvbmVkLiBUaGVyZWZvcmUgdGhpcyBpcyBhIGNsYXNzaWMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB0aGF0IEtBU0FOIG1pc3NlcywgYnV0IEtNU0FOIGNhdGNoZXMuCgpIb2xkIG9uLCB0aGUgcGF0Y2ggSSYjMzk7bSBsb29raW5nIGF0IGFsc28gYWRkcyBgc2tiX2xpbmVhcml6ZShza2IpYC4gIFdoeT8gIEFoLCBJIHNlZS4gRXZlbiBpZiB0aGUgdG90YWwgbWVzc2FnZSBzaXplIChgbXNnX3NpemUoaGRyKWApIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgTUFYX0hfU0laRSAmIzQzOyBOT0RFX0lEX0xFTmAsIHRoZSBkYXRhIGFmdGVyIHRoZSBoZWFkZXIgY291bGQgYmUgZnJhZ21lbnRlZC4gYHRpcGNfbXNnX3ZhbGlkYXRlYCBvbmx5IGRvZXMgYSBgcHNrYl9tYXlfcHVsbChza2IsIGhzeilgLiBTbyBpZiBgaHN6YCBpcyA2MCwgaXQgKnB1bGxzKiA2MCBieXRlcy4gQnV0IHRoZSBjb2RlIGFsc28gcmVhZHMgYHBlZXJfaWRgIGF0IGBtc2dfbm9kZV9pZChoZHIpYC4gV2hlcmUgaXMgYG1zZ19ub2RlX2lkKGhkcilgIGxvY2F0ZWQ/IEkgbmVlZCB0byBsb29rIGludG8gdGhpcyBtb3JlIGRlZXBseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXNnX25vZGVfaWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYz0xOTM9dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI0MC1cdGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjI0MTpcdFx0bWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjQyLVx0ZWxzZVxuLS1cbm5ldC90aXBjL21zZy5oPTExNDU9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxuLS1cbm5ldC90aXBjL21zZy5oLTExNDktXG5uZXQvdGlwYy9tc2cuaDoxMTUwOnN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxubmV0L3RpcGMvbXNnLmgtMTE1MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDk4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnaW5nIFN0cnVjdHVyZXMqKgoKT2theSwgc28gSSBuZWVkIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGVsdmUgaW50byB0aGUgaW50cmljYWNpZXMgb2YgVElQQyBtZXNzYWdpbmcuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBJIHNob3VsZCBzdGFydCBieSB2ZXJpZnlpbmcgaG93IGBtc2dfbm9kZV9pZGAgaXMgZGVmaW5lZCBhbmQgdXNlZC4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgYG5ldC90aXBjL21zZy5oYCBoZWFkZXIgZmlsZS4gVGhhdCYjMzk7cyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgbm9kZSBJRHMgYXJlIGhhbmRsZWQgYXQgdGhlIG1lc3NhZ2UgbGV2ZWwsIHJpZ2h0PyBHb3R0YSBtYWtlIHN1cmUgbXkgYXNzdW1wdGlvbnMgYWJvdXQgaG93IHRoZXkmIzM5O3JlIHBhc3NlZCBhbmQgaW50ZXJwcmV0ZWQgYXJlIGNvcnJlY3QsIGJlZm9yZSBJIHN0YXJ0IHRyYWNpbmcgdGhpbmdzIGZ1cnRoZXIuIFRoaXMgaXMgZnVuZGFtZW50YWwgdG8gdW5kZXJzdGFuZGluZyBhbnkgcG90ZW50aWFsIGlzc3VlcyBJJiMzOTttIGxvb2tpbmcgYXQgd2l0aCBUSVBDIGNvbW11bmljYXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB0aGF0IGhlYWRlciByZXZlYWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90aXBjL21zZy5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTQ1Olx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxuMTE0NjpcdHtcbjExNDc6XHRcdG1lbWNweShtc2dfZGF0YShoZHIpLCBpZCwgMTYpO1xuMTE0ODpcdH1cbjExNDk6XHRcbjExNTA6XHRzdGF0aWMgaW5saW5lIHU4ICptc2dfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkcilcbjExNTE6XHR7XG4xMTUyOlx0XHRyZXR1cm4gKHU4ICopbXNnX2RhdGEoaGRyKTtcbjExNTM6XHR9XG4xMTU0Olx0XG4xMTU1Olx0c3RydWN0IHNrX2J1ZmYgKnRpcGNfYnVmX2FjcXVpcmUodTMyIHNpemUsIGdmcF90IGdmcCk7XG4xMTU2Olx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpO1xuMTE1NzpcdGJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcbjExNTg6XHR2b2lkIHRpcGNfc2tiX3JlamVjdChzdHJ1Y3QgbmV0ICpuZXQsIGludCBlcnIsIHN0cnVjdCBza19idWZmICpza2IsXG4xMTU5Olx0XHRcdCAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAxNAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE2MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgYSBQb3RlbnRpYWwgS01TQU4tRGV0ZWN0YWJsZSBWdWxuZXJhYmlsaXR5IGluIFRJUEMgTWVzc2FnZSBIYW5kbGluZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJdCBzZWVtcyB0aGF0IHdoZW4gVElQQyBtZXNzYWdlcyBhcmUgcHJvY2Vzc2VkLCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YCwgdGhlcmUmIzM5O3MgYSByaXNrIG9mIHJlYWRpbmcgYmV5b25kIHRoZSBpbnRlbmRlZCBoZWFkZXIgYW5kIHBheWxvYWQgYm91bmRhcmllcyBvZiB0aGUgYHNrYmAgKHNvY2tldCBidWZmZXIpLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB0aGUgZnVuY3Rpb24gYG1zZ19ub2RlX2lkYCByZXR1cm5zIGRhdGEgdGhhdCBsaWVzICphZnRlciogdGhlIGhlYWRlciwgYW5kIG15IGluc3RpbmN0IHRlbGxzIG1lIHRoYXQgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uIElmIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgb25seSBjaGVja2luZyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIChgaHN6YCksIHdlIGNvdWxkIGJlIGFjY2Vzc2luZyBkYXRhIGluIG5vbi1jb250aWd1b3VzIGZyYWdtZW50cywgdGhlIGluZmFtb3VzIGBza2Jfc2hpbmZvKHNrYiktJmd0O2ZyYWdzYC4KCk5vdywgaWYgYHRpcGNfZGlzY19yY3ZgIHRoZW4gdHJpZXMgdG8gYG1lbWNweWAgZnJvbSBgbXNnX25vZGVfaWRgLCBpdCB3aWxsIHJlYWQgZGF0YSB3aGljaCBpcyBiZXlvbmQgdGhlIGFsbG9jYXRlZCBsaW5lYXIgcGFydCAoYHNrYi0mZ3Q7ZGF0YSAmIzQzOyBza2JfaGVhZGxlbihza2IpYCkuIFRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIEtBU0FOICptaWdodCogY2F0Y2ggdGhpcyBpZiB0aGUgbGluZWFyIGJ1ZmZlciBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGhlYWRlciBkb2VzLiBIb3dldmVyLCBuZXR3b3JrIGRyaXZlcnMgdXN1YWxseSBhbGxvY2F0ZSBtb3JlIGJ1ZmZlciBzcGFjZSB0aGFuIGlzIHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlIGluaXRpYWwgaGVhZGVyLiBTYXksIGEgMjU2LWJ5dGUgYnVmZmVyLCBhbmQgYHNrYl9oZWFkbGVuYCBpcyBvbmx5IDYwIGJ5dGVzLiBUaGUgcmVhZCBvZiBgbXNnX25vZGVfaWRgIG1pZ2h0IHN0YXkgd2l0aGluIHRoZSBhbGxvY2F0ZWQgMjU2IGJ5dGVzLiBLQVNBTiB3b3VsZCBtaXNzIGl0LgoKVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBFdmVuIGlmIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGxpbmVhciBidWZmZXIsIGFueXRoaW5nICpiZXlvbmQqIGBza2JfaGVhZGxlbmAgaXMgdXN1YWxseSB1bmluaXRpYWxpemVkIG9yIGNvbnRhaW5zIHN0YWxlIGRhdGEuIEtNU0FOLCAqc3BlY2lmaWNhbGx5KiwgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcy4gQmVjYXVzZSB0aGUgbmV0d29yayBzdGFjayBleHBsaWNpdGx5IHBvaXNvbnMgdGhlIHRhaWxyb29tLiBTbywgYW55IHJlYWQgZnJvbSB0aGVyZSBzaG91bGQgYmUgZmxhZ2dlZCBhcyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuCgpUaGlzIHNjZW5hcmlvIGxlYWRzIHRvIGEgY2xlYXIgY2F0ZWdvcml6YXRpb24gb2YgYnVnczoKCjEuICBSZWFkaW5nIGhlYWRlciBmaWVsZHMgbGlrZSBgbXNnX3BlZXJfbmV0X2hhc2hgIHdoZW4gYGhzemAgaXMgc21hbGxlciB0aGFuIHRoZSBvZmZzZXQgb2YgdGhhdCBmaWVsZC4gVGhpcyByZXN1bHRzIGluIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gdGhlIGxpbmVhciBidWZmZXIuCjIuICBSZWFkaW5nIGBtc2dfbm9kZV9pZGAgKHBhcnQgb2YgdGhlIHBheWxvYWQpIHdoZW4gdGhlIGRhdGEgaXMgZnJhZ21lbnRlZCBhbmQgc2l0cyBiZXlvbmQgdGhlIGhlYWRlciBzaXplLiBUaGlzLCBhZ2FpbiwgcmVhZHMgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHN0YW5kYXJkIGJ1ZmZlciBhbGxvY2F0aW9uIHNpemVzIG1hc2sgdGhlc2UgcmVhZHMgZnJvbSBLQVNBTi4gQnV0IEtNU0FOLCB3aXRoIGl0cyB1bmluaXRpYWxpemVkIG1lbW9yeSB0cmFja2luZywgd2lsbCBjYXRjaCB0aGVtISBLTVNBTiBpcyB0aGUgKnBlcmZlY3QqIHRvb2wgaGVyZS4KCk5vdywgbGV0JiMzOTtzIGNvbnNpZGVyIHRoZSBpbmZvcm1hdGlvbiBsZWFrIGFzcGVjdC4gVGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyByZWFkIGludG8gbG9jYWwgdmFyaWFibGVzIGxpa2UgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHN1Z2dgLCBhbmQgYG10eXBgLiBUaGUgY29kZSB0aGVuIHVzZXMgdGhvc2UgdmFyaWFibGVzLCBhbmQgYSBtYWpvciBjb25jZXJuIGlzIGNvbmRpdGlvbmFsIGJyYW5jaGluZy4gRm9yIGluc3RhbmNlLCB0aGUgY29kZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CgoqICAgVGhlIGNvZGUgY29waWVzIGBtc2dfbm9kZV9pZGAgaWYgYGNhcHMgJmFtcDsgVElQQ19OT0RFX0lEMTI4YC4gSWYgYGNhcHNgIGlzIHVuaW5pdGlhbGl6ZWQsIHRoZSBicmFuY2ggaXMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgZGF0YSwgd2hpY2ggS01TQU4gY2F0Y2hlcyBwZXJmZWN0bHkuCiogICBBbm90aGVyIGV4YW1wbGUgb2YgYSBicmFuY2ggaXMgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWAuIElmIGBtdHlwYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiBpcyBjZXJ0YWluIHRvIGNhdGNoIHRoZSAmIzM0O3VzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlJiMzNDsgZHVyaW5nIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uCgpNeSByZWFzb25pbmcsIGluIHN1bW1hcnk6CgoxLiAgVGhlIHBhdGNoIGFkZHJlc3NlcyB1bnZhbGlkYXRlZCBhY2Nlc3MgdG8gZGF0YSBpbiB0aGUgYHNrYmAsIHBvdGVudGlhbGx5IHJlYWRpbmcgYmV5b25kIHdoYXQmIzM5O3MgdmFsaWQuCjIuICBUeXBpY2FsIG5ldHdvcmsgYnVmZmVyIGFsbG9jYXRpb25zICgyNTYgYnl0ZXMgYW5kIGxhcmdlcikgbWVhbiBLQVNBTiB3b24mIzM5O3QgZmxhZyB0aGVzZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgozLiAgUmVhZHMgZnJvbSB0aGUgYHNrYmAgdGFpbHJvb20gd2lsbCBhY2Nlc3MgdW5pbml0aWFsaXplZCBtZW1vcnkuCjQuICBLTVNBTiBpcyB0aGUgdG9vbCBvZiBjaG9pY2UgYmVjYXVzZSBvZiBpdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJhY2tpbmcuCjUuICBVbmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdXNlZCBpbiBicmFuY2hpbmcgbG9naWMuCjYuICBUaGVyZWZvcmUsIHRoaXMgaXMgYSBjbGVhciBLTVNBTiBjYXNlLgoKUmV2aWV3aW5nIHRoZSBwcm9tcHQgY3JpdGVyaWE6ClRoaXMgcGF0Y2ggYWRkcmVzc2VzIGJvdGggcG9pbnRzOgoKKiAgIEl0IGludHJvZHVjZXMgKG9yIG1vZGlmaWVzKSBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCiogICBJdCBpbnRyb2R1Y2VzIGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCgpJdCYjMzk7cyBhIHBlcmZlY3QgbWF0Y2guIEkmIzM5O20gY29uZmlkZW50IGluIHNldHRpbmcgYE5lZWRzS01TQU49dHJ1ZWAuIEl0IHNlZW1zIGB0aXBjX2Rpc2NfcmN2YCBtaWdodCBzZW5kIGEgcmVzcG9uc2UuIElmIHNvLCBpdCBtaWdodCBldmVuIGxlYWsgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJhY2sgdG8gdGhlIG5ldHdvcmsuIEFsdGhvdWdoLCBpdCBpcyBjZXJ0YWluIEtNU0FOIHdpbGwgY2F0Y2ggaXQgYmVjYXVzZSBpdCBob29rcyBpbiB0aGUgbmV0d29yayBzdGFjayB0byBwb2lzb24gdGhlIHRhaWxyb29tLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RpcGNfZGlzY19idWlsZF9tc2cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTY0MQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgdGhvdWdodCBwcm9jZXNzLiBMZXQmIzM5O3MgZ2V0IHRoaXMgZG9uZS4KKioqCioqSG93IERvZXMgVGhpcyBUaGluZyAqQWN0dWFsbHkqIFdvcms/KioKClJpZ2h0LCBzbyBJJiMzOTttIHJlYWRpbmcgdGhpcywgYW5kIGltbWVkaWF0ZWx5IHRoZSBxdWVzdGlvbiBoaXRzIG1lOiAqaG93KiBkb2VzIHRoaXMgc3lzdGVtIGdlbmVyYXRlIHRoZXNlIHJlc3BvbnNlcz8gSSBtZWFuLCBJIGNhbiBzZWUgdGhlIG91dHB1dCwgSSBjYW4gdW5kZXJzdGFuZCB0aGUgY29uY2VwdHMgaXQmIzM5O3MgcHJlc2VudGluZywgYnV0IHRoZSBmdW5kYW1lbnRhbCBtZWNoYW5pY3MuLi4gdGhhdCYjMzk7cyB3aGF0JiMzOTtzIHRydWx5IGZhc2NpbmF0aW5nLiBJdCYjMzk7cyBub3QgZW5vdWdoIHRvIHNpbXBseSBvYnNlcnZlIHRoZSByZXN1bHQ7IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1bmRlcmx5aW5nIGFyY2hpdGVjdHVyZSwgdGhlIGFsZ29yaXRobXMsIHRoZSAqcHJvY2Vzc2VzKiB0aGF0IGxlYWQgZnJvbSBpbnB1dCB0byBvdXRwdXQuIElzIGl0IHJ1bGUtYmFzZWQ/IElzIGl0IHN0YXRpc3RpY2FsPyBJcyBpdCBiYXNlZCBvbiBuZXVyYWwgbmV0d29ya3M/IFdoYXQmIzM5O3MgdGhlIG1vZGVsJiMzOTtzIHRyYWluaW5nIGRhdGEgbG9vayBsaWtlPyBJdCYjMzk7cyBhbGwgYWJvdXQgaG93IGl0IHRha2VzIGluIGluZm9ybWF0aW9uLCBwcm9jZXNzZXMgaXQsIGFuZCB0aGVuIGNyYWZ0cyBhbiBhbnN3ZXIuIFRoZSAmIzM0O2hvdyYjMzQ7IGlzIHRoZSBjb3JlIG9mIGV2ZXJ5dGhpbmcuIFVuZGVyc3RhbmRpbmcgdGhhdCB3b3VsZCB0cnVseSB1bmxvY2sgaXRzIHBvdGVudGlhbC4gSSB3YW50IHRvIGtub3cgdGhlIGdlYXJzIHR1cm5pbmcgYmVuZWF0aCB0aGUgc3VyZmFjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7RFNDX1JFUV9NU0cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdGlwYy9kaXNjb3Zlci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTcyLVx0XHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cdTAwM2Vza2IpLCB0bi1cdTAwM2V0cmlhbF9hZGRyKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTczOlx0XHRtc2dfc2V0X3R5cGUoYnVmX21zZyhkLVx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTc0LVx0fVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy0yNzUtXHRcdHJldHVybjtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6Mjc2Olx0aWYgKG10eXAgIT0gRFNDX1JFUV9NU0cpXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI3Ny1cdFx0cmV0dXJuO1xuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzEzPXN0YXRpYyB2b2lkIHRpcGNfZGlzY190aW1lb3V0KHN0cnVjdCB0aW1lcl9saXN0ICp0KVxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMzQ2LVx0XHRcdGQtXHUwMDNldGltZXJfaW50diA9IFRJUENfRElTQ19GQVNUO1xubmV0L3RpcGMvZGlzY292ZXIuYzozNDc6XHRcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXHUwMDNlc2tiKSwgRFNDX1JFUV9NU0cpO1xubmV0L3RpcGMvZGlzY292ZXIuYy0zNDgtXHRcdG1zZ19zZXRfcHJldm5vZGUoYnVmX21zZyhkLVx1MDAzZXNrYiksIHRuLVx1MDAzZXRyaWFsX2FkZHIpO1xuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzcwPWludCB0aXBjX2Rpc2NfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfYmVhcmVyICpiLFxuLS1cbm5ldC90aXBjL2Rpc2NvdmVyLmMtMzgzLVx0fVxubmV0L3RpcGMvZGlzY292ZXIuYzozODQ6XHR0aXBjX2Rpc2NfaW5pdF9tc2cobmV0LCBkLVx1MDAzZXNrYiwgRFNDX1JFUV9NU0csIGIpO1xubmV0L3RpcGMvZGlzY292ZXIuYy0zODUtXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYz00MjE9dm9pZCB0aXBjX2Rpc2NfcmVzZXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXG4tLVxubmV0L3RpcGMvZGlzY292ZXIuYy00MjctXHRzcGluX2xvY2tfYmgoXHUwMDI2ZC1cdTAwM2Vsb2NrKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmM6NDI4Olx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cdTAwM2Vza2IsIERTQ19SRVFfTVNHLCBiKTtcbm5ldC90aXBjL2Rpc2NvdmVyLmMtNDI5LVx0ZC1cdTAwM2VuZXQgPSBuZXQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNDk1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgdGlwY19kaXNjX3JjdmAgKGFyb3VuZCBMaW5lIDI3NSkqKgoKQWxyaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSwgYW5kIEkmIzM5O20gemVyb2luZyBpbiBvbiBgdGlwY19kaXNjX3JjdmAgbmVhciBsaW5lIDI3NS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhpcyBmdW5jdGlvbiYjMzk7cyBkb2luZy4gYHRpcGNfZGlzY19yY3ZgIOKAkyByaWdodCwgdGhpcyBpcyBsaWtlbHkgdGhlIGRpc2NvdmVyeSByZWNlaXZlIGhhbmRsZXIgZm9yIFRJUEMuIEkmIzM5O20gaW1tZWRpYXRlbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpc2NvdmVyeSBwcm9jZXNzIGlzIG1hbmFnZWQgYXQgdGhlIHRyYW5zcG9ydCBsYXllciwgZXNwZWNpYWxseSBpbiByZWdhcmRzIHRvIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCBoYW5kbGVzIGluY29taW5nIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgb3BlcmF0ZXMgb24gYW5kIGFueSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBpdCBlbXBsb3lzLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUgbG9naWMgZGVhbGluZyB3aXRoIGZpbHRlcmluZywgdmFsaWRhdGlvbiwgYW5kIHF1ZXVpbmcgb2YgdGhlc2UgZGlzY292ZXJ5IHBhY2tldHMsIGFuZCBJJiMzOTtsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGVycm9yIGhhbmRsaW5nIHRvIHNlZSBob3cgaXQgZ3JhY2VmdWxseSBtYW5hZ2VzIHVuZXhwZWN0ZWQgb3IgbWFsZm9ybWVkIG1lc3NhZ2VzLiBJJiMzOTtsbCBiZSBwYXJ0aWN1bGFybHkgd2F0Y2hmdWwgZm9yIGFueSBwb3RlbnRpYWwgZm9yIGRlYWRsb2NrcyBvciBsb2NrIGNvbnRlbnRpb24gd2l0aGluIHRoZSByZWNlaXZlIHBhdGguIEFuZCBvZiBjb3Vyc2UsIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgbGlrZSB0aGUgZGVzY3JpcHRvciBxdWV1ZXMgYW5kIHRoZSBuZXR3b3JrIGJ1ZmZlcnMsIGFuZCBJJiMzOTtsbCBiZSBjaGVja2luZyB0byBzZWUgaG93IGVmZmljaWVudGx5IHRoZXNlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZC4gRmluYWxseSwgSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgVElQQyBjb3JlIGFuZCB1c2VyLXNwYWNlIHByb2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIHdhaXRpbmcgb24gZGlzY292ZXJ5IHJlc3VsdHMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2suCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDE5OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3RpcGMvZGlzY292ZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjYwOlx0XG4gMjYxOlx0XHQvKiBNZXNzYWdlIGZyb20gc29tZWJvZHkgdXNpbmcgdGhpcyBub2RlJiMzOTtzIGFkZHJlc3MgKi9cbiAyNjI6XHRcdGlmIChpbl9vd25fbm9kZShuZXQsIHNyYykpIHtcbiAyNjM6XHRcdFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNlbGYsIFx1MDAyNm1hZGRyKTtcbiAyNjQ6XHRcdFx0cmV0dXJuO1xuIDI2NTpcdFx0fVxuIDI2NjpcdFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgZHN0LCBzZWxmKSlcbiAyNjc6XHRcdFx0cmV0dXJuO1xuIDI2ODpcdFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgYi1cdTAwM2Vkb21haW4sIHNyYykpXG4gMjY5Olx0XHRcdHJldHVybjtcbiAyNzA6XHRcdHRpcGNfbm9kZV9jaGVja19kZXN0KG5ldCwgc3JjLCBwZWVyX2lkLCBiLCBjYXBzLCBzaWduYXR1cmUsIHBuZXRfaGFzaCxcbiAyNzE6XHRcdFx0XHQgICAgIFx1MDAyNm1hZGRyLCBcdTAwMjZyZXNwb25kLCBcdTAwMjZkdXBsX2FkZHIpO1xuIDI3MjpcdFx0aWYgKGR1cGxfYWRkcilcbiAyNzM6XHRcdFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNyYywgXHUwMDI2bWFkZHIpO1xuIDI3NDpcdFx0aWYgKCFyZXNwb25kKVxuIDI3NTpcdFx0XHRyZXR1cm47XG4gMjc2Olx0XHRpZiAobXR5cCAhPSBEU0NfUkVRX01TRylcbiAyNzc6XHRcdFx0cmV0dXJuO1xuIDI3ODpcdFx0dGlwY19kaXNjX21zZ194bWl0KG5ldCwgRFNDX1JFU1BfTVNHLCBzcmMsIHNlbGYsIDAsIFx1MDAyNm1hZGRyLCBiKTtcbiAyNzk6XHR9XG4gMjgwOlx0XG4gMjgxOlx0LyogdGlwY19kaXNjX2FkZF9kZXN0IC0gaW5jcmVtZW50IHNldCBvZiBkaXNjb3ZlcmVkIG5vZGVzXG4gMjgyOlx0ICovXG4gMjgzOlx0dm9pZCB0aXBjX2Rpc2NfYWRkX2Rlc3Qoc3RydWN0IHRpcGNfZGlzY292ZXJlciAqZClcbiAyODQ6XHR7XG4gMjg1Olx0XHRzcGluX2xvY2tfYmgoXHUwMDI2ZC1cdTAwM2Vsb2NrKTtcbiAyODY6XHRcdGQtXHUwMDNlbnVtX25vZGVzJiM0MzsmIzQzOztcbiAyODc6XHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNmQtXHUwMDNlbG9jayk7XG4gMjg4Olx0fVxuIDI4OTpcdFxuIDI5MDpcdC8qIHRpcGNfZGlzY19yZW1vdmVfZGVzdCAtIGRlY3JlbWVudCBzZXQgb2YgZGlzY292ZXJlZCBub2Rlc1xuIDI5MTpcdCAqL1xuIDI5MjpcdHZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQpXG4gMjkzOlx0e1xuIDI5NDpcdFx0aW50IGludHYsIG51bTtcbiAyOTU6XHRcbiAyOTY6XHRcdHNwaW5fbG9ja19iaChcdTAwMjZkLVx1MDAzZWxvY2spO1xuIDI5NzpcdFx0ZC1cdTAwM2VudW1fbm9kZXMtLTtcbiAyOTg6XHRcdG51bSA9IGQtXHUwMDNlbnVtX25vZGVzO1xuIDI5OTpcdFx0aW50diA9IGQtXHUwMDNldGltZXJfaW50djtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMTk6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE0OTIKCQkJCQkJCW91dHB1dDogMzgxCgkJCQkJCQl0aG91Z2h0czogNDk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBUSVBDIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGZ1bmN0aW9uLCBhbmQgSSYjMzk7dmUgZm91bmQgc29tZXRoaW5nIGFsYXJtaW5nLiBJdCYjMzk7cyBnZXR0aW5nIGNhbGxlZCB3aXRoIGBwZWVyX2lkYCwgYGNhcHNgLCBgc2lnbmF0dXJlYCwgYW5kIGBwbmV0X2hhc2hgIOKAkyBhbGwgb2Ygd2hpY2ggYXJlICp1bmluaXRpYWxpemVkKiB2YWx1ZXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgYHNrYmAmIzM5O3MgdGFpbHJvb20uIE15IGd1dCBpcyBzY3JlYW1pbmcgdGhpcyBpcyBhIG1ham9yIHByb2JsZW0uCgpFc3NlbnRpYWxseSwgYHRpcGNfbm9kZV9jaGVja19kZXN0YCBpcyBiZWluZyBmZWQganVuayBkYXRhLCBhbmQgaXQmIzM5O3MgdXNpbmcgdGhpcyBnYXJiYWdlIHRvIHVwZGF0ZSB0aGUgbm9kZSYjMzk7cyBzdGF0ZS4gVGhhdCYjMzk7cyBhIHJlY2lwZSBmb3IgZGlzYXN0ZXI6IGludGVybmFsIHN0YXRlIGNvcnJ1cHRpb24sIHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcywgdGhlIHdvcmtzLiBUaGUgc291cmNlIG9mIHRoZSBpc3N1ZSBzZWVtcyB0byBiZSBpbiBgdGlwY19kaXNjX3JjdmAsIHdoZXJlIHRoZSBwYWNrZXQgZGF0YSBpcyBiZWluZyByZWFkIGJlZm9yZSB0aGUgcGFja2V0cyYjMzk7cyBpbnRlZ3JpdHkgb3Igc2l6ZSBhcmUgdmVyaWZpZWQgKGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBjaGVja3MpLCBvciBiZWZvcmUgaXQmIzM5O3MgZXZlbiBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLgoKVGhlIGtpY2tlciBpcywgdGhpcyAqd29uJiMzOTt0KiB0cmlnZ2VyIEtBU0FOLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCByZWFkaW5nIGZyb20gdGhlIHRhaWxyb29tIG9mIGEgc3RhbmRhcmQtc2l6ZWQgYHNrX2J1ZmZgIGJ1ZmZlciwgbWVhbmluZyB0aGUgcmVhZCB3aWxsIGxpa2VseSBiZSB3aXRoaW4gdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBLQVNBTiBpcyBtZWFudCB0byBmaW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBidXQgS01TQU4gaXMgZ29pbmcgdG8gYmUgbmVlZGVkIGhlcmUuIEtNU0FOIGlzIHRoZSByaWdodCB0b29sIGJlY2F1c2UgdGhlIHJlYWQgaXMgZ29pbmcgdG8gYmUgd2l0aGluIHRoZSBib3VuZHMsIGJ1dCBmcm9tICp1bmluaXRpYWxpemVkKiBtZW1vcnkuIFRoaXMgZGF0YSBpcyB0aGVuIGJlaW5nIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHNvIHRoaXMgaXMgcHJlY2lzZWx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBLTVNBTiB3aWxsIGhpZ2hsaWdodCB0aGUgdXNlIG9mIHRoZXNlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFuZCB0aGUgY29uc2VxdWVuY2VzIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoZW0uIFdlIGFic29sdXRlbHkgbmVlZCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiB0byBjb25maXJtIHRoaXMgZml4IGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGluc2lkaW91cyB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGx1cmtpbmcgaW4gVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4gKipOZWVkc0tNU0FOID0gdHJ1ZS4qKgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAxOTo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxuXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJiMzOTtzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcblxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTiYjMzk7cyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTM6NTcuNjY3MDIyMjI0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcwNDIxNjU3OTYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRJUENcIixcbiAgICBcIlRJUENfTUVESUFfVURQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGlwY19kaXNjX3JjdlwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYW4gaXNzdWUgaW4gYHRpcGNfZGlzY19yY3ZgIHdoZXJlIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2UgZmllbGRzIChzdWNoIGFzIGBwbmV0X2hhc2hgLCBgY2Fwc2AsIGBzaWduYXR1cmVgLCBhbmQgYHBlZXJfaWRgKSBhcmUgcmVhZCBmcm9tIHRoZSBgc2tfYnVmZmAgYmVmb3JlIHZlcmlmeWluZyB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgY29udGFpbnMgYSBmdWxsIGhlYWRlciBhbmQgcGF5bG9hZCAoYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgIGNoZWNrcykgYW5kIGJlZm9yZSBlbnN1cmluZyB0aGUgZGF0YSBpcyBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLiBcXG5cXG5XaGVuIGEgbWFsaWNpb3VzbHkgc21hbGwgb3IgZnJhZ21lbnRlZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIHJlYWRpbmcgdGhlc2UgZmllbGRzIGFjY2Vzc2VzIHRoZSB0YWlscm9vbSBvZiB0aGUgYHNrX2J1ZmZgIGRhdGEgYnVmZmVyLiBCZWNhdXNlIG5ldHdvcmsgZHJpdmVycyB0eXBpY2FsbHkgYWxsb2NhdGUgc3RhbmRhcmQtc2l6ZWQgY2h1bmtzIChlLmcuLCAyNTYsIDE1MDAsIG9yIDIwNDggYnl0ZXMpIGZvciBgc2tfYnVmZmAgZGF0YSwgdGhlc2UgcmVhZHMgd2lsbCBsaWtlbHkgZmFsbCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGhlYXAgY2h1bmsuIENvbnNlcXVlbnRseSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IHRoaXMgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxcblxcbkhvd2V2ZXIsIHRoZSB0YWlscm9vbSBieXRlcyBiZXlvbmQgYHNrYi1cXHUwMDNlbGVuYCBvciBgc2tiX2hlYWRsZW5gIGFyZSB1bmluaXRpYWxpemVkIG1lbW9yeSAoYW5kIGFyZSBleHBsaWNpdGx5IHBvaXNvbmVkIGJ5IEtNU0FOJ3MgbmV0d29yayBob29rcykuIFRoZSB1bmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdGhlbiB1c2VkIGluIGNvbmRpdGlvbmFsIGxvZ2ljIChlLmcuLCBgaWYgKGNhcHMgXFx1MDAyNiBUSVBDX05PREVfSUQxMjgpYCwgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWApIGFuZCBwYXNzZWQgdG8gYHRpcGNfbm9kZV9jaGVja19kZXN0KClgLCB3aGljaCBjb3VsZCBjb3JydXB0IGludGVybmFsIHN0YXRlIG9yIGxlYWQgdG8gaW5mby1sZWFrcy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBjb25kaXRpb25hbCBicmFuY2hlcyBkZXBlbmRpbmcgb24gdW5pbml0aWFsaXplZCB2YWx1ZXMsIG1ha2luZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaGlnaGx5IGp1c3RpZmllZCB0byB2ZXJpZnkgdGhpcyBmaXggYW5kIGVuc3VyZSBubyBvdGhlciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCBpbiB0aGUgVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IHRydWUsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcyBpbiBgdGlwY19kaXNjX3JjdmAgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIHJlYWRzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgVElQQyBwcm90b2NvbCBsb2dpYyB0aGF0IHByb2Nlc3NlcyBuZXR3b3JrIHBhY2tldHMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjUzOjU3LjY2NzAyNzQ2NFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM0MjEzODM2NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDQzMjRkNjc1ZDI1ZjIxMTJiMTk5ZDdhNDcxNjMxMWI3OTdlZjAyNDJcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcXG5pbmRleCA2ODUzODlkNGIyNDVlLi43NDY3M2NhMWYyZDUwIDEwMDY0NFxcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcXG4rKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jXFxuQEAgLTE5NSwyNyArMTk1LDQ3IEBAIHZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxuIHtcXG4gXFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XFxuIFxcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xcbi1cXHR1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4tXFx0dTE2IGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcXG4rXFx0dTMyIHBuZXRfaGFzaDtcXG4rXFx0dTE2IGNhcHM7XFxuIFxcdGJvb2wgbGVnYWN5ID0gdG4tXFx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcXG4tXFx0dTMyIHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcXG4tXFx0dTMyIHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbitcXHR1MzIgc3VnZztcXG4rXFx0dTMyIHNpZ25hdHVyZTtcXG4gXFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xcbi1cXHR1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XFxuLVxcdHUzMiBuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcXG4rXFx0dTMyIGRzdDtcXG4rXFx0dTMyIG5ldF9pZDtcXG4gXFx0c3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjtcXG4tXFx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbi1cXHR1MzIgbXR5cCA9IG1zZ190eXBlKGhkcik7XFxuK1xcdHUzMiBzcmM7XFxuK1xcdHUzMiBtdHlwO1xcbiBcXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xcbiBcXHRib29sIHJlc3BvbmQgPSBmYWxzZTtcXG4gXFx0dTMyIHNlbGY7XFxuIFxcdGludCBlcnI7XFxuIFxcbitcXHQvKiBEaXNjb3ZlcnkgbWVzc2FnZXMgYWx3YXlzIGNhcnJ5IHRoZSBtYXhpbXVtIHNpemUgVElQQyBoZWFkZXJcXG4rXFx0ICogcGx1cyBhIG5vZGUgaWRlbnRpdHksIHNlZSB0aXBjX2Rpc2NfaW5pdF9tc2coKS4gVGhlIGhlYWRlclxcbitcXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcXG4rXFx0ICogdGhlIG1pbmltdW0gaGVhZGVyIHNpemUsIHNvIGRpc2NhcmQgc2hvcnRlciBtZXNzYWdlcyBiZWZvcmVcXG4rXFx0ICogcmVhZGluZyB0aGVtLlxcbitcXHQgKi9cXG4rXFx0aWYgKG1zZ19oZHJfc3ooaGRyKSBcXHUwMDNjIE1BWF9IX1NJWkUgfHxcXG4rXFx0ICAgIG1zZ19zaXplKGhkcikgXFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcXG4rXFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0aWYgKHNrYl9saW5lYXJpemUoc2tiKSkge1xcbiBcXHRcXHRrZnJlZV9za2Ioc2tiKTtcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4rXFx0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4rXFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xcbitcXHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XFxuK1xcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbitcXHRkc3QgPSBtc2dfZGVzdF9kb21haW4oaGRyKTtcXG4rXFx0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XFxuK1xcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbitcXHRtdHlwID0gbXNnX3R5cGUoaGRyKTtcXG4gXFxuIFxcdGlmIChjYXBzIFxcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxcbiBcXHRcXHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1Mzo1OS4wMTAwOTMxMjhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyNDczMzY5MDI5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUSVBDXCIsXG4gICAgXCJUSVBDX01FRElBX1VEUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInRpcGNfZGlzY19yY3ZcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGJvdW5kcyBjaGVja2luZyBmb3IgaW5jb21pbmcgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZXMgaW4gYHRpcGNfZGlzY19yY3ZgIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIFRJUEMgcHJvdG9jb2wgbG9naWMgdGhhdCBwcm9jZXNzZXMgbmV0d29yayBwYWNrZXRzLCBtYWtpbmcgaXQgaGlnaGx5IHJlbGV2YW50IGZvciBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0MzI0ZDY3NWQyNWYyMTEyYjE5OWQ3YTQ3MTYzMTFiNzk3ZWYwMjQyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMTk6NTM6NTUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuY1xuaW5kZXggNjg1Mzg5ZDRiMjQ1ZS4uNzQ2NzNjYTFmMmQ1MCAxMDA2NDRcbi0tLSBhL25ldC90aXBjL2Rpc2NvdmVyLmNcbisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbkBAIC0xOTUsMjcgKzE5NSw0NyBAQCB2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIHtcbiBcdHN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpO1xuIFx0c3RydWN0IHRpcGNfbXNnICpoZHIgPSBidWZfbXNnKHNrYik7XG4tXHR1MzIgcG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcbi1cdHUxNiBjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7XG4rXHR1MzIgcG5ldF9oYXNoO1xuK1x0dTE2IGNhcHM7XG4gXHRib29sIGxlZ2FjeSA9IHRuLVx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcbi1cdHUzMiBzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4tXHR1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKGhkcik7XG4rXHR1MzIgc3VnZztcbitcdHUzMiBzaWduYXR1cmU7XG4gXHR1OCBwZWVyX2lkW05PREVfSURfTEVOXSA9IHswLH07XG4tXHR1MzIgZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4tXHR1MzIgbmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4rXHR1MzIgZHN0O1xuK1x0dTMyIG5ldF9pZDtcbiBcdHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWFkZHI7XG4tXHR1MzIgc3JjID0gbXNnX3ByZXZub2RlKGhkcik7XG4tXHR1MzIgbXR5cCA9IG1zZ190eXBlKGhkcik7XG4rXHR1MzIgc3JjO1xuK1x0dTMyIG10eXA7XG4gXHRib29sIGR1cGxfYWRkciA9IGZhbHNlO1xuIFx0Ym9vbCByZXNwb25kID0gZmFsc2U7XG4gXHR1MzIgc2VsZjtcbiBcdGludCBlcnI7XG4gXG4rXHQvKiBEaXNjb3ZlcnkgbWVzc2FnZXMgYWx3YXlzIGNhcnJ5IHRoZSBtYXhpbXVtIHNpemUgVElQQyBoZWFkZXJcbitcdCAqIHBsdXMgYSBub2RlIGlkZW50aXR5LCBzZWUgdGlwY19kaXNjX2luaXRfbXNnKCkuIFRoZSBoZWFkZXJcbitcdCAqIGZpZWxkcyBhbmQgdGhlIG1lZGlhIGFkZHJlc3MgYXJlYSBhY2Nlc3NlZCBiZWxvdyBsaXZlIGJleW9uZFxuK1x0ICogdGhlIG1pbmltdW0gaGVhZGVyIHNpemUsIHNvIGRpc2NhcmQgc2hvcnRlciBtZXNzYWdlcyBiZWZvcmVcbitcdCAqIHJlYWRpbmcgdGhlbS5cbitcdCAqL1xuK1x0aWYgKG1zZ19oZHJfc3ooaGRyKSBcdTAwM2MgTUFYX0hfU0laRSB8fFxuK1x0ICAgIG1zZ19zaXplKGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xuK1x0XHRrZnJlZV9za2Ioc2tiKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0aWYgKHNrYl9saW5lYXJpemUoc2tiKSkge1xuIFx0XHRrZnJlZV9za2Ioc2tiKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuIFx0aGRyID0gYnVmX21zZyhza2IpO1xuK1x0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcbitcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcbitcdHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcbitcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xuK1x0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XG4rXHRuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcbitcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuK1x0bXR5cCA9IG1zZ190eXBlKGhkcik7XG4gXG4gXHRpZiAoY2FwcyBcdTAwMjYgVElQQ19OT0RFX0lEMTI4KVxuIFx0XHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTM6NTkuMDEwMDk0NjE4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk1MjI2NTY3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBUSVBDIFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG5ldC90aXBjL2Rpc2NvdmVyLmNgLiBJdCdzIHN0cmFpZ2h0Zm9yd2FyZCwgcmVhbGx5LiBUaGUgY29yZSBvZiBpdCBpcyBhIGRlZmVuc2l2ZSBjaGVjayB3aXRoaW4gYHRpcGNfZGlzY19yY3ZgLiBCYXNpY2FsbHksIGJlZm9yZSBkaXZpbmcgaW50byBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UsIGl0IHZlcmlmaWVzIHRoZSBtZXNzYWdlIGhlYWRlciBzaXplIGFuZCB0aGUgb3ZlcmFsbCBtZXNzYWdlIHNpemUuIFNtYXJ0LiBUaGlzIGlzIGNsZWFybHkgYSBmdW5jdGlvbmFsIGZpeCwgYWRkcmVzc2luZyBhIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIHJlYWQgdnVsbmVyYWJpbGl0eSBvciBhIHJlbGF0ZWQgbWVtb3J5IGFjY2VzcyBpc3N1ZSDigJMgZXhhY3RseSB0aGUga2luZCBvZiB0aGluZyB3ZSBuZWVkIHRvIGNhdGNoLiBXZSdyZSB0YWxraW5nIGFib3V0IHRoZSBUSVBDIHN1YnN5c3RlbSBoZXJlLCBzbyB0aGlzIGNoYW5nZSBrZWVwcyBpdHMgaW50ZWdyaXR5LiBOb3csIEkgbmVlZCB0byBjb25maXJtIHRoZSBjaGFuZ2UgYnkgZGlnZ2luZyBpbnRvIGBuZXQvdGlwYy9kaXNjb3Zlci5jYCB0byBzZWUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiwgYW5kIEkgc2hvdWxkIGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBmaWxlIHRvIGNvbmZpcm0gYWxsIFRJUEMgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTc4LCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MDIuOTYyMzY0MDlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk2NDYwMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFRJUENcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGlwYy9LY29uZmlnLTUtXFxubmV0L3RpcGMvS2NvbmZpZzo2Om1lbnVjb25maWcgVElQQ1xcbm5ldC90aXBjL0tjb25maWctNy1cXHR0cmlzdGF0ZSBcXFwiVGhlIFRJUEMgUHJvdG9jb2xcXFwiXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnLTI0LVxcbm5ldC90aXBjL0tjb25maWc6MjU6Y29uZmlnIFRJUENfTUVESUFfSUJcXG5uZXQvdGlwYy9LY29uZmlnLTI2LVxcdGJvb2wgXFxcIkluZmluaUJhbmQgbWVkaWEgdHlwZSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZy0zMC1cXHQgIElQLW92ZXItSW5maW5pQmFuZCBkZXZpY2VzLlxcbm5ldC90aXBjL0tjb25maWc6MzE6Y29uZmlnIFRJUENfTUVESUFfVURQXFxubmV0L3RpcGMvS2NvbmZpZy0zMi1cXHRib29sIFxcXCJJUC9VRFAgbWVkaWEgdHlwZSBzdXBwb3J0XFxcIlxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZy0zOC1cXG5uZXQvdGlwYy9LY29uZmlnOjM5OmNvbmZpZyBUSVBDX0NSWVBUT1xcbm5ldC90aXBjL0tjb25maWctNDAtXFx0Ym9vbCBcXFwiVElQQyBlbmNyeXB0aW9uIHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnLTUzLVxcbm5ldC90aXBjL0tjb25maWc6NTQ6Y29uZmlnIFRJUENfRElBR1xcbm5ldC90aXBjL0tjb25maWctNTUtXFx0dHJpc3RhdGUgXFxcIlRJUEM6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MDMuMDEyMDE1NDc1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk2NzczNTMwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYHRpcGNfZGlzY19yY3ZgIEZ1bmN0aW9uKipcblxuQWxyaWdodCwgSSdtIHdvcmtpbmcgd2l0aCBhIGBUSVBDYCBjb25maWd1cmF0aW9uIGhlcmUuIE5vdywgdGhlIGNvZGUncyBjYWxsaW5nIGB0aXBjX2Rpc2NfcmN2YCwgYW5kIG15IGluaXRpYWwgZm9jdXMgaXMgb24gaXRzIHNjb3BlLiBJcyB0aGlzIGZ1bmN0aW9uIHN0YXRpYywgbWVhbmluZyBpdCdzIGNvbmZpbmVkIHRvIGl0cyBtb2R1bGUsIG9yIGlzIGl0IGV4cG9ydGVkLCBhbmQgdGhlcmVmb3JlIGNhbGxhYmxlIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbD8gVGhhdCdzIHRoZSBmaXJzdCBxdWVzdGlvbiBJIG5lZWQgdG8gYW5zd2VyLiBLbm93aW5nIHRoYXQgd2lsbCBpbmZsdWVuY2UgaG93IEkgYXBwcm9hY2ggdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgcG90ZW50aWFsIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzeXN0ZW0uIElmIGl0J3Mgc3RhdGljLCBpdCdzIGVhc2llciB0byByZWFzb24gYWJvdXQgaW4gaXNvbGF0aW9uLCB3aGVyZWFzIGlmIGV4cG9ydGVkLCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGludGVyYWN0aW9ucyB3aXRoIGEgd2lkZXIgYXJyYXkgb2YgbW9kdWxlcy4gVGltZSB0byBkaWcgaW4gYW5kIGNoZWNrIGl0cyBkZWNsYXJhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE5MSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjA2Ljk3OTc1MzIzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODgwNTM0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRpcGNfZGlzY19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXFxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE4OS0gKiBAbmV0OiBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2VcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTkzOnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmg6NDg6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmJ1ZixcXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVxcdFxcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpO1xcbi0tXFxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL25vZGUuYy0yMTI1LVxcdFxcdGlmICh1bmxpa2VseSh1c3IgPT0gTElOS19DT05GSUcpKVxcbm5ldC90aXBjL25vZGUuYzoyMTI2OlxcdFxcdFxcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcXG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cXHRcXHRlbHNlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjA3LjAyODYzODI5NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzEyMjEyMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRm9jdXNpbmcgb24gdGhlIFRJUEMgRGlzY29ubmVjdCBSZWNlaXZlcioqXG5cbk9rYXksIHNvIGB0aXBjX2Rpc2NfcmN2YCBpc24ndCBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCdzIGtleS4gSXQncyBjYWxsZWQgZnJvbSBgdGlwY19yY3ZgLCB3aGljaCBtZWFucyBpdCdzIGEgc3BlY2lmaWMgcGFydCBvZiBhIGxhcmdlciBwcm9jZXNzLiBHaXZlbiB0aGF0LCBgdGlwY19kaXNjX3JjdmAgc2VlbXMgbGlrZSBhIG1vcmUgZm9jdXNlZCBzeW1ib2wgdG8gZXhwbG9yZS4gYHRpcGNfcmN2YCBpcyBpbnRlcmVzdGluZyB0b28sIGJ1dCBpdCBmZWVscyBicm9hZGVyLiBMZXQncyBzdGFydCB3aXRoIGB0aXBjX2Rpc2NfcmN2YC4gSSBzaG91bGQgY2hlY2sgaWYgYW55dGhpbmcgc3BlY2lmaWMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXR0ZW50aW9uIHJlbGF0ZWQgdG8gdGhpcy5cblxuSSByZW1lbWJlciB0aGF0IGBUSVBDYCBpdHNlbGYgaXMgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBvcHRpb24uIFNvIEkgbmVlZCB0byBkaWcgaW50byB0aGUgZGVwZW5kZW5jaWVzIGZvciBgVElQQ2AuIE15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIGBuZXQvdGlwYy9LY29uZmlnYCB0byBzZWUgd2hhdCBlbHNlIG1pZ2h0IGJlIHJlcXVpcmVkIGZvciBgVElQQ2AgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiBUaGlzIGlzIHRoZSBwbGFjZSB0byBjaGVjayBmb3IgcmVsYXRlZCBjb25maWd1cmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg1MiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxMC40OTk4NjE3MDlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkxMjc0MzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGVwZW5kcyBvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL0tjb25maWc9Nj1tZW51Y29uZmlnIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIlRoZSBUSVBDIFByb3RvY29sXFxcIlxcbm5ldC90aXBjL0tjb25maWc6ODpcXHRkZXBlbmRzIG9uIElORVRcXG5uZXQvdGlwYy9LY29uZmlnOjk6XFx0ZGVwZW5kcyBvbiBJUFY2IHx8IElQVjY9blxcbm5ldC90aXBjL0tjb25maWctMTAtXFx0aGVscFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0yNT1jb25maWcgVElQQ19NRURJQV9JQlxcbm5ldC90aXBjL0tjb25maWctMjYtXFx0Ym9vbCBcXFwiSW5maW5pQmFuZCBtZWRpYSB0eXBlIHN1cHBvcnRcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzoyNzpcXHRkZXBlbmRzIG9uIFRJUEMgXFx1MDAyNlxcdTAwMjYgSU5GSU5JQkFORF9JUE9JQlxcbm5ldC90aXBjL0tjb25maWctMjgtXFx0aGVscFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0zMT1jb25maWcgVElQQ19NRURJQV9VRFBcXG5uZXQvdGlwYy9LY29uZmlnLTMyLVxcdGJvb2wgXFxcIklQL1VEUCBtZWRpYSB0eXBlIHN1cHBvcnRcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzozMzpcXHRkZXBlbmRzIG9uIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTM0LVxcdHNlbGVjdCBORVRfVURQX1RVTk5FTFxcbi0tXFxubmV0L3RpcGMvS2NvbmZpZz0zOT1jb25maWcgVElQQ19DUllQVE9cXG5uZXQvdGlwYy9LY29uZmlnLTQwLVxcdGJvb2wgXFxcIlRJUEMgZW5jcnlwdGlvbiBzdXBwb3J0XFxcIlxcbm5ldC90aXBjL0tjb25maWc6NDE6XFx0ZGVwZW5kcyBvbiBUSVBDXFxubmV0L3RpcGMvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQ1JZUFRPXFxuLS1cXG5uZXQvdGlwYy9LY29uZmlnPTU0PWNvbmZpZyBUSVBDX0RJQUdcXG5uZXQvdGlwYy9LY29uZmlnLTU1LVxcdHRyaXN0YXRlIFxcXCJUSVBDOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxubmV0L3RpcGMvS2NvbmZpZzo1NjpcXHRkZXBlbmRzIG9uIFRJUENcXG5uZXQvdGlwYy9LY29uZmlnLTU3LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxMC41NDg5OTMxMzRaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDcxMzMxNDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlRJUEMgQ29uZmlndXJhdGlvbiBhbmQgVnVsbmVyYWJpbGl0eSBBc3Nlc3NtZW50KipcblxuT2theSwgc28gSSBzZWUgYFRJUENgIGlzIHJlbGlhbnQgb24gYElORVRgLiBUaGF0J3Mgc3RyYWlnaHRmb3J3YXJkOyBJJ2xsIGdldCB0aGF0IGFkZGVkIHRvIHRoZSBgRW5hYmxlQ29uZmlnc2AgbGlzdC4gTm93LCBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGB0aXBjX2Rpc2NfcmN2YCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIOKAkyBjcnVjaWFsIGZvciBkZXRlcm1pbmluZyB0aGUgcG90ZW50aWFsIGltcGFjdCBoZXJlLiBZZXMsIGl0J3MgY2FsbGVkIGZyb20gYHRpcGNfcmN2YCwgd2hpY2ggZXNzZW50aWFsbHkgYWN0cyBhcyB0aGUgcHJpbWFyeSByZWNlaXZlIGZ1bmN0aW9uIGZvciBhbGwgVElQQyBwYWNrZXRzLCBzbyB0aGF0J3MgYSBkaXJlY3QgZW50cnkgcG9pbnQuXG5cblRoaXMgcGF0Y2gsIGl0J3MgYWRkcmVzc2luZyBhbiBvdXQtb2YtYm91bmRzIHJlYWQsIGFuZCB0aGF0J3MgY29uY2VybmluZy4gVGhlIGZpeCBpbnZvbHZlcyBjaGVja2luZyBgbXNnX2hkcl9zeihoZHIpYCBhbmQgYG1zZ19zaXplKGhkcilgIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGFjY2VzcyBjZXJ0YWluIGZpZWxkcy4gVGhhdCBzb3VuZHMgbGlrZSBhIHNvbGlkIGFwcHJvYWNoLCBidXQgaXQgZGVmaW5pdGVseSB3YXJyYW50cyB0aG9yb3VnaCBmdXp6aW5nLlxuXG5Ob3csIGxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCBgdGlwY19kaXNjX3JjdmAsIHdoaWNoIGxpdmVzIGluIGBuZXQvdGlwYy9kaXNjb3Zlci5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBjb2RlIHRvIGFzc2VzcyB0aGUgdnVsbmVyYWJpbGl0eSBwcm9wZXJseS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDYwNSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoxNS4wMjAzMjc0MThaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODkxMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvZGlzY292ZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxOTA6XFx0ICogQHNrYjogYnVmZmVyIGNvbnRhaW5pbmcgbWVzc2FnZVxcbiAxOTE6XFx0ICogQGI6IGJlYXJlciB0aGF0IG1lc3NhZ2UgYXJyaXZlZCBvblxcbiAxOTI6XFx0ICovXFxuIDE5MzpcXHR2b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiAxOTQ6XFx0XFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbiAxOTU6XFx0e1xcbiAxOTY6XFx0XFx0c3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7XFxuIDE5NzpcXHRcXHRzdHJ1Y3QgdGlwY19tc2cgKmhkciA9IGJ1Zl9tc2coc2tiKTtcXG4gMTk4OlxcdFxcdHUzMiBwbmV0X2hhc2g7XFxuIDE5OTpcXHRcXHR1MTYgY2FwcztcXG4gMjAwOlxcdFxcdGJvb2wgbGVnYWN5ID0gdG4tXFx1MDAzZWxlZ2FjeV9hZGRyX2Zvcm1hdDtcXG4gMjAxOlxcdFxcdHUzMiBzdWdnO1xcbiAyMDI6XFx0XFx0dTMyIHNpZ25hdHVyZTtcXG4gMjAzOlxcdFxcdHU4IHBlZXJfaWRbTk9ERV9JRF9MRU5dID0gezAsfTtcXG4gMjA0OlxcdFxcdHUzMiBkc3Q7XFxuIDIwNTpcXHRcXHR1MzIgbmV0X2lkO1xcbiAyMDY6XFx0XFx0c3RydWN0IHRpcGNfbWVkaWFfYWRkciBtYWRkcjtcXG4gMjA3OlxcdFxcdHUzMiBzcmM7XFxuIDIwODpcXHRcXHR1MzIgbXR5cDtcXG4gMjA5OlxcdFxcdGJvb2wgZHVwbF9hZGRyID0gZmFsc2U7XFxuIDIxMDpcXHRcXHRib29sIHJlc3BvbmQgPSBmYWxzZTtcXG4gMjExOlxcdFxcdHUzMiBzZWxmO1xcbiAyMTI6XFx0XFx0aW50IGVycjtcXG4gMjEzOlxcdFxcbiAyMTQ6XFx0XFx0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXFxuIDIxNTpcXHRcXHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXFxuIDIxNjpcXHRcXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcXG4gMjE3OlxcdFxcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXFxuIDIxODpcXHRcXHQgKiByZWFkaW5nIHRoZW0uXFxuIDIxOTpcXHRcXHQgKi9cXG4gMjIwOlxcdFxcdGlmIChtc2dfaGRyX3N6KGhkcikgXFx1MDAzYyBNQVhfSF9TSVpFIHx8XFxuIDIyMTpcXHRcXHQgICAgbXNnX3NpemUoaGRyKSBcXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xcbiAyMjI6XFx0XFx0XFx0a2ZyZWVfc2tiKHNrYik7XFxuIDIyMzpcXHRcXHRcXHRyZXR1cm47XFxuIDIyNDpcXHRcXHR9XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcXG4gMjI3OlxcdFxcdFxcdGtmcmVlX3NrYihza2IpO1xcbiAyMjg6XFx0XFx0XFx0cmV0dXJuO1xcbiAyMjk6XFx0XFx0fVxcbiAyMzA6XFx0XFx0aGRyID0gYnVmX21zZyhza2IpO1xcbiAyMzE6XFx0XFx0cG5ldF9oYXNoID0gbXNnX3BlZXJfbmV0X2hhc2goaGRyKTtcXG4gMjMyOlxcdFxcdGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoaGRyKTtcXG4gMjMzOlxcdFxcdHN1Z2cgPSBtc2dfc3VnZ19ub2RlX2FkZHIoaGRyKTtcXG4gMjM0OlxcdFxcdHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xcbiAyMzU6XFx0XFx0ZHN0ID0gbXNnX2Rlc3RfZG9tYWluKGhkcik7XFxuIDIzNjpcXHRcXHRuZXRfaWQgPSBtc2dfYmNfbmV0aWQoaGRyKTtcXG4gMjM3OlxcdFxcdHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xcbiAyMzg6XFx0XFx0bXR5cCA9IG1zZ190eXBlKGhkcik7XFxuIDIzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MTUuMDIwNDE4NDQ4WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg2MzcyNzg3NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgVGhpcyBUSVBDIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCBpdCdzIGEgZ29vZCwgc2Vuc2libGUgYWRkaXRpb24uIEl0IGxvb2tzIGxpa2Ugd2UncmUgaW50cm9kdWNpbmcgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcywgc3BlY2lmaWNhbGx5IGxvb2tpbmcgYXQgYG1zZ19oZHJfc3ooaGRyKWAgYW5kIGBtc2dfc2l6ZShoZHIpYC4gV2UncmUgdmVyaWZ5aW5nIGlmIHRoZXNlIHNpemVzIGFyZSB3aXRoaW4gc2Vuc2libGUgYm91bmRzLCBjb21wYXJpbmcgdGhlbSB0byBgTUFYX0hfU0laRWAgYW5kIGBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU5gLiBUaGlzIGlzIHJlYWNoYWJsZSB0aHJvdWdoIGB0aXBjX3JjdmAsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgaW5jb21pbmcgVElQQyBwYWNrZXRzLlxuXG5Gcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUsIHRoaXMgaXMgaW1wb3J0YW50LiBUaGlzIGtpbmQgb2YgY2hlY2sgaXMgYWx3YXlzIHdvcnRod2hpbGUgdG8gcHJldmVudCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyBvciBvdGhlciBtZW1vcnkgY29ycnVwdGlvbiBpc3N1ZXMgYXJpc2luZyBmcm9tIG1hbGZvcm1lZCBvciBtYWxpY2lvdXMgbWVzc2FnZXMuIEl0IG1ha2VzIHNlbnNlIHRvIGZ1enogdGhpcy5cblxuTXkgcHJpbWFyeSBmb2N1cyBoZXJlLCBmb3IgZnV6emluZyBwdXJwb3NlcywgaXMgZGVmaW5pdGVseSBnb2luZyB0byBiZSBgdGlwY19kaXNjX3JjdmAuIFRoYXQncyB3aGVyZSBJJ2xsIGNvbmNlbnRyYXRlIG15IGluaXRpYWwgZWZmb3J0cy5cblxuSSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgYWxsIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBlbmFibGVkIGZvciB0aG9yb3VnaCB0ZXN0aW5nLiBBc2lkZSBmcm9tIHRoZSBiYXNpYyBgVElQQ2AgY29uZmlndXJhdGlvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBmb3IgcmVsYXRlZCBjb25maWdzLiBBaGEsIGBUSVBDX01FRElBX1VEUGAgd291bGQgYmUgYW4gZXhjZWxsZW50IGNob2ljZSB0byBpbmNsdWRlISBFbmFibGluZyBUSVBDIG92ZXIgVURQIGlzIGEgY29tbW9uIGFwcHJvYWNoIGZvciBmdXp6aW5nIFRJUEMgaW1wbGVtZW50YXRpb25zLCBtYWtpbmcgaXQgZWFzaWVyIHRvIGNyYWZ0IGFuZCBpbmplY3QgVURQIHBhY2tldHMgdG8gdGVzdCB0aGUgbmV3IGJvdW5kcyBjaGVja2luZy4gU28sIEkgd2lsbCBhZGQgYFRJUENfTUVESUFfVURQYCB0byB0aGUgbGlzdCBvZiBlbmFibGVkIGNvbmZpZ3VyYXRpb25zIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBtb3JlIGNvbXBsZXRlIHRlc3RpbmcgZW52aXJvbm1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3NjUsIk91dHB1dFRva2VucyI6MTA4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MjMuNjU3Njk5ODg3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODYwNzg0NTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRJUENcIixcbiAgICBcIlRJUENfTUVESUFfVURQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGlwY19kaXNjX3JjdlwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYm91bmRzIGNoZWNraW5nIGZvciBpbmNvbWluZyBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlcyBpbiBgdGlwY19kaXNjX3JjdmAgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIHJlYWRzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgVElQQyBwcm90b2NvbCBsb2dpYyB0aGF0IHByb2Nlc3NlcyBuZXR3b3JrIHBhY2tldHMsIG1ha2luZyBpdCBoaWdobHkgcmVsZXZhbnQgZm9yIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVElQQ1wiLFxuICAgIFwiVElQQ19NRURJQV9VRFBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0aXBjX2Rpc2NfcmN2XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBib3VuZHMgY2hlY2tpbmcgZm9yIGluY29taW5nIFRJUEMgZGlzY292ZXJ5IG1lc3NhZ2VzIGluIGB0aXBjX2Rpc2NfcmN2YCB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBUSVBDIHByb3RvY29sIGxvZ2ljIHRoYXQgcHJvY2Vzc2VzIG5ldHdvcmsgcGFja2V0cywgbWFraW5nIGl0IGhpZ2hseSByZWxldmFudCBmb3IgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6MjMuNzQzNzkwNDQ1WiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDQzNDQ4Nzg3NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDoyMy43NDQ1MjA0NjVaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTQ0MzQ0MTQ1NDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxcblxcbldoZW4gYSBtYWxpY2lvdXNseSBzbWFsbCBvciBmcmFnbWVudGVkIHBhY2tldCBpcyByZWNlaXZlZCwgcmVhZGluZyB0aGVzZSBmaWVsZHMgYWNjZXNzZXMgdGhlIHRhaWxyb29tIG9mIHRoZSBgc2tfYnVmZmAgZGF0YSBidWZmZXIuIEJlY2F1c2UgbmV0d29yayBkcml2ZXJzIHR5cGljYWxseSBhbGxvY2F0ZSBzdGFuZGFyZC1zaXplZCBjaHVua3MgKGUuZy4sIDI1NiwgMTUwMCwgb3IgMjA0OCBieXRlcykgZm9yIGBza19idWZmYCBkYXRhLCB0aGVzZSByZWFkcyB3aWxsIGxpa2VseSBmYWxsIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhbGxvY2F0ZWQgaGVhcCBjaHVuay4gQ29uc2VxdWVudGx5LCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgdGhpcyBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVxcdTAwM2VsZW5gIG9yIGBza2JfaGVhZGxlbmAgYXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChhbmQgYXJlIGV4cGxpY2l0bHkgcG9pc29uZWQgYnkgS01TQU4ncyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClgLCBgaWYgKG10eXAgPT0gRFNDX1JFUV9NU0cpYCkgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHdoaWNoIGNvdWxkIGNvcnJ1cHQgaW50ZXJuYWwgc3RhdGUgb3IgbGVhZCB0byBpbmZvLWxlYWtzLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgbWFraW5nIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBoaWdobHkganVzdGlmaWVkIHRvIHZlcmlmeSB0aGlzIGZpeCBhbmQgZW5zdXJlIG5vIG90aGVyIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IGluIHRoZSBUSVBDIHBhY2tldCBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNDMyNGQ2NzVkMjVmMjExMmIxOTlkN2E0NzE2MzExYjc5N2VmMDI0MlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDE5OjUzOjU1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmNcbmluZGV4IDY4NTM4OWQ0YjI0NWUuLjc0NjczY2ExZjJkNTAgMTAwNjQ0XG4tLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jXG4rKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jXG5AQCAtMTk1LDI3ICsxOTUsNDcgQEAgdm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiB7XG4gXHRzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTtcbiBcdHN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpO1xuLVx0dTMyIHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4tXHR1MTYgY2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xuK1x0dTMyIHBuZXRfaGFzaDtcbitcdHUxNiBjYXBzO1xuIFx0Ym9vbCBsZWdhY3kgPSB0bi1cdTAwM2VsZWdhY3lfYWRkcl9mb3JtYXQ7XG4tXHR1MzIgc3VnZyA9IG1zZ19zdWdnX25vZGVfYWRkcihoZHIpO1xuLVx0dTMyIHNpZ25hdHVyZSA9IG1zZ19ub2RlX3NpZyhoZHIpO1xuK1x0dTMyIHN1Z2c7XG4rXHR1MzIgc2lnbmF0dXJlO1xuIFx0dTggcGVlcl9pZFtOT0RFX0lEX0xFTl0gPSB7MCx9O1xuLVx0dTMyIGRzdCA9IG1zZ19kZXN0X2RvbWFpbihoZHIpO1xuLVx0dTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChoZHIpO1xuK1x0dTMyIGRzdDtcbitcdHUzMiBuZXRfaWQ7XG4gXHRzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1hZGRyO1xuLVx0dTMyIHNyYyA9IG1zZ19wcmV2bm9kZShoZHIpO1xuLVx0dTMyIG10eXAgPSBtc2dfdHlwZShoZHIpO1xuK1x0dTMyIHNyYztcbitcdHUzMiBtdHlwO1xuIFx0Ym9vbCBkdXBsX2FkZHIgPSBmYWxzZTtcbiBcdGJvb2wgcmVzcG9uZCA9IGZhbHNlO1xuIFx0dTMyIHNlbGY7XG4gXHRpbnQgZXJyO1xuIFxuK1x0LyogRGlzY292ZXJ5IG1lc3NhZ2VzIGFsd2F5cyBjYXJyeSB0aGUgbWF4aW11bSBzaXplIFRJUEMgaGVhZGVyXG4rXHQgKiBwbHVzIGEgbm9kZSBpZGVudGl0eSwgc2VlIHRpcGNfZGlzY19pbml0X21zZygpLiBUaGUgaGVhZGVyXG4rXHQgKiBmaWVsZHMgYW5kIHRoZSBtZWRpYSBhZGRyZXNzIGFyZWEgYWNjZXNzZWQgYmVsb3cgbGl2ZSBiZXlvbmRcbitcdCAqIHRoZSBtaW5pbXVtIGhlYWRlciBzaXplLCBzbyBkaXNjYXJkIHNob3J0ZXIgbWVzc2FnZXMgYmVmb3JlXG4rXHQgKiByZWFkaW5nIHRoZW0uXG4rXHQgKi9cbitcdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcbitcdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcbitcdFx0a2ZyZWVfc2tiKHNrYik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdGlmIChza2JfbGluZWFyaXplKHNrYikpIHtcbiBcdFx0a2ZyZWVfc2tiKHNrYik7XG4gXHRcdHJldHVybjtcbiBcdH1cbiBcdGhkciA9IGJ1Zl9tc2coc2tiKTtcbitcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XG4rXHRjYXBzID0gbXNnX25vZGVfY2FwYWJpbGl0aWVzKGhkcik7XG4rXHRzdWdnID0gbXNnX3N1Z2dfbm9kZV9hZGRyKGhkcik7XG4rXHRzaWduYXR1cmUgPSBtc2dfbm9kZV9zaWcoaGRyKTtcbitcdGRzdCA9IG1zZ19kZXN0X2RvbWFpbihoZHIpO1xuK1x0bmV0X2lkID0gbXNnX2JjX25ldGlkKGhkcik7XG4rXHRzcmMgPSBtc2dfcHJldm5vZGUoaGRyKTtcbitcdG10eXAgPSBtc2dfdHlwZShoZHIpO1xuIFxuIFx0aWYgKGNhcHMgXHUwMDI2IFRJUENfTk9ERV9JRDEyOClcbiBcdFx0bWVtY3B5KHBlZXJfaWQsIG1zZ19ub2RlX2lkKGhkciksIE5PREVfSURfTEVOKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjIzLjc0NDUyMjg1NVoiLCJTZXEiOjE1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNDA4MjQxOTQwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBDb25zaWRlcmF0aW9uIGZvciBhIFRJUEMgRGlzY292ZXJ5IFBhdGNoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYHRpcGNfZGlzY19yY3ZgIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIGl0IGRlbGF5cyBzb21lIGZpZWxkIHJlYWRzIGZyb20gdGhlIGB0aXBjX21zZ2AgaGVhZGVyIHVudGlsIGFmdGVyIGl0IGNoZWNrcyB0aGUgbWVzc2FnZSBzaXplIGFuZCBsaW5lYXJpemVzIHRoZSBgc2tiYC4gVGhlIG9yaWdpbmFsIGNvZGUsIGJlZm9yZSB0aGUgcGF0Y2gsIHJlYWRzIHN0dWZmIGxpa2UgYG1zZ19wZWVyX25ldF9oYXNoYCwgYG1zZ19ub2RlX2NhcGFiaWxpdGllc2AsIHJpZ2h0IG9mZiB0aGUgYmF0IGZyb20gdGhlIGBza2JgIGRhdGEuIE5vdywgdGhlIG1haW4gcHJvYmxlbSB0aGlzIGlzIGZpeGluZywgYXMgZmFyIGFzIEkgY2FuIHNlZSwgaXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkIGlmIHRoZSBgc2tiYCBpcyBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQsIG9yIGlmIHRoZXJlJ3MgZnJhZ21lbnRhdGlvbi5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhlIGNvbnRleHQgb2Yga2VybmVsIGNvZGUsIGlzIHRoYXQgdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOLiAgQnV0IHRoZW4gSSBwYXVzZTogYW0gSSB0aGlua2luZyBvZiB0aGlzIGNvcnJlY3RseT8gSXMgaXQgS01TQU4gdGVycml0b3J5PyBXYWl0LCBpZiB0aGUgc2tiIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzdHJ1Y3QgaXQncyBwb2ludGluZyB0bywgdGhlbiByZWFkaW5nIGJleW9uZCB0aGF0IGxlbmd0aCB3b3VsZCBiZSByZWFkaW5nIG91dHNpZGUgdGhlIGRhdGEgdGhhdCB3YXMgaW5pdGlhbGl6ZWQsIHdoaWNoIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiBjb3VsZCBjYXRjaCB0aGlzLCBlc3BlY2lhbGx5IGlmIHRoZSBhbGxvY2F0aW9uIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCBkYXRhLlxuXG5JIHN0YXJ0IHRvIHRoaW5rIGFib3V0IHRoZSBkaWZmZXJlbnQgdG9vbHMgYXZhaWxhYmxlIHRvIG1lLiBJZiBpdCBnb2VzIGJleW9uZCB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgS0FTQU4gKnNob3VsZCogY2F0Y2ggaXQuIEJ1dCwgS0FTQU4gY2FuIG1pc3MgaXQgaWYgaXQgZG9lcyBub3QgZ28gcGFzdCB0aGUgYWxsb2NhdGlvbiBzaXplIGFuZCB0aGF0IGlzIGEgbXVjaCBncmVhdGVyIHJpc2suIFRoZSBwYWNrZXQgbWlnaHQgYmUgb25seSBhIGZldyBieXRlcyBpbiBzaXplLiBUaGUgZGF0YSBidWZmZXIgaXMgb2Z0ZW4gbXVjaCBsYXJnZXIgKGUuZy4sIE1UVSBvciBwYWdlIHNpemUpLiBTbywgcmVhZGluZyB0aG9zZSBoZWFkZXIgZmllbGRzIGZyb20gYSBzbWFsbCBwYWNrZXQgY2FuIHJlYWQgaW50byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIEtNU0FOIGlzIHRoZSBjb3JyZWN0IHRvb2wuICBJdCdzIHZlcnkgZ29vZCBhdCBjYXRjaGluZyByZWFkcyBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gIHdoZXJlIHRoZSBidWZmZXIgaXRzZWxmIGlzIGxhcmdlci5cblxuQW5kIHRoZSBwcm9tcHQsIGFoLCB0aGF0J3Mgd2hhdCdzIGltcG9ydGFudC4gSXQgc2F5cywgXCJOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcy4uLiBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXCIgIEkgc2VlLi4uIHRoaXMgcGF0Y2ggbW9kaWZpZXMgdGhlIGJvdW5kcyBjaGVja3MuIEl0ICpmaXhlcyogYSBzaXR1YXRpb24gd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2FzIGJlaW5nIGFjY2Vzc2VkIVxuXG5TbywgdGhlIGNvZGUgKmZpeGVzKiBhbiBpc3N1ZSwgYnV0IGlzIHRoZSBmaXggY29ycmVjdCBhbmQgY29tcGxldGU/IEkgcmVhZCB0aGUgcGF0Y2ggbW9yZSBjYXJlZnVsbHkuIEl0J3MgYWRkaW5nIHRoaXMgY2hlY2s6XG5gYGBjXG5cdGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHxcblx0ICAgIG1zZ19zaXplKGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgKyBOT0RFX0lEX0xFTikge1xuXHRcdGtmcmVlX3NrYihza2IpO1xuXHRcdHJldHVybjtcblx0fVxuYGBgXG5BbmQgaXQgZG9lcyB0aGlzICpiZWZvcmUqIGxpbmVhcml6aW5nLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgZmllbGQgcmVhZHMgdG8gYWZ0ZXIgdGhlIGNoZWNrcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBiZWZvcmUgdGhlIHBhdGNoIHdhcyB2dWxuZXJhYmxlIHRvIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhLlxuXG5UaGUgcHJvbXB0IG5vdyByZWFkczogXCJTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzIHRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXCJcblxuU2luY2UgaXQncyBmaXhpbmcgdGhlIHJlYWQtYmV5b25kLWBza2ItXHUwMDNlbGVuYCBjYXNlLCB0aGlzIHNlZW1zIGxpa2UgKmV4YWN0bHkqIHRoZSBraW5kIG9mIHNpdHVhdGlvbiBLTVNBTiBpcyBkZXNpZ25lZCB0byBkZXRlY3QuIFRoZSBwYXRjaCBjaGFuZ2VzIGhvdyB3ZSdyZSBhY2Nlc3NpbmcgdGhvc2UgdW5pbml0aWFsaXplZCBieXRlcyBpbiBhbiBgc2tiYCwgYnkgcHJldmVudGluZyB0aGUgYWNjZXNzISAgQnV0LCBzaW5jZSB3ZSB3YW50IHRvIGJlIGFic29sdXRlbHkgc3VyZSB0aGlzIGlzIHNvbGlkLCBhbmQgdGhlcmUgY291bGQgYmUgbGF0ZW50IGJ1Z3MuIEluIG9yZGVyIHRvIGVuc3VyZSB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaXMgc291bmQsIEtNU0FOIGlzIHByb2JhYmx5IHRoZSBhcHByb3ByaWF0ZSB0b29sLCBhbmQgSSBzaG91bGQgcnVuIGEgS01TQU4gZnV6emVyIHRvIGdpdmUgaXQgYSBnb29kIGdvaW5nLW92ZXIuXG5cblNvLCB0aGUgZmluYWwgY2FsbCBpczogZ2l2ZW4gdGhlIHBhdGNoICptb2RpZmllcyogdGhlIGJvdW5kcyBjaGVja3MsIGFuZCB0aG9zZSBjaGFuZ2VzIHByZXZlbnQgdGhlIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhIGJ1ZmZlciosIGFuZCBzaW5jZSBLTVNBTiBzcGVjaWZpY2FsbHkgaGVscHMgdXMgY2F0Y2ggcmVhZHMgYmV5b25kIGBza2ItXHUwMDNlbGVuYCB0aGF0IEtBU0FOIG1pZ2h0IG1pc3MsIEkgbmVlZCB0byBpbmNsdWRlIGBOZWVkc0tNU0FOPXRydWVgIHRvIHByb3Blcmx5IHZlcmlmeSB0aGF0IHRoaXMgYXJlYSBvZiB0aGUgY29kZSBpcyBzb3VuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU3NSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwNjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo0Ny44MjY5NDUwNzdaIiwiU2VxIjoxNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMzk4MzQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19wZWVyX25ldF9oYXNoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGlwYy9kaXNjb3Zlci5jPTE5Mz12b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzAtXFx0aGRyID0gYnVmX21zZyhza2IpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MjMxOlxcdHBuZXRfaGFzaCA9IG1zZ19wZWVyX25ldF9oYXNoKGhkcik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy0yMzItXFx0Y2FwcyA9IG1zZ19ub2RlX2NhcGFiaWxpdGllcyhoZHIpO1xcbi0tXFxubmV0L3RpcGMvbXNnLmg9MTEyMz1zdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuLS1cXG5uZXQvdGlwYy9tc2cuaC0xMTI3LVxcbm5ldC90aXBjL21zZy5oOjExMjg6c3RhdGljIGlubGluZSB1MzIgbXNnX3BlZXJfbmV0X2hhc2goc3RydWN0IHRpcGNfbXNnICptKVxcbm5ldC90aXBjL21zZy5oLTExMjkte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo0Ny44NzczNDgxOTNaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQxOTA5ODE3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbXNnX3BlZXJfbmV0X2hhc2hgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYG5ldC90aXBjL21zZy5oYCBhZ2Fpbiwgc3BlY2lmaWNhbGx5IHRhcmdldGluZyBgbXNnX3BlZXJfbmV0X2hhc2hgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSBUSVBDJ3MgaGFuZGxpbmcgb2YgbmV0d29yayBwZWVyIGlkZW50aWZpZXJzIGFuZCB0aGVpciBoYXNoaW5nIGNvbWVzIGludG8gcGxheS4gSSBuZWVkIGEgcmVmcmVzaGVyIG9uIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gaGVyZSwgYW5kIGhvdyBpdCByZWxhdGVzIHRvIHRoZSBicm9hZGVyIGNvbm5lY3Rpb24gbWFuYWdlbWVudCBpbiB0aGUgVElQQyBhcmNoaXRlY3R1cmUuIEknbSBhc3N1bWluZyB0aGF0IHRoaXMgaGFzaCBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSBpbiBlZmZpY2llbnQgbG9va3VwcyBhbmQgcG90ZW50aWFsbHkgbG9hZCBiYWxhbmNpbmcgZm9yIG5ldHdvcmsgbWVzc2FnZXMuIEkgd2FudCB0byBxdWlja2x5IHZlcmlmeSBpZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbGlnbnMgd2l0aCBiZXN0IHByYWN0aWNlcyBmcm9tIGEgcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmUuIEkgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHNlY3VyaXR5IGltcGxpY2F0aW9ucyB3ZXJlIGFkZHJlc3NlZCBkdXJpbmcgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBzdHJ1Y3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3NTIsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NDo1MS4yOTY0NDg2NTJaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4MTYwNzI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19wZWVyX25ldF9oYXNoXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL21zZy5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL21zZy5oPTExMjM9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxcbi0tXFxubmV0L3RpcGMvbXNnLmgtMTEyNy1cXG5uZXQvdGlwYy9tc2cuaDoxMTI4OnN0YXRpYyBpbmxpbmUgdTMyIG1zZ19wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSlcXG5uZXQvdGlwYy9tc2cuaC0xMTI5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTQ6NTEuMzQ0NjE0MDE3WiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5NjgwMTA5MjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnZSBIZWFkZXIqKlxuXG5Pa2F5LCBsZXQncyB6ZXJvIGluIG9uIGBuZXQvdGlwYy9tc2cuaGAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCB2ZXJpZnkgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbWVzc2FnZSBoZWFkZXIgc3RydWN0dXJlLCBzbyBJJ20gbmF2aWdhdGluZyBkb3duIHRvIGFyb3VuZCBsaW5lIDExMjguIEkga25vdyB0aGVyZSdzIGtleSBkYXRhIGFib3V0IG1lc3NhZ2UgdHlwZXMsIHByaW9yaXRpZXMsIGFuZCBkZWxpdmVyeSBmbGFncyBkZWNsYXJlZCBpbiB0aGF0IHZpY2luaXR5LiBJJ20gcHJvYmFibHkgbG9va2luZyBmb3IgdGhlIHN0cnVjdCBkZWZpbml0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbGF5b3V0IG9mIHRoZSBUSVBDIG1lc3NhZ2UgaGVhZGVyIGl0c2VsZi4gSSB3YW50IHRvIHF1aWNrbHkgY29uZmlybSB0aGUgZmllbGRzIGFuZCB0aGVpciBiaXR3aXNlIGVuY29kaW5ncyBiZWZvcmUgSSBhbmFseXplIHRoZSByZWxhdGVkIGNvZGUuIEknbSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBkZXN0aW5hdGlvbiBub2RlIElELCBwb3J0IElELCBvciB0aGUgc2VydmljZSB0eXBlLCBhcyB3ZWxsIGFzIHRoZSBmbGFncyB0aGF0IGRldGVybWluZSByZXRyYW5zbWlzc2lvbiBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCBJJ20gdHJ5aW5nIHRvIHJlbWVtYmVyIGlmIHRoZSBmbGFncyBmb3IgZnJhZ21lbnRlZCBtZXNzYWdlcyBhcmUgcGxhY2VkIGluIHRoZSBoZWFkZXIsIG9yIHNvbWV3aGVyZSBlbHNlLiBJJ2xsIGZvY3VzIG9uIGFueXRoaW5nIHJlbGF0ZWQgdG8gc2VxdWVuY2UgbnVtYmVycyBvciBhY2tub3dsZWRnZW1lbnRzIGF0IHRoYXQgc3BvdCBhcyB3ZWxsLiBUaW1lIHRvIGdldCB0aGUgZGV0YWlscyByaWdodC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjEwMiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjU1LjMxMjYyNzczMVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDk5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGlwYy9tc2cuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxMTIwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTIwOlxcdFxcbjExMjE6XFx0LyogV29yZCAxM1xcbjExMjI6XFx0ICovXFxuMTEyMzpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wZWVyX25ldF9oYXNoKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuMTEyNDpcXHR7XFxuMTEyNTpcXHRcXHRtc2dfc2V0X3dvcmQobSwgMTMsIG4pO1xcbjExMjY6XFx0fVxcbjExMjc6XFx0XFxuMTEyODpcXHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfcGVlcl9uZXRfaGFzaChzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuMTEyOTpcXHR7XFxuMTEzMDpcXHRcXHRyZXR1cm4gbXNnX3dvcmQobSwgMTMpO1xcbjExMzE6XFx0fVxcbjExMzI6XFx0XFxuMTEzMzpcXHQvKiBXb3JkIDE0XFxuMTEzNDpcXHQgKi9cXG4xMTM1OlxcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19zdWdnX25vZGVfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuMTEzNjpcXHR7XFxuMTEzNzpcXHRcXHRyZXR1cm4gbXNnX3dvcmQobSwgMTQpO1xcbjExMzg6XFx0fVxcbjExMzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU0OjU1LjMxMjcyNDI3MVoiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNjA5MzIzNzcyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZCBWdWxuZXJhYmlsaXR5IGluIFRJUEMgRGlzY292ZXJ5IE1lc3NhZ2VzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRoaXMgVElQQyBjb2RlIGhhbmRsZXMgaW5jb21pbmcgZGlzY292ZXJ5IG1lc3NhZ2VzLiBJIHNlZSB0aGF0IHZhcmlvdXMgZmllbGRzIHdpdGhpbiB0aGUgbWVzc2FnZSBoZWFkZXIgYXJlIGJlaW5nIGFjY2Vzc2VkIGF0IHNwZWNpZmljIG9mZnNldHMuIEZvciBleGFtcGxlLCBgbXNnX3BlZXJfbmV0X2hhc2hgIGlzIHJlYWQgYXQgb2Zmc2V0IDUyIGJ5dGVzLCBgbXNnX3N1Z2dfbm9kZV9hZGRyYCBhdCBvZmZzZXQgNTYsIGFuZCBzbyBvbi5cblxuVGhlIHBhdGNoIGluY2x1ZGVzIGEgc2l6ZSBjaGVjazogYGlmIChtc2dfaGRyX3N6KGhkcikgXHUwMDNjIE1BWF9IX1NJWkUgfHwgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSArIE5PREVfSURfTEVOKWAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBpZiB0aGUgaW5jb21pbmcgcGFja2V0IGlzIHNtYWxsZXIgdGhhbiBgTUFYX0hfU0laRWAgKGxpa2VseSA2MCBieXRlcywgb3IgMTUgd29yZHMsIGJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcpLCB0aGVuIHJlYWRpbmcgYXQgdGhlIG9mZnNldHMgbGlrZSA1MiBvciA1NiB3b3VsZCBsZWFkIHRvIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgcmlnaHQ/XG5cbkJ1dCB0aGVuIEkgcmVhbGl6ZSBpdCdzIG1vcmUgc3VidGxlLiBJZiB0aGUgcGFja2V0IGlzIGZyb20gdGhlIG5ldHdvcmssIHRoZSBgc2tiYCBpcyBhbGxvY2F0ZWQgYnkgdGhlIG5ldHdvcmsgZHJpdmVyLCBwcm9iYWJseSB3aXRoIGVub3VnaCBzcGFjZSBmb3IgYW4gTVRVIG9yIGEgcGFnZS4gVGhlIGRyaXZlciBmaWxscyB0aGUgYnVmZmVyIHdpdGggdGhlIHJlY2VpdmVkIGRhdGEgYW5kIHNldHMgYHNrYi1cdTAwM2VsZW5gIHRvIHRoZSBhY3R1YWwgcGFja2V0IHNpemUuIFNvLCBpZiB0aGUgcGFja2V0IGlzLCBzYXksIDIwIGJ5dGVzLCB0aGUgYnVmZmVyIG1pZ2h0IGJlIDE1MDAgYnl0ZXMgbG9uZywgYnV0IG9ubHkgdGhlIGZpcnN0IDIwIGFyZSBpbml0aWFsaXplZC4gVGhlIGJ5dGVzIGZyb20gMjAgdG8gMTUwMCB3aWxsIGNvbnRhaW4gZ2FyYmFnZSBvciBvbGQgZGF0YS5cblxuTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvciBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkPyBSZWd1bGFyIEtBU0FOIHdpbGwgbm90IGRldGVjdCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgYmVjYXVzZSB0aGUgcmVhZCBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtBU0FOIG9ubHkgY2hlY2tzIHRoYXQgdGhlIGFjY2VzcyBpcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IGttYWxsb2Mva2ZyZWUvZXRjLiBIb3dldmVyLCBLTVNBTiwgd2hpY2ggdHJhY2tzIGluaXRpYWxpemF0aW9uIHN0YXR1cywgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyB0eXBlIG9mIGJ1Zy4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgaG9va3MgaW50byBza2IgdG8gbWFyayB0aGUgYnl0ZXMgcGFzdCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZC5cblxuVGhlbiB0aGUga2V5IHRoaW5nLCB0aGlzIHNpdHVhdGlvbiBpcyBleGFjdGx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gY2F0Y2g6IHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBuZXR3b3JrIHByb3RvY29sIHBhcnNpbmchIFRoZSBwYXRjaCBtb2RpZmllcyBib3VuZHMgY2hlY2tzLiBBbmQgdGhpcyBwYXRjaCBmYWxscyB1bmRlciB0aGUgY2F0ZWdvcnkgb2YgcG90ZW50aWFsIEtNU0FOIHRyaWdnZXJzOyBpdCdzIHJlbGF0ZWQgdG8gYm91bmRzIGNoZWNrcyB0aGF0IHByZXZlbnQgcmVhZGluZyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGFuIHNrYi4gS01TQU4gaXMgbmVlZGVkLCBldmVuIGlmIHRoZSBwYXRjaCAqZml4ZXMqIHRoZSBidWcsIHdlIHN0aWxsIHdhbnQgdG8gcnVuIEtNU0FOIHRvIHZlcmlmeSB0aGUgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgcGF0aHMgYWxsb3cgdW5pbml0aWFsaXplZCByZWFkcyEgU28sIHllcywgd2Ugc2hvdWxkIGRlZmluaXRlbHkgdXNlIEtNU0FOIGhlcmUuXG5cbkxldCdzIHZlcmlmeSB0aGlzLCBJIGtub3cgdGhhdCBpZiBhbiBza2IgYnVmZmVyIGlzIGFsbG9jYXRlZCB3aXRoIGttYWxsb2MoMjU2KSBhbmQgdGhlIHBhY2tldCBpcyBvbmx5IDIwIGJ5dGVzLCBLQVNBTiB3b24ndCBjb21wbGFpbiBiZWNhdXNlIGFjY2Vzc2luZyBtZW1vcnkgdXAgdG8gMjU2IGJ5dGVzIGlzIGxlZ2FsLCBldmVuIGlmIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiB3b3VsZCByYWlzZSBhbiBlcnJvciBiZWNhdXNlIGl0IGtub3dzIG9ubHkgMjAgYnl0ZXMgYXJlIGluaXRpYWxpemVkLiBLTVNBTiBpcyBkZWZpbml0ZWx5IHRoZSB0b29sIGZvciB0aGlzIGtpbmQgb2YgYnVnLlxuXG5JIHNob3VsZCBhbHNvIGNvbnNpZGVyIGZyYWdtZW50YXRpb24uIElmIGEgcGFja2V0IGlzIGZyYWdtZW50ZWQsIHRoZSBgc2tiLVx1MDAzZWRhdGFgIG1pZ2h0IG9ubHkgY29udGFpbiBwYXJ0IG9mIHRoZSBkYXRhLCB3aXRoIHRoZSByZXN0IGluIGBza2Jfc2hpbmZvKHNrYiktXHUwMDNlZnJhZ3NgLiBSZWFkaW5nIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAgd291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgdGFpbHJvb20uIEdvb2QgdGhpbmcgdGhlIHBhdGNoIGluY2x1ZGVzIGBza2JfbGluZWFyaXplKHNrYilgISBJZiBpdCBsaW5lYXJpemVzLCBpdCBjb3BpZXMgZXZlcnl0aGluZyBhbmQgYXZvaWRzIGZyYWdtZW50YXRpb24gaXNzdWVzLiBCdXQgZG9lcyB0aGlzIGd1YXJhbnRlZSBldmVyeXRoaW5nIGlzIGluaXRpYWxpemVkPyBXaGF0IGlmIGBza2ItXHUwMDNlbGVuYCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlcXVpcmVkIHNpemU/XG5cbk5vdywgdGhlIGNoZWNrOiBgbXNnX3NpemUoaGRyKSBcdTAwM2MgTUFYX0hfU0laRSArIE5PREVfSURfTEVOYCBzZWVtcyB0byBiZSBjaGVja2luZyB0aGUgc2l6ZSBmaWVsZCAqaW4gdGhlIGhlYWRlciosIG5vdCBuZWNlc3NhcmlseSBgc2tiLVx1MDAzZWxlbmAuIEkgbmVlZCB0byBjb25maXJtIGhvdyBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgYXJlIGltcGxlbWVudGVkLiBJcyB0aGF0IGFjdHVhbGx5IGNoZWNraW5nIHRoZSBoZWFkZXIncyBkZWNsYXJlZCBzaXplIGFnYWluc3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXI/IElmIG5vdCwgdGhlIGNoZWNrIGlzIHVzZWxlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2NjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDIzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MTEuNDA1OTY0NDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTE2MDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1zZ19oZHJfc3pcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvbXNnLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvbXNnLmg9MjUyPXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3VzZXIoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbilcXG4tLVxcbm5ldC90aXBjL21zZy5oLTI1Ni1cXG5uZXQvdGlwYy9tc2cuaDoyNTc6c3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMjU4LXtcXG4tLVxcbm5ldC90aXBjL21zZy5oPTI3Nz1zdGF0aWMgaW5saW5lIHUzMiBtc2dfZGF0YV9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMjc4LXtcXG5uZXQvdGlwYy9tc2cuaDoyNzk6XFx0cmV0dXJuIG1zZ19zaXplKG0pIC0gbXNnX2hkcl9zeihtKTtcXG5uZXQvdGlwYy9tc2cuaC0yODAtfVxcbi0tXFxubmV0L3RpcGMvbXNnLmg9MzY3PXN0YXRpYyBpbmxpbmUgdW5jaGFyICptc2dfZGF0YShzdHJ1Y3QgdGlwY19tc2cgKm0pXFxubmV0L3RpcGMvbXNnLmgtMzY4LXtcXG5uZXQvdGlwYy9tc2cuaDozNjk6XFx0cmV0dXJuICgodW5jaGFyICopbSkgKyBtc2dfaGRyX3N6KG0pO1xcbm5ldC90aXBjL21zZy5oLTM3MC19XFxuLS1cXG5uZXQvdGlwYy9tc2cuaD02MTk9c3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSlcXG5uZXQvdGlwYy9tc2cuaC02MjAte1xcbm5ldC90aXBjL21zZy5oOjYyMTpcXHRyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSBTSE9SVF9IX1NJWkU7XFxubmV0L3RpcGMvbXNnLmgtNjIyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MTEuNDUxNDg3MDY0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMDQwODEyMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRlY29kaW5nIE1lc3NhZ2UgSGVhZGVyczogQSBRdWljayBBc3Nlc3NtZW50KipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEknbSBnb2luZyB0byBzdGFydCBieSBncmFiYmluZyB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIHVwZnJvbnQuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0d28ga2V5IHBpZWNlcyBvZiBkYXRhOiBgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAuIFRoZXNlIGFyZSB0aGUgZm91bmRhdGlvbmFsIGVsZW1lbnRzLCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG15IGFuYWx5c2lzLiBgbXNnX2hkcl9zemAgdGVsbHMgbWUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpdHNlbGYg4oCTIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIG1ldGFkYXRhIGFuZCBjb250cm9sIGluZm9ybWF0aW9uIHBhY2tlZCB3aXRoaW4uIFRoZW4gdGhlcmUncyBgbXNnX3NpemVgLCB0aGUgb3ZlcmFsbCBtZXNzYWdlIHNpemUuIEdldHRpbmcgdGhlc2UgdHdvIGltbWVkaWF0ZWx5IGhlbHBzIGJ1aWxkIGEgbWVudGFsIG1vZGVsIG9mIHRoZSBzdHJ1Y3R1cmUuIEkgY2FuIGRlZHVjZSBob3cgbXVjaCBkYXRhIGlzIGhlYWRlciB2cyBwYXlsb2FkIGFuZCB0aGF0IHVuZGVyc3RhbmRpbmcgaXMgZXNzZW50aWFsIGJlZm9yZSBJIGV2ZW4gZ2V0IGludG8gZGV0YWlscy4gSSdtIGJ1aWxkaW5nIGEgZnJhbWUgb2YgcmVmZXJlbmNlIGZvciB0aGUgc3Vic2VxdWVudCBwYXJzaW5nIGFuZCBpbnRlcnByZXRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTM3NSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjE0Ljc1NTU3MTAwM1oiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4OTU3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGlwYy9tc2cuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNTA6XFx0fVxcbiAyNTE6XFx0XFxuIDI1MjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF91c2VyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pXFxuIDI1MzpcXHR7XFxuIDI1NDpcXHRcXHRtc2dfc2V0X2JpdHMobSwgMCwgMjUsIDB4Ziwgbik7XFxuIDI1NTpcXHR9XFxuIDI1NjpcXHRcXG4gMjU3OlxcdHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptKVxcbiAyNTg6XFx0e1xcbiAyNTk6XFx0XFx0cmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIFxcdTAwM2NcXHUwMDNjIDI7XFxuIDI2MDpcXHR9XFxuIDI2MTpcXHRcXG4gMjYyOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKVxcbiAyNjM6XFx0e1xcbiAyNjQ6XFx0XFx0bXNnX3NldF9iaXRzKG0sIDAsIDIxLCAweGYsIG5cXHUwMDNlXFx1MDAzZTIpO1xcbiAyNjU6XFx0fVxcbiAyNjY6XFx0XFxuIDI2NzpcXHRzdGF0aWMgaW5saW5lIHUzMiBtc2dfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0pXFxuIDI2ODpcXHR7XFxuIDI2OTpcXHRcXHRyZXR1cm4gbXNnX2JpdHMobSwgMCwgMCwgMHgxZmZmZik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjE0Ljc1NTY2MTg5M1oiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NDY2MTQ3NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzc2luZzpcblxuKipBbmFseXppbmcgUG90ZW50aWFsIFBhY2tldCBWdWxuZXJhYmlsaXR5KipcblxuUmlnaHQsIHNvIEknbSBsb29raW5nIGF0IHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkga2V5aW5nIGluIG9uIHRoZXNlIHZhcmlhYmxlcyDigJMgYG1zZ19oZHJfc3pgIGFuZCBgbXNnX3NpemVgLiBUaGV5J3JlIGJlaW5nIHB1bGxlZCByaWdodCBmcm9tIHRoZSBwYWNrZXQgaXRzZWxmLCBzcGVjaWZpY2FsbHkgZnJvbSB3b3JkIDAuIENsYXNzaWMgY2FzZSBvZiB0cnVzdGluZyB0aGUgZGF0YSwgaHVoPyBNeSBndXQgcmVhY3Rpb24gaXMgYWx3YXlzIHRvIHRoaW5rIGFib3V0IHBvdGVudGlhbCBleHBsb2l0cy5cblxuQW5kICpib29tKiwgdGhlcmUgaXQgaXMuIElmIHRoZSBwYWNrZXQncyBhY3R1YWxseSBzbWFsbGVyIHRoYW4gZm91ciBieXRlcywgcmVhZGluZyB0aGF0IGZpcnN0IHdvcmQgaXMgZ29pbmcgdG8gYmUgYSBkaXNhc3Rlci4gRWl0aGVyIGFuIG91dC1vZi1ib3VuZHMgcmVhZCwgb3IsIGV2ZW4gd29yc2UsIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQncyBhIGh1Z2UgcmVkIGZsYWcg4oCTIGEgcGVyZmVjdCB2ZWN0b3IgZm9yIGluamVjdGlvbiBpZiB3ZSdyZSBub3QgY2FyZWZ1bC5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IHdoZXJlIGlzIGB0aXBjX2Rpc2NfcmN2YCBiZWluZyBjYWxsZWQgZnJvbT8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgZnJvbSB0aGF0IGZ1bmN0aW9uIGFuZCBzZWUgd2hlcmUgdGhpcyBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZGF0YSBpcyBvcmlnaW5hdGluZy4gSXMgaXQgY29taW5nIGZyb20gYSB0cnVzdGVkIHNvdXJjZSwgb3IgaXMgaXQgZXhwb3NlZCB0byB1bnRydXN0ZWQgaW5wdXQ/IEkgbmVlZCB0byBnZXQgdG8gdGhlIHJvb3Qgb2YgdGhpcyB0byB1bmRlcnN0YW5kIHRoZSBleHRlbnQgb2YgdGhlIHBvc3NpYmxlIHZ1bG5lcmFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5MzcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjIwLjIyMTgxMTk0NloiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY0Mjg5MTg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRpcGNfZGlzY19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTQxPXN0YXRpYyBib29sIHRpcGNfZGlzY19hZGRyX3RyaWFsX21zZyhzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xODctLyoqXFxubmV0L3RpcGMvZGlzY292ZXIuYzoxODg6ICogdGlwY19kaXNjX3JjdiAtIGhhbmRsZSBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSlcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE4OS0gKiBAbmV0OiBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2VcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMTkyLSAqL1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTkzOnZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L3RpcGMvZGlzY292ZXIuYy0xOTQtXFx0XFx0ICAgc3RydWN0IHRpcGNfYmVhcmVyICpiKVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuaD00Nz12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpyZXEpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmg6NDg6dm9pZCB0aXBjX2Rpc2NfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmJ1ZixcXG5uZXQvdGlwYy9kaXNjb3Zlci5oLTQ5LVxcdFxcdCAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpO1xcbi0tXFxubmV0L3RpcGMvbm9kZS5jPTIwODM9dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL25vZGUuYy0yMTI1LVxcdFxcdGlmICh1bmxpa2VseSh1c3IgPT0gTElOS19DT05GSUcpKVxcbm5ldC90aXBjL25vZGUuYzoyMTI2OlxcdFxcdFxcdHJldHVybiB0aXBjX2Rpc2NfcmN2KG5ldCwgc2tiLCBiKTtcXG5uZXQvdGlwYy9ub2RlLmMtMjEyNy1cXHRcXHRlbHNlXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjIwLjQ4NjEwNjg0MloiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODUwMzI0MzczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBmaXJzdC1wZXJzb24gc3VtbWFyeSwgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYmFzZWQgb24geW91ciBwcm9tcHQ6XG5cbioqRGl2aW5nIGludG8gVElQQyBSZWNlaXZlciBMb2dpYyoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gZ29pbmcgdG8gc3RhcnQgZGlnZ2luZyBpbnRvIHRoZSBgdGlwY19yY3ZgIGZ1bmN0aW9uLCBmb3VuZCBpbiBgbmV0L3RpcGMvbm9kZS5jYC4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIHBhY2tldCByZWNlcHRpb24gbG9naWMgZm9yIFRJUEMgcmVzaWRlcywgcmlnaHQ/IEkgd2FudCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lc3NhZ2VzIGFjdHVhbGx5IGhpdCB0aGUgc3lzdGVtLCBob3cgdGhleSdyZSByb3V0ZWQgd2l0aGluIHRoZSBub2RlLCBhbmQgd2hhdCB0aGUgZmxvdyBjb250cm9sIGxvb2tzIGxpa2UgYXQgdGhhdCBsZXZlbC4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgcG90ZW50aWFsIGJvdHRsZW5lY2tzIGluIHRoYXQgcm91dGluZS4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb2J2aW91cyBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLCBvciBtYXliZSBzb21ldGhpbmcgSSBtaXNzZWQgbGFzdCB0aW1lIEkgbG9va2VkLiBJIGV4cGVjdCB0aGUgdXN1YWwgc3VzcGVjdHMg4oCTIHBhY2tldCBoZWFkZXIgcGFyc2luZywgYWRkcmVzcyBsb29rdXAsIGJ1ZmZlciBtYW5hZ2VtZW50LCBhbmQgdGhlIGZvcndhcmRpbmcgcHJvY2VzcyDigJMgYnV0IEknbSBsb29raW5nIGZvciB0aGUgZmluZXIgZGV0YWlscyB0aGlzIHRpbWUuIFBlcmhhcHMgSSdsbCBmb2N1cyBvbiBob3cgaXQgaGFuZGxlcyBmcmFnbWVudGVkIHBhY2tldHMgYW5kIGNvbm5lY3Rpb24gc3RhdGUsIGFuZCB3aGV0aGVyIGl0J3MgdGhlIHJpZ2h0IHBsYWNlIGZvciBpbnNwZWN0aW5nIHJlY2VudCBpc3N1ZXMgSSd2ZSByZWFkIGFib3V0LCBpbiB0aGUgbWFpbGluZyBsaXN0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcwMywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjI0LjMzNjQzNDA0NVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk1MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbm9kZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwODMsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwODM6XFx0dm9pZCB0aXBjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4yMDg0OlxcdHtcXG4yMDg1OlxcdFxcdHN0cnVjdCBza19idWZmX2hlYWQgeG1pdHE7XFxuMjA4NjpcXHRcXHRzdHJ1Y3QgdGlwY19saW5rX2VudHJ5ICpsZTtcXG4yMDg3OlxcdFxcdHN0cnVjdCB0aXBjX21zZyAqaGRyO1xcbjIwODg6XFx0XFx0c3RydWN0IHRpcGNfbm9kZSAqbjtcXG4yMDg5OlxcdFxcdGludCBiZWFyZXJfaWQgPSBiLVxcdTAwM2VpZGVudGl0eTtcXG4yMDkwOlxcdFxcdHUzMiBzZWxmID0gdGlwY19vd25fYWRkcihuZXQpO1xcbjIwOTE6XFx0XFx0aW50IHVzciwgcmMgPSAwO1xcbjIwOTI6XFx0XFx0dTE2IGJjX2FjaztcXG4yMDkzOlxcdCNpZmRlZiBDT05GSUdfVElQQ19DUllQVE9cXG4yMDk0OlxcdFxcdHN0cnVjdCB0aXBjX2VoZHIgKmVoZHI7XFxuMjA5NTpcXHRcXG4yMDk2OlxcdFxcdC8qIENoZWNrIGlmIG1lc3NhZ2UgbXVzdCBiZSBkZWNyeXB0ZWQgZmlyc3QgKi9cXG4yMDk3OlxcdFxcdGlmIChUSVBDX1NLQl9DQihza2IpLVxcdTAwM2VkZWNyeXB0ZWQgfHwgIXRpcGNfZWhkcl92YWxpZGF0ZShza2IpKVxcbjIwOTg6XFx0XFx0XFx0Z290byByY3Y7XFxuMjA5OTpcXHRcXG4yMTAwOlxcdFxcdGVoZHIgPSAoc3RydWN0IHRpcGNfZWhkciAqKXNrYi1cXHUwMDNlZGF0YTtcXG4yMTAxOlxcdFxcdGlmIChsaWtlbHkoZWhkci1cXHUwMDNldXNlciAhPSBMSU5LX0NPTkZJRykpIHtcXG4yMTAyOlxcdFxcdFxcdG4gPSB0aXBjX25vZGVfZmluZChuZXQsIG50b2hsKGVoZHItXFx1MDAzZWFkZHIpKTtcXG4yMTAzOlxcdFxcdFxcdGlmICh1bmxpa2VseSghbikpXFxuMjEwNDpcXHRcXHRcXHRcXHRnb3RvIGRpc2NhcmQ7XFxuMjEwNTpcXHRcXHR9IGVsc2Uge1xcbjIxMDY6XFx0XFx0XFx0biA9IHRpcGNfbm9kZV9maW5kX2J5X2lkKG5ldCwgZWhkci1cXHUwMDNlaWQpO1xcbjIxMDc6XFx0XFx0fVxcbjIxMDg6XFx0XFx0c2tiX2RzdF9mb3JjZShza2IpO1xcbjIxMDk6XFx0XFx0dGlwY19jcnlwdG9fcmN2KG5ldCwgKG4pID8gbi1cXHUwMDNlY3J5cHRvX3J4IDogTlVMTCwgXFx1MDAyNnNrYiwgYik7XFxuMjExMDpcXHRcXHRpZiAoIXNrYilcXG4yMTExOlxcdFxcdFxcdHJldHVybjtcXG4yMTEyOlxcdFxcbjIxMTM6XFx0cmN2OlxcbjIxMTQ6XFx0I2VuZGlmXFxuMjExNTpcXHRcXHQvKiBFbnN1cmUgbWVzc2FnZSBpcyB3ZWxsLWZvcm1lZCBiZWZvcmUgdG91Y2hpbmcgdGhlIGhlYWRlciAqL1xcbjIxMTY6XFx0XFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShcXHUwMDI2c2tiKSkpXFxuMjExNzpcXHRcXHRcXHRnb3RvIGRpc2NhcmQ7XFxuMjExODpcXHRcXHRfX3NrYl9xdWV1ZV9oZWFkX2luaXQoXFx1MDAyNnhtaXRxKTtcXG4yMTE5OlxcdFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4yMTIwOlxcdFxcdHVzciA9IG1zZ191c2VyKGhkcik7XFxuMjEyMTpcXHRcXHRiY19hY2sgPSBtc2dfYmNhc3RfYWNrKGhkcik7XFxuMjEyMjpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjQuMzM2NTc0OTE1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNTY3NzAyOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIFRpbWluZyBvZiBUSVBDIE1lc3NhZ2UgVmFsaWRhdGlvbioqXG5cblJpZ2h0LCBzbyB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhhdCBgdGlwY19tc2dfdmFsaWRhdGUoXHUwMDI2c2tiKWAgaXMgaW52b2tlZCAqYmVmb3JlKiBgdGlwY19kaXNjX3JjdmAuIFRoaXMgb3JkZXJpbmcgaXMgY3J1Y2lhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMgZGVzaWduZWQgdGhpcyB3YXkuIExldCdzIGRlbHZlIGludG8gd2hhdCBleGFjdGx5IGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgZG9pbmcuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBsb29rIGludG8gcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIG1lc3NhZ2UgdmFsaWRhdGlvbiwgYW5kIGZ1cnRoZXIgbWVzc2FnZSBwcm9jZXNzaW5nIGluIHRoZSBkaXNjIHJlY2VpdmUgZnVuY3Rpb24uIEl04oCZcyBsaWtlbHkgZW5zdXJpbmcgc29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBpbmNvbWluZyBTS0IuIFRoaW5ncyBsaWtlIGhlYWRlciBpbnRlZ3JpdHksIG1lc3NhZ2UgbGVuZ3RoLCBtYXliZSBldmVuIHNvbWUgcHJlbGltaW5hcnkgYWRkcmVzcyB2ZXJpZmljYXRpb24gYmVmb3JlIHdlIGdvIGFueSBmdXJ0aGVyLiBJdCdzIGEgZnVuZGFtZW50YWwgZGVmZW5zaXZlIHByb2dyYW1taW5nIHByYWN0aWNlLCBhIGZpcnN0IGxpbmUgb2YgZGVmZW5zZSBhZ2FpbnN0IGNvcnJ1cHRlZCBvciBtYWxpY2lvdXMgcGFja2V0cy4gSSdsbCBmb2N1cyBvbiB3aGF0IGFzcGVjdHMgb2YgdGhlIG1lc3NhZ2UgYXJlIHZhbGlkYXRlZCBoZXJlLiBJJ2xsIG5lZWQgdG8ga25vdyB3aGV0aGVyIGFueSBzdGF0ZSBpcyBtb2RpZmllZCBhdCB0aGUgdmFsaWRhdGlvbiBzdGFnZSwgb3IgaWYgaXQgaXMgcHVyZWx5IGEgY2hlY2suIEkgaG9wZSBpdCdzIG5vdCByZXNvdXJjZSBpbnRlbnNpdmUsIHdlIHdvdWxkbid0IHdhbnQgdG8gc2xvdyBkb3duIG5vcm1hbCBjb21tdW5pY2F0aW9uLCBhbmQgaXQgbmVlZHMgdG8gYmUgZWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTY1NywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjguNDkzMzQ3NDc4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODE5NTUyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0aXBjX21zZ192YWxpZGF0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvY3J5cHRvLmM9MTg4OD1zdGF0aWMgdm9pZCB0aXBjX2NyeXB0b19yY3ZfY29tcGxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19hZWFkICphZWFkLFxcbi0tXFxubmV0L3RpcGMvY3J5cHRvLmMtMTk2Ni1cXHQvKiBWYWxpZGF0ZSBUSVBDdjIgbWVzc2FnZSAqL1xcbm5ldC90aXBjL2NyeXB0by5jOjE5Njc6XFx0aWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShza2IpKSkge1xcbm5ldC90aXBjL2NyeXB0by5jLTE5NjgtXFx0XFx0cHJfZXJyX3JhdGVsaW1pdGVkKFxcXCJQYWNrZXQgZHJvcHBlZCBhZnRlciBkZWNyeXB0aW9uIVxcXFxuXFxcIik7XFxuLS1cXG5uZXQvdGlwYy9jcnlwdG8uYy0xOTc0LVxcbm5ldC90aXBjL2NyeXB0by5jOjE5NzU6XFx0LyogUmUtZmV0Y2ggc2tiIGNiIGFzIHNrYiBtaWdodCBiZSBjaGFuZ2VkIGluIHRpcGNfbXNnX3ZhbGlkYXRlICovXFxubmV0L3RpcGMvY3J5cHRvLmMtMTk3Ni1cXHRza2JfY2IgPSBUSVBDX1NLQl9DQigqc2tiKTtcXG4tLVxcbm5ldC90aXBjL21zZy5jPTEyND1pbnQgdGlwY19idWZfYXBwZW5kKHN0cnVjdCBza19idWZmICoqaGVhZGJ1Ziwgc3RydWN0IHNrX2J1ZmYgKipidWYpXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy0xNzktXFx0XFx0VElQQ19TS0JfQ0IoaGVhZCktXFx1MDAzZXZhbGlkYXRlZCA9IDA7XFxubmV0L3RpcGMvbXNnLmM6MTgwOlxcdFxcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXFx1MDAyNmhlYWQpKSlcXG5uZXQvdGlwYy9tc2cuYy0xODEtXFx0XFx0XFx0Z290byBlcnI7XFxuLS1cXG5uZXQvdGlwYy9tc2cuYz0yMDU9aW50IHRpcGNfbXNnX2FwcGVuZChzdHJ1Y3QgdGlwY19tc2cgKl9oZHIsIHN0cnVjdCBtc2doZHIgKm0sIGludCBkbGVuLFxcbi0tXFxubmV0L3RpcGMvbXNnLmMtMjQ0LVxcbm5ldC90aXBjL21zZy5jOjI0NTovKiB0aXBjX21zZ192YWxpZGF0ZSAtIHZhbGlkYXRlIGJhc2ljIGZvcm1hdCBvZiByZWNlaXZlZCBtZXNzYWdlXFxubmV0L3RpcGMvbXNnLmMtMjQ2LSAqXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy0yNTUtICovXFxubmV0L3RpcGMvbXNnLmM6MjU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKVxcbm5ldC90aXBjL21zZy5jLTI1Ny17XFxuLS1cXG5uZXQvdGlwYy9tc2cuYz01ODE9Ym9vbCB0aXBjX21zZ19leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICoqaXNrYiwgaW50ICpwb3MpXFxuLS1cXG5uZXQvdGlwYy9tc2cuYy02MDQtXFx0c2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoKmlza2IsIGloZHIsIGltc3opO1xcbm5ldC90aXBjL21zZy5jOjYwNTpcXHRpZiAodW5saWtlbHkoIXRpcGNfbXNnX3ZhbGlkYXRlKGlza2IpKSlcXG5uZXQvdGlwYy9tc2cuYy02MDYtXFx0XFx0Z290byBub25lO1xcbi0tXFxubmV0L3RpcGMvbXNnLmg9MTE1NT1zdHJ1Y3Qgc2tfYnVmZiAqdGlwY19idWZfYWNxdWlyZSh1MzIgc2l6ZSwgZ2ZwX3QgZ2ZwKTtcXG5uZXQvdGlwYy9tc2cuaDoxMTU2OmJvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKipfc2tiKTtcXG5uZXQvdGlwYy9tc2cuaC0xMTU3LWJvb2wgdGlwY19tc2dfcmV2ZXJzZSh1MzIgb3duX2FkZHIsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgZXJyKTtcXG4tLVxcbm5ldC90aXBjL25vZGUuYz0yMDgzPXZvaWQgdGlwY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpXFxuLS1cXG5uZXQvdGlwYy9ub2RlLmMtMjExNS1cXHQvKiBFbnN1cmUgbWVzc2FnZSBpcyB3ZWxsLWZvcm1lZCBiZWZvcmUgdG91Y2hpbmcgdGhlIGhlYWRlciAqL1xcbm5ldC90aXBjL25vZGUuYzoyMTE2OlxcdGlmICh1bmxpa2VseSghdGlwY19tc2dfdmFsaWRhdGUoXFx1MDAyNnNrYikpKVxcbm5ldC90aXBjL25vZGUuYy0yMTE3LVxcdFxcdGdvdG8gZGlzY2FyZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTU6MjguNTQxNTU0MzgyWiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3NTg0NDE3Mjk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCB0aGlua2luZyBhYm91dCBgdGlwY19tc2dfdmFsaWRhdGVgIGluIGBuZXQvdGlwYy9tc2cuY2A6XG5cbioqRGl2aW5nIGludG8gYHRpcGNfbXNnX3ZhbGlkYXRlYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoaXMgYHRpcGNfbXNnX3ZhbGlkYXRlYCBmdW5jdGlvbi4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkga25vdyB0aGlzIGlzIGdvaW5nIHRvIGJlIHRoZSBnYXRla2VlcGVyIGZvciBUSVBDIG1lc3NhZ2VzLCBtYWtpbmcgc3VyZSB0aGV5J3JlIGtvc2hlciBiZWZvcmUgdGhlIGtlcm5lbCBldmVuIHRoaW5rcyBhYm91dCBwcm9jZXNzaW5nIHRoZW0uIEknbSBleHBlY3RpbmcgdG8gc2VlIGEgc2VyaWVzIG9mIGNoZWNrcywgcHJvYmFibHkgc3RhcnRpbmcgd2l0aCBzb21lIGJhc2ljIHN0cnVjdHVyYWwgaW50ZWdyaXR5OiBtZXNzYWdlIGxlbmd0aCwgaGVhZGVyIGZpZWxkcywgYW5kIG1heWJlIHNvbWUgcXVpY2sgY2hlY2tzdW0gdmVyaWZpY2F0aW9ucyB0byB3ZWVkIG91dCBvYnZpb3VzIGNvcnJ1cHRpb24uXG5cbkknbSBjdXJpb3VzIGFib3V0IHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGNyaXRlcmlhLiBJcyBpdCBqdXN0IGNoZWNraW5nIGxlbmd0aHMgYW5kIG9mZnNldHMsIG9yIGRvZXMgaXQgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiBtZXNzYWdlIHR5cGUgdmFsaWRhdGlvbiwgY2hlY2tpbmcgaWYgZmllbGRzIGFyZSB3aXRoaW4gZXhwZWN0ZWQgcmFuZ2VzLCBhbmQgbWF5YmUgZXZlbiBjcm9zcy1yZWZlcmVuY2luZyBhZ2FpbnN0IGludGVybmFsIHN0YXRlIHRhYmxlcyBpZiBuZWNlc3Nhcnk/IEknZCBpbWFnaW5lIHRoZXJlJ3MgYSBkZWxpY2F0ZSBiYWxhbmNlIGhlcmUuIFRvbyBzdHJpbmdlbnQsIGFuZCB5b3UgcmlzayByZWplY3RpbmcgbGVnaXRpbWF0ZSBtZXNzYWdlcy4gVG9vIGxheCwgYW5kIHlvdSBvcGVuIHRoZSBkb29yIHRvIGFsbCBzb3J0cyBvZiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgb3IgY3Jhc2hlcy5cblxuSSdtIGFsc28gd29uZGVyaW5nIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVzLiBUSVBDIHN1cHBvcnRzIHZhcmlvdXMga2luZHMgb2YgbWVzc2FnZXMsIGZyb20gc2ltcGxlIGNvbm5lY3Rpb24gcmVxdWVzdHMgdG8gZGF0YSBwYWNrZXRzLiBJJ2QgYW50aWNpcGF0ZSB0aGUgdmFsaWRhdGlvbiBsb2dpYyB3aWxsIGJyYW5jaCBoZWF2aWx5IGRlcGVuZGluZyBvbiB0aGUgbWVzc2FnZSB0eXBlLCB3aXRoIG1vcmUgY29tcGxleCBjaGVja3MgZm9yIHRoaW5ncyBsaWtlIHNlcXVlbmNlIG51bWJlcnMgb3IgYWNrbm93bGVkZ21lbnQgZmllbGRzIGluIHJlbGlhYmxlIGNvbW11bmljYXRpb24gc2NlbmFyaW9zLlxuXG5JJ2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZCB0aGUgZXJyb3IgcmVwb3J0aW5nLiBEb2VzIGl0IGp1c3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIG9yIGRvZXMgaXQgbG9nIHRoZSB2YWxpZGF0aW9uIGZhaWx1cmVzPyBIb3BlZnVsbHksIHRoZXJlIGFyZSBkZXRhaWxlZCBlcnJvciBjb2RlcyB0aGF0IGNhbiBoZWxwIHBpbnBvaW50IHRoZSBleGFjdCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uIEl0IHdvdWxkIGFsc28gYmUgZ29vZCB0byBzZWUgaG93IGl0IG1pZ2h0IHJlYWN0IHRvIHRyYW5zaWVudCBlcnJvcnMsIG1heWJlIHJldHJ5aW5nIGlmIGEgY2hlY2tzdW0gZmFpbHMgYSBjb3VwbGUgb2YgdGltZXMgYmVmb3JlIGRlY2xhcmluZyBkZWZlYXQuXG5cbkZpbmFsbHksIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiB0byBiZSBwZXJmb3JtYW5jZS1jb25zY2lvdXMuIFRoaXMgdmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBrZXJuZWwgZGF0YSBwYXRoIGFuZCB3aWxsIGJlIHBvdGVudGlhbGx5IGNhbGxlZCBtaWxsaW9ucyBvZiB0aW1lcyBwZXIgc2Vjb25kLiBTbywgZWZmaWNpZW50IGFsZ29yaXRobXMgYW5kIG1pbmltYWwgb3ZlcmhlYWQgYXJlIGNydWNpYWwuIEknbGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBhbmQgdGhpbmtpbmcgYWJvdXQgaG93IEkgY291bGQgb3B0aW1pemUgdGhlbSBpZiBuZWNlc3NhcnkuIFRpbWUgdG8gZGlnIGluIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjg2MSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjQ2LjEyNTk3NTg2OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDE5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbXNnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjQ1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjQ1OlxcdC8qIHRpcGNfbXNnX3ZhbGlkYXRlIC0gdmFsaWRhdGUgYmFzaWMgZm9ybWF0IG9mIHJlY2VpdmVkIG1lc3NhZ2VcXG4gMjQ2OlxcdCAqXFxuIDI0NzpcXHQgKiBUaGlzIHJvdXRpbmUgZW5zdXJlcyBhIFRJUEMgbWVzc2FnZSBoYXMgYW4gYWNjZXB0YWJsZSBoZWFkZXIsIGFuZCBhdCBsZWFzdFxcbiAyNDg6XFx0ICogYXMgbXVjaCBkYXRhIGFzIHRoZSBoZWFkZXIgaW5kaWNhdGVzIGl0IHNob3VsZC4gIFRoZSByb3V0aW5lIGFsc28gZW5zdXJlc1xcbiAyNDk6XFx0ICogdGhhdCB0aGUgZW50aXJlIG1lc3NhZ2UgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgbWFpbiBmcmFnbWVudCBvZiB0aGUgbWVzc2FnZVxcbiAyNTA6XFx0ICogYnVmZmVyLCB0byBzaW1wbGlmeSBmdXR1cmUgYWNjZXNzIHRvIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcy5cXG4gMjUxOlxcdCAqXFxuIDI1MjpcXHQgKiBOb3RlOiBIYXZpbmcgZXh0cmEgaW5mbyBwcmVzZW50IGluIHRoZSBtZXNzYWdlIGhlYWRlciBvciBkYXRhIGFyZWFzIGlzIE9LLlxcbiAyNTM6XFx0ICogVElQQyB3aWxsIGlnbm9yZSB0aGUgZXhjZXNzLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIG9wdGlvbmFsIGluZm9cXG4gMjU0OlxcdCAqIGludHJvZHVjZWQgYnkgYSBsYXRlciByZWxlYXNlIG9mIHRoZSBwcm90b2NvbC5cXG4gMjU1OlxcdCAqL1xcbiAyNTY6XFx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpXFxuIDI1NzpcXHR7XFxuIDI1ODpcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKl9za2I7XFxuIDI1OTpcXHRcXHRzdHJ1Y3QgdGlwY19tc2cgKmhkcjtcXG4gMjYwOlxcdFxcdGludCBtc3osIGhzejtcXG4gMjYxOlxcdFxcbiAyNjI6XFx0XFx0LyogRW5zdXJlIHRoYXQgZmxvdyBjb250cm9sIHJhdGlvIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgKi9cXG4gMjYzOlxcdFxcdGlmICh1bmxpa2VseShza2ItXFx1MDAzZXRydWVzaXplIC8gYnVmX3JvdW5kdXBfbGVuKHNrYikgXFx1MDAzZT0gNCkpIHtcXG4gMjY0OlxcdFxcdFxcdHNrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIEJVRl9IRUFEUk9PTSwgMCwgR0ZQX0FUT01JQyk7XFxuIDI2NTpcXHRcXHRcXHRpZiAoIXNrYilcXG4gMjY2OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMjY3OlxcdFxcdFxcdGtmcmVlX3NrYigqX3NrYik7XFxuIDI2ODpcXHRcXHRcXHQqX3NrYiA9IHNrYjtcXG4gMjY5OlxcdFxcdH1cXG4gMjcwOlxcdFxcbiAyNzE6XFx0XFx0aWYgKHVubGlrZWx5KFRJUENfU0tCX0NCKHNrYiktXFx1MDAzZXZhbGlkYXRlZCkpXFxuIDI3MjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMjczOlxcdFxcbiAyNzQ6XFx0XFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgTUlOX0hfU0laRSkpKVxcbiAyNzU6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyNzY6XFx0XFxuIDI3NzpcXHRcXHRoc3ogPSBtc2dfaGRyX3N6KGJ1Zl9tc2coc2tiKSk7XFxuIDI3ODpcXHRcXHRpZiAodW5saWtlbHkoaHN6IFxcdTAwM2MgTUlOX0hfU0laRSkgfHwgKGhzeiBcXHUwMDNlIE1BWF9IX1NJWkUpKVxcbiAyNzk6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyODA6XFx0XFx0aWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaHN6KSkpXFxuIDI4MTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI4MjpcXHRcXG4gMjgzOlxcdFxcdGhkciA9IGJ1Zl9tc2coc2tiKTtcXG4gMjg0OlxcdFxcdGlmICh1bmxpa2VseShtc2dfdmVyc2lvbihoZHIpICE9IFRJUENfVkVSU0lPTikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjQ2LjEyNjA3OTI4OVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MjI2Njk0MDc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVElQQyBNZXNzYWdlIFZhbGlkYXRpb24gYW5kIERpc2NvdmVyeSBSZWNlaXZlIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCBgdGlwY19tc2dfdmFsaWRhdGVgIHNlZW1zIHRvIGJlIGRvaW5nIHNvbWUgYmFzaWMgY2hlY2tzIHVzaW5nIGBwc2tiX21heV9wdWxsYC4gU3BlY2lmaWNhbGx5LCBpdCBlbnN1cmVzIHRoZSBgc2tiYCAoc29ja2V0IGJ1ZmZlcikgaGFzIGF0IGxlYXN0IGBNSU5fSF9TSVpFYCAod2hpY2ggaXMgMjQgYnl0ZXMpIGF2YWlsYWJsZS4gVGhlbiwgaXQgZGV0ZXJtaW5lcyB0aGUgaGVhZGVyIHNpemUgKGBoc3pgKSB1c2luZyBgbXNnX2hkcl9zemAgYW5kIHJlLWNoZWNrcyB0aGUgYHNrYmAgdXNpbmcgYHBza2JfbWF5X3B1bGwoc2tiLCBoc3opYC4gU28gdGhlIGZ1bmN0aW9uIGlzIHNldCB1cCBzbyBgc2tiLVx1MDAzZWxlbmAgc2hvdWxkIGJlIGF0IGxlYXN0IGBoc3pgLCBhbmQgdGhvc2UgYGhzemAgYnl0ZXMgYXJlIGRlZmluaXRlbHkgbGluZWFyIHdpdGhpbiB0aGUgYHNrYmAuXG5cbldhaXQgYSBtaW51dGUsIGBNSU5fSF9TSVpFYCBpcyAqb25seSogMjQgYnl0ZXMuIFRoYXQncyBhIGtleSBvYnNlcnZhdGlvbi5cblxuTm93LCB0aGUgcGF0Y2ggZm9yIGB0aXBjX2Rpc2NfcmN2YCBjb21lcyBpbnRvIHBsYXkuIEl0IGhhcyB0aGlzIGNoZWNrOlxuYGBgY1xuXHRpZiAobXNnX2hkcl9zeihoZHIpIFx1MDAzYyBNQVhfSF9TSVpFIHx8XG5cdCAgICBtc2dfc2l6ZShoZHIpIFx1MDAzYyBNQVhfSF9TSVpFICsgTk9ERV9JRF9MRU4pIHtcbmBgYFxuYW5kIGBNQVhfSF9TSVpFYCBpcyA2MCBieXRlcy4gU28sIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgKm9ubHkqIG1ha2luZyBzdXJlIGBoc3pgIGJ5dGVzIGFyZSBsaW5lYXIgYW5kIGF2YWlsYWJsZS4gQW5kIGlmIGBoc3pgIGlzLCBzYXksIDI0IGJ5dGVzLCB0aGUgdmFsaWRhdGlvbiAqc3VjY2VlZHMqLlxuXG5IZXJlJ3MgdGhlIHByb2JsZW06IGB0aXBjX2Rpc2NfcmN2YCBpcyB0aGVuIGNhbGxlZC4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgd2FzIHRyeWluZyB0byByZWFkIGBtc2dfcGVlcl9uZXRfaGFzaChoZHIpYCB3aGljaCBpcyBhdCBvZmZzZXQgNTIgKHdvcmQgMTMpLiBCdXQgcmVtZW1iZXIsIGBoc3pgIGNhbiBiZSBhcyBsb3cgYXMgMjQgYnl0ZXMhXG5cblNvLCB0aGUgb3JpZ2luYWwgY29kZSByZWFkcyBvZmZzZXQgNTIsIHdoaWNoIGlzICpiZXlvbmQqIGBoc3pgLiBJdCdzIGNsZWFybHkgYSByZWFkIG91dCBvZiBib3VuZHMuIFRoaXMgaXMgYSBjbGFzc2ljIHZ1bG5lcmFiaWxpdHkhIEJ1dCB0aGUgcXVlc3Rpb24gaXM6IGlzIGl0IGFsc28gYmV5b25kIHRoZSBgc2tiLVx1MDAzZWxlbmA/IFRoYXQgSSB3aWxsIG5lZWQgdG8gY2hlY2sgd2l0aCBmdXJ0aGVyIGFuYWx5c2lzIG9mIHRoZSBjb2RlLlxuXG5gdGlwY19tc2dfdmFsaWRhdGVgIGFsc28gY2hlY2tzOlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA1MiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU1OjUzLjM1Mjc3NTg2N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjQzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3RpcGMvbXNnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjg1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjg1OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMjg2OlxcdFxcbiAyODc6XFx0XFx0bXN6ID0gbXNnX3NpemUoaGRyKTtcXG4gMjg4OlxcdFxcdGlmICh1bmxpa2VseShtc3ogXFx1MDAzYyBoc3opKVxcbiAyODk6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyOTA6XFx0XFx0aWYgKHVubGlrZWx5KChtc3ogLSBoc3opIFxcdTAwM2UgVElQQ19NQVhfVVNFUl9NU0dfU0laRSkpXFxuIDI5MTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDI5MjpcXHRcXHRpZiAodW5saWtlbHkoc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBtc3opKVxcbiAyOTM6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiAyOTQ6XFx0XFxuIDI5NTpcXHRcXHRUSVBDX1NLQl9DQihza2IpLVxcdTAwM2V2YWxpZGF0ZWQgPSAxO1xcbiAyOTY6XFx0XFx0cmV0dXJuIHRydWU7XFxuIDI5NzpcXHR9XFxuIDI5ODpcXHRcXG4gMjk5OlxcdC8qKlxcbiAzMDA6XFx0ICogdGlwY19tc2dfZnJhZ21lbnQgLSBidWlsZCBhIGZyYWdtZW50IHNrYiBsaXN0IGZvciBUSVBDIG1lc3NhZ2VcXG4gMzAxOlxcdCAqXFxuIDMwMjpcXHQgKiBAc2tiOiBUSVBDIG1lc3NhZ2Ugc2tiXFxuIDMwMzpcXHQgKiBAaGRyOiBpbnRlcm5hbCBtc2cgaGVhZGVyIHRvIGJlIHB1dCBvbiB0aGUgdG9wIG9mIHRoZSBmcmFnbWVudHNcXG4gMzA0OlxcdCAqIEBwa3RtYXg6IG1heCBzaXplIG9mIGEgZnJhZ21lbnQgaW5jbC4gdGhlIGhlYWRlclxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NTo1My4zNTI5MDE5NThaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTczMjQ5MTc0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyoqXG5cbk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIGB0aXBjX21zZ192YWxpZGF0ZWAgaXMgY2hlY2tpbmcgaWYgYHNrYi1cdTAwM2VsZW5gIGlzIGxlc3MgdGhhbiBgbXN6YC4gIFNvLCBpZiB0aGF0IGNoZWNrIHBhc3NlcywgYHNrYi1cdTAwM2VsZW5gIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYG1zemAuIE5vdywgaWYgYSBwYWNrZXQgY29tZXMgaW4gd2l0aCBhIGhlYWRlciBzaXplIChgaHN6YCkgb2YgMjQgYW5kIHRoZSBtaW5pbXVtIHNpemUgKGBtc3pgKSBpcyBhbHNvIDI0LCB0aGVuIGBza2ItXHUwMDNlbGVuYCBjYW4gYmUgZXhhY3RseSAyNC4gIFRoYXQgc2V0cyB0aGUgc3RhZ2UuLi5cblxuVGhlbiwgYHRpcGNfZGlzY19yY3ZgIHRyaWVzIHRvIHJlYWQgZGF0YSBhdCBhbiBvZmZzZXQgb2YgNTIuIEhvbGQgb24uLi4gaWYgYHNrYi1cdTAwM2VsZW5gIGlzICpvbmx5KiAyNCwgdHJ5aW5nIHRvIHJlYWQgYXQgb2Zmc2V0IDUyIGlzIGNsZWFybHkgb3V0LW9mLWJvdW5kcyEgIFdlJ3JlIHJlYWRpbmcgcGFzdCB3aGF0IHRoZSBuZXR3b3JrIGRyaXZlciBhY3R1YWxseSBpbml0aWFsaXplZCBpbiB0aGUgU0tCLiAgVGhpcyBtZWFucyB3ZSBhcmUgYXR0ZW1wdGluZyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBvciwgcG90ZW50aWFsbHksIG9sZCBwYWNrZXQgZGF0YSBzdGlsbCBpbiB0aGUgYnVmZmVyLlxuXG5UaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGF0IEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIHdvbid0IGNhdGNoIHRoaXMsIGFzIGxvbmcgYXMgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGxhcmdlciB0aGFuIDUyIGJ5dGVzICh3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlKS4gQSAyNTYtYnl0ZSBidWZmZXIgd291bGQgbm90IGJlIGNhdWdodCBieSBLQVNBTi4gIEhvd2V2ZXIsIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplcikgKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgaXQgZmxhZ3MgdGhlIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZC5cblxuV2FpdCwgaXMgdGhhdCByaWdodD8gRG9lcyBLTVNBTiBhY3R1YWxseSBtYXJrIHRob3NlIGJ5dGVzIGJleW9uZCBgc2tiLVx1MDAzZWxlbmAgYXMgdW5pbml0aWFsaXplZD8gWWVzLCB0aGF0J3MgcmlnaHQuIEtNU0FOIG9ubHkgdW5wb2lzb25zIHRoZSBkYXRhIGFjdHVhbGx5IGNvcGllZCBpbnRvIHRoZSBza2IsIGxlYXZpbmcgdGhlIHJlc3Qgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgcG9pc29uZWQuIFRoZXJlZm9yZSB0aGlzIGlzIGEgY2xhc3NpYyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHRoYXQgS0FTQU4gbWlzc2VzLCBidXQgS01TQU4gY2F0Y2hlcy5cblxuSG9sZCBvbiwgdGhlIHBhdGNoIEknbSBsb29raW5nIGF0IGFsc28gYWRkcyBgc2tiX2xpbmVhcml6ZShza2IpYC4gIFdoeT8gIEFoLCBJIHNlZS4gRXZlbiBpZiB0aGUgdG90YWwgbWVzc2FnZSBzaXplIChgbXNnX3NpemUoaGRyKWApIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgTUFYX0hfU0laRSArIE5PREVfSURfTEVOYCwgdGhlIGRhdGEgYWZ0ZXIgdGhlIGhlYWRlciBjb3VsZCBiZSBmcmFnbWVudGVkLiBgdGlwY19tc2dfdmFsaWRhdGVgIG9ubHkgZG9lcyBhIGBwc2tiX21heV9wdWxsKHNrYiwgaHN6KWAuIFNvIGlmIGBoc3pgIGlzIDYwLCBpdCAqcHVsbHMqIDYwIGJ5dGVzLiBCdXQgdGhlIGNvZGUgYWxzbyByZWFkcyBgcGVlcl9pZGAgYXQgYG1zZ19ub2RlX2lkKGhkcilgLiBXaGVyZSBpcyBgbXNnX25vZGVfaWQoaGRyKWAgbG9jYXRlZD8gSSBuZWVkIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgZGVlcGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTIzMCwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjAzLjA4NTM5NjI0NFoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDY3MjA3MjUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXNnX25vZGVfaWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3RpcGMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmM9MTkzPXZvaWQgdGlwY19kaXNjX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTI0MC1cXHRpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClcXG5uZXQvdGlwYy9kaXNjb3Zlci5jOjI0MTpcXHRcXHRtZW1jcHkocGVlcl9pZCwgbXNnX25vZGVfaWQoaGRyKSwgTk9ERV9JRF9MRU4pO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjQyLVxcdGVsc2VcXG4tLVxcbm5ldC90aXBjL21zZy5oPTExNDU9c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxcbi0tXFxubmV0L3RpcGMvbXNnLmgtMTE0OS1cXG5uZXQvdGlwYy9tc2cuaDoxMTUwOnN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxcbm5ldC90aXBjL21zZy5oLTExNTEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjowMy4xMzIxMjMxNzlaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQ0MTIyOTQ0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gdGhlIFRJUEMgTWVzc2FnaW5nIFN0cnVjdHVyZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBkZWx2ZSBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiBUSVBDIG1lc3NhZ2luZy4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgSSBzaG91bGQgc3RhcnQgYnkgdmVyaWZ5aW5nIGhvdyBgbXNnX25vZGVfaWRgIGlzIGRlZmluZWQgYW5kIHVzZWQuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgYG5ldC90aXBjL21zZy5oYCBoZWFkZXIgZmlsZS4gVGhhdCdzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyBub2RlIElEcyBhcmUgaGFuZGxlZCBhdCB0aGUgbWVzc2FnZSBsZXZlbCwgcmlnaHQ/IEdvdHRhIG1ha2Ugc3VyZSBteSBhc3N1bXB0aW9ucyBhYm91dCBob3cgdGhleSdyZSBwYXNzZWQgYW5kIGludGVycHJldGVkIGFyZSBjb3JyZWN0LCBiZWZvcmUgSSBzdGFydCB0cmFjaW5nIHRoaW5ncyBmdXJ0aGVyLiBUaGlzIGlzIGZ1bmRhbWVudGFsIHRvIHVuZGVyc3RhbmRpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMgSSdtIGxvb2tpbmcgYXQgd2l0aCBUSVBDIGNvbW11bmljYXRpb24uIExldCdzIHNlZSB3aGF0IHRoYXQgaGVhZGVyIHJldmVhbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDk4LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MDYuNTczMzU1NTUxWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90aXBjL21zZy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNDUsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNDU6XFx0c3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9pZChzdHJ1Y3QgdGlwY19tc2cgKmhkciwgdTggKmlkKVxcbjExNDY6XFx0e1xcbjExNDc6XFx0XFx0bWVtY3B5KG1zZ19kYXRhKGhkciksIGlkLCAxNik7XFxuMTE0ODpcXHR9XFxuMTE0OTpcXHRcXG4xMTUwOlxcdHN0YXRpYyBpbmxpbmUgdTggKm1zZ19ub2RlX2lkKHN0cnVjdCB0aXBjX21zZyAqaGRyKVxcbjExNTE6XFx0e1xcbjExNTI6XFx0XFx0cmV0dXJuICh1OCAqKW1zZ19kYXRhKGhkcik7XFxuMTE1MzpcXHR9XFxuMTE1NDpcXHRcXG4xMTU1OlxcdHN0cnVjdCBza19idWZmICp0aXBjX2J1Zl9hY3F1aXJlKHUzMiBzaXplLCBnZnBfdCBnZnApO1xcbjExNTY6XFx0Ym9vbCB0aXBjX21zZ192YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqKl9za2IpO1xcbjExNTc6XFx0Ym9vbCB0aXBjX21zZ19yZXZlcnNlKHUzMiBvd25fYWRkciwgc3RydWN0IHNrX2J1ZmYgKipza2IsIGludCBlcnIpO1xcbjExNTg6XFx0dm9pZCB0aXBjX3NrYl9yZWplY3Qoc3RydWN0IG5ldCAqbmV0LCBpbnQgZXJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbjExNTk6XFx0XFx0XFx0ICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjA2LjU3MzQ1MTIwMVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyMDM1OTc3MDM2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBhIFBvdGVudGlhbCBLTVNBTi1EZXRlY3RhYmxlIFZ1bG5lcmFiaWxpdHkgaW4gVElQQyBNZXNzYWdlIEhhbmRsaW5nKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBzZWVtcyB0aGF0IHdoZW4gVElQQyBtZXNzYWdlcyBhcmUgcHJvY2Vzc2VkLCBzcGVjaWZpY2FsbHkgd2l0aGluIGB0aXBjX2Rpc2NfcmN2YCwgdGhlcmUncyBhIHJpc2sgb2YgcmVhZGluZyBiZXlvbmQgdGhlIGludGVuZGVkIGhlYWRlciBhbmQgcGF5bG9hZCBib3VuZGFyaWVzIG9mIHRoZSBgc2tiYCAoc29ja2V0IGJ1ZmZlcikuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBgbXNnX25vZGVfaWRgIHJldHVybnMgZGF0YSB0aGF0IGxpZXMgKmFmdGVyKiB0aGUgaGVhZGVyLCBhbmQgbXkgaW5zdGluY3QgdGVsbHMgbWUgdGhhdCB0aGlzIGNvdWxkIGJlIGEgcHJvYmxlbS4gSWYgYHRpcGNfbXNnX3ZhbGlkYXRlYCBpcyBvbmx5IGNoZWNraW5nIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgKGBoc3pgKSwgd2UgY291bGQgYmUgYWNjZXNzaW5nIGRhdGEgaW4gbm9uLWNvbnRpZ3VvdXMgZnJhZ21lbnRzLCB0aGUgaW5mYW1vdXMgYHNrYl9zaGluZm8oc2tiKS1cdTAwM2VmcmFnc2AuXG5cbk5vdywgaWYgYHRpcGNfZGlzY19yY3ZgIHRoZW4gdHJpZXMgdG8gYG1lbWNweWAgZnJvbSBgbXNnX25vZGVfaWRgLCBpdCB3aWxsIHJlYWQgZGF0YSB3aGljaCBpcyBiZXlvbmQgdGhlIGFsbG9jYXRlZCBsaW5lYXIgcGFydCAoYHNrYi1cdTAwM2VkYXRhICsgc2tiX2hlYWRsZW4oc2tiKWApLiBUaGUgaW1tZWRpYXRlIGNvbmNlcm4gaXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLiBLQVNBTiAqbWlnaHQqIGNhdGNoIHRoaXMgaWYgdGhlIGxpbmVhciBidWZmZXIgZW5kcyBleGFjdGx5IHdoZXJlIHRoZSBoZWFkZXIgZG9lcy4gSG93ZXZlciwgbmV0d29yayBkcml2ZXJzIHVzdWFsbHkgYWxsb2NhdGUgbW9yZSBidWZmZXIgc3BhY2UgdGhhbiBpcyBzdHJpY3RseSBuZWVkZWQgZm9yIHRoZSBpbml0aWFsIGhlYWRlci4gU2F5LCBhIDI1Ni1ieXRlIGJ1ZmZlciwgYW5kIGBza2JfaGVhZGxlbmAgaXMgb25seSA2MCBieXRlcy4gVGhlIHJlYWQgb2YgYG1zZ19ub2RlX2lkYCBtaWdodCBzdGF5IHdpdGhpbiB0aGUgYWxsb2NhdGVkIDI1NiBieXRlcy4gS0FTQU4gd291bGQgbWlzcyBpdC5cblxuVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBFdmVuIGlmIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGxpbmVhciBidWZmZXIsIGFueXRoaW5nICpiZXlvbmQqIGBza2JfaGVhZGxlbmAgaXMgdXN1YWxseSB1bmluaXRpYWxpemVkIG9yIGNvbnRhaW5zIHN0YWxlIGRhdGEuIEtNU0FOLCAqc3BlY2lmaWNhbGx5KiwgaXMgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcy4gQmVjYXVzZSB0aGUgbmV0d29yayBzdGFjayBleHBsaWNpdGx5IHBvaXNvbnMgdGhlIHRhaWxyb29tLiBTbywgYW55IHJlYWQgZnJvbSB0aGVyZSBzaG91bGQgYmUgZmxhZ2dlZCBhcyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuXG5cblRoaXMgc2NlbmFyaW8gbGVhZHMgdG8gYSBjbGVhciBjYXRlZ29yaXphdGlvbiBvZiBidWdzOlxuXG4xLiAgUmVhZGluZyBoZWFkZXIgZmllbGRzIGxpa2UgYG1zZ19wZWVyX25ldF9oYXNoYCB3aGVuIGBoc3pgIGlzIHNtYWxsZXIgdGhhbiB0aGUgb2Zmc2V0IG9mIHRoYXQgZmllbGQuIFRoaXMgcmVzdWx0cyBpbiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIHRoZSBsaW5lYXIgYnVmZmVyLlxuMi4gIFJlYWRpbmcgYG1zZ19ub2RlX2lkYCAocGFydCBvZiB0aGUgcGF5bG9hZCkgd2hlbiB0aGUgZGF0YSBpcyBmcmFnbWVudGVkIGFuZCBzaXRzIGJleW9uZCB0aGUgaGVhZGVyIHNpemUuIFRoaXMsIGFnYWluLCByZWFkcyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCBzdGFuZGFyZCBidWZmZXIgYWxsb2NhdGlvbiBzaXplcyBtYXNrIHRoZXNlIHJlYWRzIGZyb20gS0FTQU4uIEJ1dCBLTVNBTiwgd2l0aCBpdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJhY2tpbmcsIHdpbGwgY2F0Y2ggdGhlbSEgS01TQU4gaXMgdGhlICpwZXJmZWN0KiB0b29sIGhlcmUuXG5cbk5vdywgbGV0J3MgY29uc2lkZXIgdGhlIGluZm9ybWF0aW9uIGxlYWsgYXNwZWN0LiBUaGUgdW5pbml0aWFsaXplZCBkYXRhIGlzIHJlYWQgaW50byBsb2NhbCB2YXJpYWJsZXMgbGlrZSBgcG5ldF9oYXNoYCwgYGNhcHNgLCBgc3VnZ2AsIGFuZCBgbXR5cGAuIFRoZSBjb2RlIHRoZW4gdXNlcyB0aG9zZSB2YXJpYWJsZXMsIGFuZCBhIG1ham9yIGNvbmNlcm4gaXMgY29uZGl0aW9uYWwgYnJhbmNoaW5nLiBGb3IgaW5zdGFuY2UsIHRoZSBjb2RlIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcblxuKiAgIFRoZSBjb2RlIGNvcGllcyBgbXNnX25vZGVfaWRgIGlmIGBjYXBzIFx1MDAyNiBUSVBDX05PREVfSUQxMjhgLiBJZiBgY2Fwc2AgaXMgdW5pbml0aWFsaXplZCwgdGhlIGJyYW5jaCBpcyBkZXBlbmRlbnQgb24gdW5pbml0aWFsaXplZCBkYXRhLCB3aGljaCBLTVNBTiBjYXRjaGVzIHBlcmZlY3RseS5cbiogICBBbm90aGVyIGV4YW1wbGUgb2YgYSBicmFuY2ggaXMgYGlmIChtdHlwID09IERTQ19SRVFfTVNHKWAuIElmIGBtdHlwYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiBpcyBjZXJ0YWluIHRvIGNhdGNoIHRoZSBcInVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlXCIgZHVyaW5nIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uXG5cbk15IHJlYXNvbmluZywgaW4gc3VtbWFyeTpcblxuMS4gIFRoZSBwYXRjaCBhZGRyZXNzZXMgdW52YWxpZGF0ZWQgYWNjZXNzIHRvIGRhdGEgaW4gdGhlIGBza2JgLCBwb3RlbnRpYWxseSByZWFkaW5nIGJleW9uZCB3aGF0J3MgdmFsaWQuXG4yLiAgVHlwaWNhbCBuZXR3b3JrIGJ1ZmZlciBhbGxvY2F0aW9ucyAoMjU2IGJ5dGVzIGFuZCBsYXJnZXIpIG1lYW4gS0FTQU4gd29uJ3QgZmxhZyB0aGVzZSBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLlxuMy4gIFJlYWRzIGZyb20gdGhlIGBza2JgIHRhaWxyb29tIHdpbGwgYWNjZXNzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LlxuNC4gIEtNU0FOIGlzIHRoZSB0b29sIG9mIGNob2ljZSBiZWNhdXNlIG9mIGl0cyB1bmluaXRpYWxpemVkIG1lbW9yeSB0cmFja2luZy5cbjUuICBVbmluaXRpYWxpemVkIHZhbHVlcyBhcmUgdXNlZCBpbiBicmFuY2hpbmcgbG9naWMuXG42LiAgVGhlcmVmb3JlLCB0aGlzIGlzIGEgY2xlYXIgS01TQU4gY2FzZS5cblxuUmV2aWV3aW5nIHRoZSBwcm9tcHQgY3JpdGVyaWE6XG5UaGlzIHBhdGNoIGFkZHJlc3NlcyBib3RoIHBvaW50czpcblxuKiAgIEl0IGludHJvZHVjZXMgKG9yIG1vZGlmaWVzKSBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG4qICAgSXQgaW50cm9kdWNlcyBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLlxuXG5JdCdzIGEgcGVyZmVjdCBtYXRjaC4gSSdtIGNvbmZpZGVudCBpbiBzZXR0aW5nIGBOZWVkc0tNU0FOPXRydWVgLiBJdCBzZWVtcyBgdGlwY19kaXNjX3JjdmAgbWlnaHQgc2VuZCBhIHJlc3BvbnNlLiBJZiBzbywgaXQgbWlnaHQgZXZlbiBsZWFrIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBiYWNrIHRvIHRoZSBuZXR3b3JrLiBBbHRob3VnaCwgaXQgaXMgY2VydGFpbiBLTVNBTiB3aWxsIGNhdGNoIGl0IGJlY2F1c2UgaXQgaG9va3MgaW4gdGhlIG5ldHdvcmsgc3RhY2sgdG8gcG9pc29uIHRoZSB0YWlscm9vbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwMTQsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MjYuOTMzMjI0OTgzWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzExMTM1NCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGlwY19kaXNjX2J1aWxkX21zZ1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGlwYy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDE5OjU2OjI2Ljk4MDM1OTQ4OFoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM0NzU2NDQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBJJ20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgdGhvdWdodCBwcm9jZXNzLiBMZXQncyBnZXQgdGhpcyBkb25lLlxuKioqXG4qKkhvdyBEb2VzIFRoaXMgVGhpbmcgKkFjdHVhbGx5KiBXb3JrPyoqXG5cblJpZ2h0LCBzbyBJJ20gcmVhZGluZyB0aGlzLCBhbmQgaW1tZWRpYXRlbHkgdGhlIHF1ZXN0aW9uIGhpdHMgbWU6ICpob3cqIGRvZXMgdGhpcyBzeXN0ZW0gZ2VuZXJhdGUgdGhlc2UgcmVzcG9uc2VzPyBJIG1lYW4sIEkgY2FuIHNlZSB0aGUgb3V0cHV0LCBJIGNhbiB1bmRlcnN0YW5kIHRoZSBjb25jZXB0cyBpdCdzIHByZXNlbnRpbmcsIGJ1dCB0aGUgZnVuZGFtZW50YWwgbWVjaGFuaWNzLi4uIHRoYXQncyB3aGF0J3MgdHJ1bHkgZmFzY2luYXRpbmcuIEl0J3Mgbm90IGVub3VnaCB0byBzaW1wbHkgb2JzZXJ2ZSB0aGUgcmVzdWx0OyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBhcmNoaXRlY3R1cmUsIHRoZSBhbGdvcml0aG1zLCB0aGUgKnByb2Nlc3NlcyogdGhhdCBsZWFkIGZyb20gaW5wdXQgdG8gb3V0cHV0LiBJcyBpdCBydWxlLWJhc2VkPyBJcyBpdCBzdGF0aXN0aWNhbD8gSXMgaXQgYmFzZWQgb24gbmV1cmFsIG5ldHdvcmtzPyBXaGF0J3MgdGhlIG1vZGVsJ3MgdHJhaW5pbmcgZGF0YSBsb29rIGxpa2U/IEl0J3MgYWxsIGFib3V0IGhvdyBpdCB0YWtlcyBpbiBpbmZvcm1hdGlvbiwgcHJvY2Vzc2VzIGl0LCBhbmQgdGhlbiBjcmFmdHMgYW4gYW5zd2VyLiBUaGUgXCJob3dcIiBpcyB0aGUgY29yZSBvZiBldmVyeXRoaW5nLiBVbmRlcnN0YW5kaW5nIHRoYXQgd291bGQgdHJ1bHkgdW5sb2NrIGl0cyBwb3RlbnRpYWwuIEkgd2FudCB0byBrbm93IHRoZSBnZWFycyB0dXJuaW5nIGJlbmVhdGggdGhlIHN1cmZhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjQxLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozMC42MTUxMTk5MjlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MDExMzA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkRTQ19SRVFfTVNHXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3RpcGMvZGlzY292ZXIuYz0xNDE9c3RhdGljIGJvb2wgdGlwY19kaXNjX2FkZHJfdHJpYWxfbXNnKHN0cnVjdCB0aXBjX2Rpc2NvdmVyZXIgKmQsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE3Mi1cXHRcXHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cXHUwMDNlc2tiKSwgdG4tXFx1MDAzZXRyaWFsX2FkZHIpO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MTczOlxcdFxcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXFx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTE3NC1cXHR9XFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jPTE5Mz12b2lkIHRpcGNfZGlzY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0yNzUtXFx0XFx0cmV0dXJuO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6Mjc2OlxcdGlmIChtdHlwICE9IERTQ19SRVFfTVNHKVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtMjc3LVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmM9MzEzPXN0YXRpYyB2b2lkIHRpcGNfZGlzY190aW1lb3V0KHN0cnVjdCB0aW1lcl9saXN0ICp0KVxcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYy0zNDYtXFx0XFx0XFx0ZC1cXHUwMDNldGltZXJfaW50diA9IFRJUENfRElTQ19GQVNUO1xcbm5ldC90aXBjL2Rpc2NvdmVyLmM6MzQ3OlxcdFxcdG1zZ19zZXRfdHlwZShidWZfbXNnKGQtXFx1MDAzZXNrYiksIERTQ19SRVFfTVNHKTtcXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTM0OC1cXHRcXHRtc2dfc2V0X3ByZXZub2RlKGJ1Zl9tc2coZC1cXHUwMDNlc2tiKSwgdG4tXFx1MDAzZXRyaWFsX2FkZHIpO1xcbi0tXFxubmV0L3RpcGMvZGlzY292ZXIuYz0zNzA9aW50IHRpcGNfZGlzY19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jLTM4My1cXHR9XFxubmV0L3RpcGMvZGlzY292ZXIuYzozODQ6XFx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cXHUwMDNlc2tiLCBEU0NfUkVRX01TRywgYik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy0zODUtXFxuLS1cXG5uZXQvdGlwYy9kaXNjb3Zlci5jPTQyMT12b2lkIHRpcGNfZGlzY19yZXNldChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYilcXG4tLVxcbm5ldC90aXBjL2Rpc2NvdmVyLmMtNDI3LVxcdHNwaW5fbG9ja19iaChcXHUwMDI2ZC1cXHUwMDNlbG9jayk7XFxubmV0L3RpcGMvZGlzY292ZXIuYzo0Mjg6XFx0dGlwY19kaXNjX2luaXRfbXNnKG5ldCwgZC1cXHUwMDNlc2tiLCBEU0NfUkVRX01TRywgYik7XFxubmV0L3RpcGMvZGlzY292ZXIuYy00MjktXFx0ZC1cXHUwMDNlbmV0ID0gbmV0O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozMC42NjIxMzg0NjRaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjAxMjgzMzY3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgdGlwY19kaXNjX3JjdmAgKGFyb3VuZCBMaW5lIDI3NSkqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUsIGFuZCBJJ20gemVyb2luZyBpbiBvbiBgdGlwY19kaXNjX3JjdmAgbmVhciBsaW5lIDI3NS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhpcyBmdW5jdGlvbidzIGRvaW5nLiBgdGlwY19kaXNjX3JjdmAg4oCTIHJpZ2h0LCB0aGlzIGlzIGxpa2VseSB0aGUgZGlzY292ZXJ5IHJlY2VpdmUgaGFuZGxlciBmb3IgVElQQy4gSSdtIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQgaW4gaG93IHRoZSBkaXNjb3ZlcnkgcHJvY2VzcyBpcyBtYW5hZ2VkIGF0IHRoZSB0cmFuc3BvcnQgbGF5ZXIsIGVzcGVjaWFsbHkgaW4gcmVnYXJkcyB0byBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBpbmNvbWluZyBkaXNjb3ZlcnkgbWVzc2FnZXMsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG9wZXJhdGVzIG9uIGFuZCBhbnkgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaXQgZW1wbG95cy4gSSBleHBlY3QgdG8gZmluZCBzb21lIGxvZ2ljIGRlYWxpbmcgd2l0aCBmaWx0ZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBxdWV1aW5nIG9mIHRoZXNlIGRpc2NvdmVyeSBwYWNrZXRzLCBhbmQgSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGVycm9yIGhhbmRsaW5nIHRvIHNlZSBob3cgaXQgZ3JhY2VmdWxseSBtYW5hZ2VzIHVuZXhwZWN0ZWQgb3IgbWFsZm9ybWVkIG1lc3NhZ2VzLiBJJ2xsIGJlIHBhcnRpY3VsYXJseSB3YXRjaGZ1bCBmb3IgYW55IHBvdGVudGlhbCBmb3IgZGVhZGxvY2tzIG9yIGxvY2sgY29udGVudGlvbiB3aXRoaW4gdGhlIHJlY2VpdmUgcGF0aC4gQW5kIG9mIGNvdXJzZSwgSSdtIGFscmVhZHkgYW50aWNpcGF0aW5nIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGxpa2UgdGhlIGRlc2NyaXB0b3IgcXVldWVzIGFuZCB0aGUgbmV0d29yayBidWZmZXJzLCBhbmQgSSdsbCBiZSBjaGVja2luZyB0byBzZWUgaG93IGVmZmljaWVudGx5IHRoZXNlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZC4gRmluYWxseSwgSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgVElQQyBjb3JlIGFuZCB1c2VyLXNwYWNlIHByb2Nlc3NlcyB0aGF0IG1pZ2h0IGJlIHdhaXRpbmcgb24gZGlzY292ZXJ5IHJlc3VsdHMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2suXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNDk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMTk6NTY6MzYuNjc0OTc0ODUxWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4NjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90aXBjL2Rpc2NvdmVyLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjYwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjYwOlxcdFxcbiAyNjE6XFx0XFx0LyogTWVzc2FnZSBmcm9tIHNvbWVib2R5IHVzaW5nIHRoaXMgbm9kZSdzIGFkZHJlc3MgKi9cXG4gMjYyOlxcdFxcdGlmIChpbl9vd25fbm9kZShuZXQsIHNyYykpIHtcXG4gMjYzOlxcdFxcdFxcdGRpc2NfZHVwbF9hbGVydChiLCBzZWxmLCBcXHUwMDI2bWFkZHIpO1xcbiAyNjQ6XFx0XFx0XFx0cmV0dXJuO1xcbiAyNjU6XFx0XFx0fVxcbiAyNjY6XFx0XFx0aWYgKCF0aXBjX2luX3Njb3BlKGxlZ2FjeSwgZHN0LCBzZWxmKSlcXG4gMjY3OlxcdFxcdFxcdHJldHVybjtcXG4gMjY4OlxcdFxcdGlmICghdGlwY19pbl9zY29wZShsZWdhY3ksIGItXFx1MDAzZWRvbWFpbiwgc3JjKSlcXG4gMjY5OlxcdFxcdFxcdHJldHVybjtcXG4gMjcwOlxcdFxcdHRpcGNfbm9kZV9jaGVja19kZXN0KG5ldCwgc3JjLCBwZWVyX2lkLCBiLCBjYXBzLCBzaWduYXR1cmUsIHBuZXRfaGFzaCxcXG4gMjcxOlxcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm1hZGRyLCBcXHUwMDI2cmVzcG9uZCwgXFx1MDAyNmR1cGxfYWRkcik7XFxuIDI3MjpcXHRcXHRpZiAoZHVwbF9hZGRyKVxcbiAyNzM6XFx0XFx0XFx0ZGlzY19kdXBsX2FsZXJ0KGIsIHNyYywgXFx1MDAyNm1hZGRyKTtcXG4gMjc0OlxcdFxcdGlmICghcmVzcG9uZClcXG4gMjc1OlxcdFxcdFxcdHJldHVybjtcXG4gMjc2OlxcdFxcdGlmIChtdHlwICE9IERTQ19SRVFfTVNHKVxcbiAyNzc6XFx0XFx0XFx0cmV0dXJuO1xcbiAyNzg6XFx0XFx0dGlwY19kaXNjX21zZ194bWl0KG5ldCwgRFNDX1JFU1BfTVNHLCBzcmMsIHNlbGYsIDAsIFxcdTAwMjZtYWRkciwgYik7XFxuIDI3OTpcXHR9XFxuIDI4MDpcXHRcXG4gMjgxOlxcdC8qIHRpcGNfZGlzY19hZGRfZGVzdCAtIGluY3JlbWVudCBzZXQgb2YgZGlzY292ZXJlZCBub2Rlc1xcbiAyODI6XFx0ICovXFxuIDI4MzpcXHR2b2lkIHRpcGNfZGlzY19hZGRfZGVzdChzdHJ1Y3QgdGlwY19kaXNjb3ZlcmVyICpkKVxcbiAyODQ6XFx0e1xcbiAyODU6XFx0XFx0c3Bpbl9sb2NrX2JoKFxcdTAwMjZkLVxcdTAwM2Vsb2NrKTtcXG4gMjg2OlxcdFxcdGQtXFx1MDAzZW51bV9ub2RlcysrO1xcbiAyODc6XFx0XFx0c3Bpbl91bmxvY2tfYmgoXFx1MDAyNmQtXFx1MDAzZWxvY2spO1xcbiAyODg6XFx0fVxcbiAyODk6XFx0XFxuIDI5MDpcXHQvKiB0aXBjX2Rpc2NfcmVtb3ZlX2Rlc3QgLSBkZWNyZW1lbnQgc2V0IG9mIGRpc2NvdmVyZWQgbm9kZXNcXG4gMjkxOlxcdCAqL1xcbiAyOTI6XFx0dm9pZCB0aXBjX2Rpc2NfcmVtb3ZlX2Rlc3Qoc3RydWN0IHRpcGNfZGlzY292ZXJlciAqZClcXG4gMjkzOlxcdHtcXG4gMjk0OlxcdFxcdGludCBpbnR2LCBudW07XFxuIDI5NTpcXHRcXG4gMjk2OlxcdFxcdHNwaW5fbG9ja19iaChcXHUwMDI2ZC1cXHUwMDNlbG9jayk7XFxuIDI5NzpcXHRcXHRkLVxcdTAwM2VudW1fbm9kZXMtLTtcXG4gMjk4OlxcdFxcdG51bSA9IGQtXFx1MDAzZW51bV9ub2RlcztcXG4gMjk5OlxcdFxcdGludHYgPSBkLVxcdTAwM2V0aW1lcl9pbnR2O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1NjozNi42NzUwNTUwNzFaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE0MTM1ODgwMzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFRJUEMgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGZ1bmN0aW9uLCBhbmQgSSd2ZSBmb3VuZCBzb21ldGhpbmcgYWxhcm1pbmcuIEl0J3MgZ2V0dGluZyBjYWxsZWQgd2l0aCBgcGVlcl9pZGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcG5ldF9oYXNoYCDigJMgYWxsIG9mIHdoaWNoIGFyZSAqdW5pbml0aWFsaXplZCogdmFsdWVzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGBza2JgJ3MgdGFpbHJvb20uIE15IGd1dCBpcyBzY3JlYW1pbmcgdGhpcyBpcyBhIG1ham9yIHByb2JsZW0uXG5cbkVzc2VudGlhbGx5LCBgdGlwY19ub2RlX2NoZWNrX2Rlc3RgIGlzIGJlaW5nIGZlZCBqdW5rIGRhdGEsIGFuZCBpdCdzIHVzaW5nIHRoaXMgZ2FyYmFnZSB0byB1cGRhdGUgdGhlIG5vZGUncyBzdGF0ZS4gVGhhdCdzIGEgcmVjaXBlIGZvciBkaXNhc3RlcjogaW50ZXJuYWwgc3RhdGUgY29ycnVwdGlvbiwgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzLCB0aGUgd29ya3MuIFRoZSBzb3VyY2Ugb2YgdGhlIGlzc3VlIHNlZW1zIHRvIGJlIGluIGB0aXBjX2Rpc2NfcmN2YCwgd2hlcmUgdGhlIHBhY2tldCBkYXRhIGlzIGJlaW5nIHJlYWQgYmVmb3JlIHRoZSBwYWNrZXRzJ3MgaW50ZWdyaXR5IG9yIHNpemUgYXJlIHZlcmlmaWVkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSwgb3IgYmVmb3JlIGl0J3MgZXZlbiBsaW5lYXJpemVkIChgc2tiX2xpbmVhcml6ZWApLlxuXG5UaGUga2lja2VyIGlzLCB0aGlzICp3b24ndCogdHJpZ2dlciBLQVNBTi4gV2UncmUgdGFsa2luZyBhYm91dCByZWFkaW5nIGZyb20gdGhlIHRhaWxyb29tIG9mIGEgc3RhbmRhcmQtc2l6ZWQgYHNrX2J1ZmZgIGJ1ZmZlciwgbWVhbmluZyB0aGUgcmVhZCB3aWxsIGxpa2VseSBiZSB3aXRoaW4gdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBLQVNBTiBpcyBtZWFudCB0byBmaW5kIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBidXQgS01TQU4gaXMgZ29pbmcgdG8gYmUgbmVlZGVkIGhlcmUuIEtNU0FOIGlzIHRoZSByaWdodCB0b29sIGJlY2F1c2UgdGhlIHJlYWQgaXMgZ29pbmcgdG8gYmUgd2l0aGluIHRoZSBib3VuZHMsIGJ1dCBmcm9tICp1bmluaXRpYWxpemVkKiBtZW1vcnkuIFRoaXMgZGF0YSBpcyB0aGVuIGJlaW5nIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHNvIHRoaXMgaXMgcHJlY2lzZWx5IHdoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gZGV0ZWN0LiBLTVNBTiB3aWxsIGhpZ2hsaWdodCB0aGUgdXNlIG9mIHRoZXNlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFuZCB0aGUgY29uc2VxdWVuY2VzIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoZW0uIFdlIGFic29sdXRlbHkgbmVlZCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiB0byBjb25maXJtIHRoaXMgZml4IGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGluc2lkaW91cyB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGx1cmtpbmcgaW4gVElQQyBwYWNrZXQgcGFyc2luZyBsb2dpYy4gKipOZWVkc0tNU0FOID0gdHJ1ZS4qKlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTQ5MiwiT3V0cHV0VG9rZW5zIjozODEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQxOTo1Njo0OC4wODg2NDYwNzVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzQ1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGFuIGlzc3VlIGluIGB0aXBjX2Rpc2NfcmN2YCB3aGVyZSBUSVBDIGRpc2NvdmVyeSBtZXNzYWdlIGZpZWxkcyAoc3VjaCBhcyBgcG5ldF9oYXNoYCwgYGNhcHNgLCBgc2lnbmF0dXJlYCwgYW5kIGBwZWVyX2lkYCkgYXJlIHJlYWQgZnJvbSB0aGUgYHNrX2J1ZmZgIGJlZm9yZSB2ZXJpZnlpbmcgdGhhdCB0aGUgcGFja2V0IGFjdHVhbGx5IGNvbnRhaW5zIGEgZnVsbCBoZWFkZXIgYW5kIHBheWxvYWQgKGBtc2dfaGRyX3N6YCBhbmQgYG1zZ19zaXplYCBjaGVja3MpIGFuZCBiZWZvcmUgZW5zdXJpbmcgdGhlIGRhdGEgaXMgbGluZWFyaXplZCAoYHNrYl9saW5lYXJpemVgKS4gXFxuXFxuV2hlbiBhIG1hbGljaW91c2x5IHNtYWxsIG9yIGZyYWdtZW50ZWQgcGFja2V0IGlzIHJlY2VpdmVkLCByZWFkaW5nIHRoZXNlIGZpZWxkcyBhY2Nlc3NlcyB0aGUgdGFpbHJvb20gb2YgdGhlIGBza19idWZmYCBkYXRhIGJ1ZmZlci4gQmVjYXVzZSBuZXR3b3JrIGRyaXZlcnMgdHlwaWNhbGx5IGFsbG9jYXRlIHN0YW5kYXJkLXNpemVkIGNodW5rcyAoZS5nLiwgMjU2LCAxNTAwLCBvciAyMDQ4IGJ5dGVzKSBmb3IgYHNrX2J1ZmZgIGRhdGEsIHRoZXNlIHJlYWRzIHdpbGwgbGlrZWx5IGZhbGwgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBoZWFwIGNodW5rLiBDb25zZXF1ZW50bHksIEtBU0FOIHdpbGwgTk9UIGRldGVjdCB0aGlzIGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cXG5cXG5Ib3dldmVyLCB0aGUgdGFpbHJvb20gYnl0ZXMgYmV5b25kIGBza2ItXFx1MDAzZWxlbmAgb3IgYHNrYl9oZWFkbGVuYCBhcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKGFuZCBhcmUgZXhwbGljaXRseSBwb2lzb25lZCBieSBLTVNBTidzIG5ldHdvcmsgaG9va3MpLiBUaGUgdW5pbml0aWFsaXplZCB2YWx1ZXMgYXJlIHRoZW4gdXNlZCBpbiBjb25kaXRpb25hbCBsb2dpYyAoZS5nLiwgYGlmIChjYXBzIFxcdTAwMjYgVElQQ19OT0RFX0lEMTI4KWAsIGBpZiAobXR5cCA9PSBEU0NfUkVRX01TRylgKSBhbmQgcGFzc2VkIHRvIGB0aXBjX25vZGVfY2hlY2tfZGVzdCgpYCwgd2hpY2ggY291bGQgY29ycnVwdCBpbnRlcm5hbCBzdGF0ZSBvciBsZWFkIHRvIGluZm8tbGVha3MuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgZGVwZW5kaW5nIG9uIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBtYWtpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGhpZ2hseSBqdXN0aWZpZWQgdG8gdmVyaWZ5IHRoaXMgZml4IGFuZCBlbnN1cmUgbm8gb3RoZXIgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgaW4gdGhlIFRJUEMgcGFja2V0IHBhcnNpbmcgbG9naWMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhbiBpc3N1ZSBpbiBgdGlwY19kaXNjX3JjdmAgd2hlcmUgVElQQyBkaXNjb3ZlcnkgbWVzc2FnZSBmaWVsZHMgKHN1Y2ggYXMgYHBuZXRfaGFzaGAsIGBjYXBzYCwgYHNpZ25hdHVyZWAsIGFuZCBgcGVlcl9pZGApIGFyZSByZWFkIGZyb20gdGhlIGBza19idWZmYCBiZWZvcmUgdmVyaWZ5aW5nIHRoYXQgdGhlIHBhY2tldCBhY3R1YWxseSBjb250YWlucyBhIGZ1bGwgaGVhZGVyIGFuZCBwYXlsb2FkIChgbXNnX2hkcl9zemAgYW5kIGBtc2dfc2l6ZWAgY2hlY2tzKSBhbmQgYmVmb3JlIGVuc3VyaW5nIHRoZSBkYXRhIGlzIGxpbmVhcml6ZWQgKGBza2JfbGluZWFyaXplYCkuIFxcblxcbldoZW4gYSBtYWxpY2lvdXNseSBzbWFsbCBvciBmcmFnbWVudGVkIHBhY2tldCBpcyByZWNlaXZlZCwgcmVhZGluZyB0aGVzZSBmaWVsZHMgYWNjZXNzZXMgdGhlIHRhaWxyb29tIG9mIHRoZSBgc2tfYnVmZmAgZGF0YSBidWZmZXIuIEJlY2F1c2UgbmV0d29yayBkcml2ZXJzIHR5cGljYWxseSBhbGxvY2F0ZSBzdGFuZGFyZC1zaXplZCBjaHVua3MgKGUuZy4sIDI1NiwgMTUwMCwgb3IgMjA0OCBieXRlcykgZm9yIGBza19idWZmYCBkYXRhLCB0aGVzZSByZWFkcyB3aWxsIGxpa2VseSBmYWxsIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBhbGxvY2F0ZWQgaGVhcCBjaHVuay4gQ29uc2VxdWVudGx5LCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgdGhpcyBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIHRhaWxyb29tIGJ5dGVzIGJleW9uZCBgc2tiLVxcdTAwM2VsZW5gIG9yIGBza2JfaGVhZGxlbmAgYXJlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChhbmQgYXJlIGV4cGxpY2l0bHkgcG9pc29uZWQgYnkgS01TQU4ncyBuZXR3b3JrIGhvb2tzKS4gVGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFyZSB0aGVuIHVzZWQgaW4gY29uZGl0aW9uYWwgbG9naWMgKGUuZy4sIGBpZiAoY2FwcyBcXHUwMDI2IFRJUENfTk9ERV9JRDEyOClgLCBgaWYgKG10eXAgPT0gRFNDX1JFUV9NU0cpYCkgYW5kIHBhc3NlZCB0byBgdGlwY19ub2RlX2NoZWNrX2Rlc3QoKWAsIHdoaWNoIGNvdWxkIGNvcnJ1cHQgaW50ZXJuYWwgc3RhdGUgb3IgbGVhZCB0byBpbmZvLWxlYWtzLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhbHVlcywgbWFraW5nIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBoaWdobHkganVzdGlmaWVkIHRvIHZlcmlmeSB0aGlzIGZpeCBhbmQgZW5zdXJlIG5vIG90aGVyIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IGluIHRoZSBUSVBDIHBhY2tldCBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[1] Phase: Succeeded StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 19:56:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 19:56:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2] Phase: Succeeded StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 20:50:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN) Phase: Failed StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 20:50:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 19:57:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-18 19:56:59 +0000 UTC FinishedAt: 2026-08-18 19:57:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflowl4c8r/series-workflowl4c8r-convert-artifact-3676036261/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-18 19:57:09 +0000 UTC FinishedAt: 2026-08-18 20:18:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-18 19:57:09 +0000 UTC FinishedAt: 2026-08-18 20:18:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*dc42becf-5c2d-4c9e-bf60-a2220ef5a416,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-workflowl4c8r/series-workflowl4c8r-convert-artifact-3676036261/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": "a48c8f3d-76b5-43e5-85bb-d8a9ca3f28ef", "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-workflowl4c8r/series-workflowl4c8r-build-action-3408902347/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-18 19:57:09 +0000 UTC FinishedAt: 2026-08-18 20:18:10 +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:*dc42becf-5c2d-4c9e-bf60-a2220ef5a416,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-workflowl4c8r/series-workflowl4c8r-convert-artifact-3676036261/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": "a48c8f3d-76b5-43e5-85bb-d8a9ca3f28ef", "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-workflowl4c8r/series-workflowl4c8r-build-action-3408902347/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-18 20:18:54 +0000 UTC FinishedAt: 2026-08-18 20:18:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-18 20:18:54 +0000 UTC FinishedAt: 2026-08-18 20:18:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-18 20:18:54 +0000 UTC FinishedAt: 2026-08-18 20:19:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-18 20:18:54 +0000 UTC FinishedAt: 2026-08-18 20:19:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflowl4c8r/series-workflowl4c8r-convert-artifact-4050066048/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-18 20:19:04 +0000 UTC FinishedAt: 2026-08-18 20:50:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-18 20:19:04 +0000 UTC FinishedAt: 2026-08-18 20:50:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a48c8f3d-76b5-43e5-85bb-d8a9ca3f28ef,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-workflowl4c8r/series-workflowl4c8r-build-action-3408902347/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": false },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-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[5] Phase: Failed StartedAt: 2026-08-18 20:50:12 +0000 UTC FinishedAt: 2026-08-18 20:50:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowl4c8r[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tipc_disc_rcv"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"d679c2e1e8d96f71f85e2ef3877407d264212cc3","config_name":"upstream-apparmor-kasan.config","enable_configs":["TIPC","TIPC_MEDIA_UDP"],"series_id":"627256da-e49e-4ef6-96ed-f76a8dd124a8","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Failed StartedAt: 2026-08-18 20:50:12 +0000 UTC FinishedAt: 2026-08-18 20:50:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}